SerializerReflection.cpp 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /*
  2. * SerializerReflection.cpp, 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. #include "StdInc.h"
  11. #include "SerializerReflection.h"
  12. #include "BinaryDeserializer.h"
  13. #include "BinarySerializer.h"
  14. #include "RegisterTypes.h"
  15. VCMI_LIB_NAMESPACE_BEGIN
  16. template<typename Type>
  17. class SerializerReflection final : public ISerializerReflection
  18. {
  19. public:
  20. Serializeable * createPtr(BinaryDeserializer &ar, IGameCallback * cb) const override
  21. {
  22. return ClassObjectCreator<Type>::invoke(cb);
  23. }
  24. void loadPtr(BinaryDeserializer &ar, IGameCallback * cb, Serializeable * data) const override
  25. {
  26. auto * realPtr = dynamic_cast<Type *>(data);
  27. realPtr->serialize(ar);
  28. }
  29. void savePtr(BinarySerializer &s, const Serializeable *data) const override
  30. {
  31. const Type *ptr = dynamic_cast<const Type*>(data);
  32. const_cast<Type*>(ptr)->serialize(s);
  33. }
  34. };
  35. template<typename Type, ESerializationVersion maxVersion>
  36. class SerializerCompatibility : public ISerializerReflection
  37. {
  38. public:
  39. Serializeable * createPtr(BinaryDeserializer &ar, IGameCallback * cb) const override
  40. {
  41. return ClassObjectCreator<Type>::invoke(cb);
  42. }
  43. void savePtr(BinarySerializer &s, const Serializeable *data) const override
  44. {
  45. throw std::runtime_error("Illegal call to savePtr - this type should not be used for serialization!");
  46. }
  47. };
  48. class SerializerCompatibilityBonusingBuilding final : public SerializerCompatibility<TownRewardableBuildingInstance, ESerializationVersion::NEW_TOWN_BUILDINGS>
  49. {
  50. void loadPtr(BinaryDeserializer &ar, IGameCallback * cb, Serializeable * data) const override
  51. {
  52. auto * realPtr = dynamic_cast<TownRewardableBuildingInstance *>(data);
  53. realPtr->serialize(ar);
  54. }
  55. };
  56. class SerializerCompatibilityArtifactsAltar final : public SerializerCompatibility<CGMarket, ESerializationVersion::NEW_MARKETS>
  57. {
  58. void loadPtr(BinaryDeserializer &ar, IGameCallback * cb, Serializeable * data) const override
  59. {
  60. auto * realPtr = dynamic_cast<CGMarket *>(data);
  61. realPtr->serializeArtifactsAltar(ar);
  62. }
  63. };
  64. template<typename Type>
  65. void CSerializationApplier::registerType(uint16_t ID)
  66. {
  67. assert(!apps.count(ID));
  68. apps[ID].reset(new SerializerReflection<Type>);
  69. }
  70. CSerializationApplier::CSerializationApplier()
  71. {
  72. registerTypes(*this);
  73. apps[54].reset(new SerializerCompatibilityBonusingBuilding);
  74. apps[55].reset(new SerializerCompatibilityBonusingBuilding);
  75. apps[81].reset(new SerializerCompatibilityArtifactsAltar);
  76. }
  77. CSerializationApplier & CSerializationApplier::getInstance()
  78. {
  79. static CSerializationApplier registry;
  80. return registry;
  81. }
  82. VCMI_LIB_NAMESPACE_END