JsonTreeSerializer.h 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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. {
  28. }
  29. void pop() override
  30. {
  31. assert(!treeRoute.empty());
  32. currentObject = treeRoute.back();
  33. treeRoute.pop_back();
  34. }
  35. void pushStruct(const std::string & fieldName) override
  36. {
  37. pushObject(fieldName);
  38. }
  39. void pushArray(const std::string & fieldName) override
  40. {
  41. pushObject(fieldName);
  42. }
  43. void pushArrayElement(const size_t index) override
  44. {
  45. pushObject(&(currentObject->Vector().at(index)));
  46. }
  47. void pushField(const std::string & fieldName) override
  48. {
  49. pushObject(fieldName);
  50. }
  51. private:
  52. void pushObject(const std::string & fieldName)
  53. {
  54. pushObject(&(currentObject->operator[](fieldName)));
  55. }
  56. void pushObject(T newCurrentObject)
  57. {
  58. treeRoute.push_back(currentObject);
  59. currentObject = newCurrentObject;
  60. }
  61. };
  62. VCMI_LIB_NAMESPACE_END