CSerializer.h 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. /*
  2. * CSerializer.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 "../GameConstants.h"
  12. VCMI_LIB_NAMESPACE_BEGIN
  13. const std::string SAVEGAME_MAGIC = "VCMISVG";
  14. class CHero;
  15. class CGHeroInstance;
  16. class CGObjectInstance;
  17. class CGameState;
  18. class GameLibrary;
  19. extern DLL_LINKAGE GameLibrary * LIBRARY;
  20. /// Base class for serializers capable of reading or writing data
  21. class DLL_LINKAGE CSerializer : boost::noncopyable
  22. {
  23. public:
  24. virtual ~CSerializer() = default;
  25. virtual void reportState(vstd::CLoggerBase * out){};
  26. };
  27. /// Helper to detect classes with user-provided serialize(S&, int version) method
  28. template<class S, class T>
  29. struct is_serializeable
  30. {
  31. using Yes = char (&)[1];
  32. using No = char (&)[2];
  33. template<class U>
  34. static Yes test(U * data, S* arg1 = nullptr, typename std::enable_if_t<std::is_void_v<decltype(data->serialize(*arg1))>> * = nullptr);
  35. static No test(...);
  36. static const bool value = sizeof(Yes) == sizeof(is_serializeable::test((typename std::remove_reference_t<typename std::remove_cv_t<T>>*)nullptr));
  37. };
  38. /// Base class for deserializers
  39. class DLL_LINKAGE IBinaryReader : public virtual CSerializer
  40. {
  41. public:
  42. virtual int read(std::byte * data, unsigned size) = 0;
  43. };
  44. /// Base class for serializers
  45. class DLL_LINKAGE IBinaryWriter : public virtual CSerializer
  46. {
  47. public:
  48. virtual int write(const std::byte * data, unsigned size) = 0;
  49. };
  50. VCMI_LIB_NAMESPACE_END