SerializableAttributeEnum.h 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #pragma once
  4. #include <Jolt/ObjectStream/SerializableAttribute.h>
  5. JPH_NAMESPACE_BEGIN
  6. /// Contains an serialize attribute of type enum
  7. template <class Class, class T>
  8. class SerializableAttributeEnum : public SerializableAttribute
  9. {
  10. public:
  11. /// Constructor
  12. SerializableAttributeEnum(T Class::*inMember, const char *inName) : SerializableAttribute(inName), mMember(inMember) { }
  13. ///@name Serialization operations
  14. virtual const void * GetMemberPointer(const void *inObject) const override
  15. {
  16. return &(((const Class *)inObject)->*mMember);
  17. }
  18. virtual bool IsType(int inArrayDepth, ObjectStream::EDataType inDataType, const char *inClassName) const override
  19. {
  20. return (inArrayDepth == 0 && inDataType == ObjectStream::EDataType::T_uint32);
  21. }
  22. virtual bool ReadData(ObjectStreamIn &ioStream, void *inObject) const override
  23. {
  24. uint32 temporary;
  25. if (OSReadData(ioStream, temporary))
  26. {
  27. ((Class *)inObject)->*mMember = (T)temporary;
  28. return true;
  29. }
  30. return false;
  31. }
  32. virtual void WriteData(ObjectStreamOut &ioStream, const void *inObject) const override
  33. {
  34. static_assert(sizeof(T) <= sizeof(uint32));
  35. uint32 temporary = uint32(((const Class *)inObject)->*mMember);
  36. OSWriteData(ioStream, temporary);
  37. }
  38. virtual void WriteDataType(ObjectStreamOut &ioStream) const override
  39. {
  40. ioStream.WriteDataType(ObjectStream::EDataType::T_uint32);
  41. }
  42. virtual void VisitCompounds(const void *inObject, const CompoundVisitor &inVisitor) const override
  43. {
  44. // An enum is not a compound, do nothing
  45. }
  46. private:
  47. T Class::* mMember;
  48. };
  49. //////////////////////////////////////////////////////////////////////////////////////////
  50. // Macros to add properties to be serialized
  51. //////////////////////////////////////////////////////////////////////////////////////////
  52. template <class Class, class T>
  53. inline void AddSerializableAttributeEnum(RTTI &inRTTI, T Class::*inMember, const char *inName)
  54. {
  55. inRTTI.AddAttribute(new SerializableAttributeEnum<Class, T>(inMember, inName));
  56. }
  57. // JPH_ADD_ENUM_ATTRIBUTE
  58. #define JPH_ADD_ENUM_ATTRIBUTE(class_name, member_name) \
  59. AddSerializableAttributeEnum(inRTTI, &class_name::member_name, #member_name);
  60. JPH_NAMESPACE_END