SerializableAttributeEnum.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #pragma once
  4. #include <ObjectStream/SerializableAttribute.h>
  5. namespace JPH {
  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. }
  45. private:
  46. T Class::* mMember;
  47. };
  48. //////////////////////////////////////////////////////////////////////////////////////////
  49. // Macros to add properties to be serialized
  50. //////////////////////////////////////////////////////////////////////////////////////////
  51. template <class Class, class T>
  52. inline void AddSerializableAttributeEnum(RTTI &inRTTI, T Class::*inMember, const char *inName)
  53. {
  54. inRTTI.AddAttribute(new SerializableAttributeEnum<Class, T>(inMember, inName));
  55. }
  56. // JPH_ADD_ENUM_ATTRIBUTE
  57. #define JPH_ADD_ENUM_ATTRIBUTE(class_name, member_name) \
  58. AddSerializableAttributeEnum(inRTTI, &class_name::member_name, #member_name);
  59. } // JPH