SerializableAttributeTyped.h 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #pragma once
  4. #include <Jolt/ObjectStream/SerializableAttribute.h>
  5. #include <Jolt/ObjectStream/GetPrimitiveTypeOfType.h>
  6. JPH_NAMESPACE_BEGIN
  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. private:
  40. T Class::* mMember;
  41. };
  42. //////////////////////////////////////////////////////////////////////////////////////////
  43. // Macros to add properties to be serialized
  44. //////////////////////////////////////////////////////////////////////////////////////////
  45. template <class Class, class T>
  46. inline void AddSerializableAttributeTyped(RTTI &inRTTI, T Class::*inMember, const char *inName)
  47. {
  48. inRTTI.AddAttribute(new SerializableAttributeTyped<Class, T>(inMember, inName));
  49. }
  50. // JPH_ADD_ATTRIBUTE
  51. #define JPH_ADD_ATTRIBUTE(class_name, member_name) \
  52. AddSerializableAttributeTyped(inRTTI, &class_name::member_name, #member_name);
  53. JPH_NAMESPACE_END