SerializerReflection.h 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /*
  2. * SerializerReflection.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. VCMI_LIB_NAMESPACE_BEGIN
  12. class CGameInfoCallback;
  13. class Serializeable;
  14. class GameCallbackHolder;
  15. class BinaryDeserializer;
  16. class BinarySerializer;
  17. class GameCallbackHolder;
  18. template <typename T, typename Enable = void>
  19. struct ClassObjectCreator
  20. {
  21. static T *invoke(CGameInfoCallback *cb)
  22. {
  23. static_assert(!std::is_base_of_v<GameCallbackHolder, T>, "Cannot call new upon map objects!");
  24. static_assert(!std::is_abstract_v<T>, "Cannot call new upon abstract classes!");
  25. return new T();
  26. }
  27. };
  28. template<typename T>
  29. struct ClassObjectCreator<T, typename std::enable_if_t<std::is_base_of_v<GameCallbackHolder, T>>>
  30. {
  31. static T *invoke(CGameInfoCallback *cb)
  32. {
  33. static_assert(!std::is_abstract_v<T>, "Cannot call new upon abstract classes!");
  34. return new T(cb);
  35. }
  36. };
  37. class ISerializerReflection
  38. {
  39. public:
  40. virtual Serializeable * createPtr(BinaryDeserializer &ar, CGameInfoCallback * cb) const =0;
  41. virtual void loadPtr(BinaryDeserializer &ar, CGameInfoCallback * cb, Serializeable * data) const =0;
  42. virtual void savePtr(BinarySerializer &ar, const Serializeable *data) const =0;
  43. virtual ~ISerializerReflection() = default;
  44. };
  45. class DLL_LINKAGE CSerializationApplier : boost::noncopyable
  46. {
  47. std::map<int32_t, std::unique_ptr<ISerializerReflection>> apps;
  48. CSerializationApplier();
  49. public:
  50. ISerializerReflection * getApplier(uint16_t ID)
  51. {
  52. if(!apps.count(ID))
  53. throw std::runtime_error("No applier found.");
  54. return apps[ID].get();
  55. }
  56. template<typename Type>
  57. void registerType(uint16_t index);
  58. static CSerializationApplier & getInstance();
  59. };
  60. VCMI_LIB_NAMESPACE_END