SerializableAttributeTyped.h 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #pragma once
  4. #include <ObjectStream/SerializableAttribute.h>
  5. #include <ObjectStream/GetPrimitiveTypeOfType.h>
  6. namespace JPH {
  7. /// Contains a serializable attribute of any type (except enum)
  8. template <class Class, class T>
  9. class SerializableAttributeTyped : public SerializableAttribute
  10. {
  11. public:
  12. /// Constructor
  13. SerializableAttributeTyped(T Class::*inMember, const char *inName) : SerializableAttribute(inName), mMember(inMember) { }
  14. ///@name Serialization operations
  15. virtual const RTTI * GetMemberPrimitiveType() const override
  16. {
  17. return GetPrimitiveTypeOfType((T *)nullptr);
  18. }
  19. virtual const void * GetMemberPointer(const void *inObject) const override
  20. {
  21. return &(((const Class *)inObject)->*mMember);
  22. }
  23. virtual bool IsType(int inArrayDepth, ObjectStream::EDataType inDataType, const char *inClassName) const override
  24. {
  25. return OSIsType((T *)nullptr, inArrayDepth, inDataType, inClassName);
  26. }
  27. virtual bool ReadData(ObjectStreamIn &ioStream, void *inObject) const override
  28. {
  29. return OSReadData(ioStream, ((Class *)inObject)->*mMember);
  30. }
  31. virtual void WriteData(ObjectStreamOut &ioStream, const void *inObject) const override
  32. {
  33. OSWriteData(ioStream, ((const Class *)inObject)->*mMember);
  34. }
  35. virtual void WriteDataType(ObjectStreamOut &ioStream) const override
  36. {
  37. OSWriteDataType(ioStream, (T *)nullptr);
  38. }
  39. virtual void VisitCompounds(const void *inObject, const CompoundVisitor &inVisitor) const override
  40. {
  41. OSVisitCompounds(((const Class *)inObject)->*mMember, inVisitor);
  42. }
  43. private:
  44. T Class::* mMember;
  45. };
  46. //////////////////////////////////////////////////////////////////////////////////////////
  47. // Macros to add properties to be serialized
  48. //////////////////////////////////////////////////////////////////////////////////////////
  49. template <class Class, class T>
  50. inline void AddSerializableAttributeTyped(RTTI &inRTTI, T Class::*inMember, const char *inName)
  51. {
  52. inRTTI.AddAttribute(new SerializableAttributeTyped<Class, T>(inMember, inName));
  53. }
  54. // JPH_ADD_ATTRIBUTE
  55. #define JPH_ADD_ATTRIBUTE(class_name, member_name) \
  56. AddSerializableAttributeTyped(inRTTI, &class_name::member_name, #member_name);
  57. } // JPH