JsonTreeSerializer.h 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /*
  2. * JsonTreeSerializer.h, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #pragma once
  11. #include "JsonSerializeFormat.h"
  12. VCMI_LIB_NAMESPACE_BEGIN
  13. template <typename T>
  14. class JsonTreeSerializer : public JsonSerializeFormat
  15. {
  16. public:
  17. const JsonNode & getCurrent() override
  18. {
  19. return * currentObject;
  20. }
  21. protected:
  22. T currentObject;
  23. std::vector<T> treeRoute;
  24. JsonTreeSerializer(const IInstanceResolver * instanceResolver_, T root, const bool saving_, const bool updating_)
  25. : JsonSerializeFormat(instanceResolver_, saving_, updating_),
  26. currentObject(root),
  27. treeRoute()
  28. {
  29. }
  30. void pop() override
  31. {
  32. assert(!treeRoute.empty());
  33. currentObject = treeRoute.back();
  34. treeRoute.pop_back();
  35. }
  36. void pushStruct(const std::string & fieldName) override
  37. {
  38. pushObject(fieldName);
  39. }
  40. void pushArray(const std::string & fieldName) override
  41. {
  42. pushObject(fieldName);
  43. }
  44. void pushArrayElement(const size_t index) override
  45. {
  46. pushObject(&(currentObject->Vector().at(index)));
  47. }
  48. void pushField(const std::string & fieldName) override
  49. {
  50. pushObject(fieldName);
  51. }
  52. private:
  53. void pushObject(const std::string & fieldName)
  54. {
  55. pushObject(&(currentObject->operator[](fieldName)));
  56. }
  57. void pushObject(T newCurrentObject)
  58. {
  59. treeRoute.push_back(currentObject);
  60. currentObject = newCurrentObject;
  61. }
  62. };
  63. VCMI_LIB_NAMESPACE_END