SerializableAttributeEnum.h 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
  2. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  3. // SPDX-License-Identifier: MIT
  4. #pragma once
  5. #ifdef JPH_OBJECT_STREAM
  6. #include <Jolt/ObjectStream/SerializableAttribute.h>
  7. #include <Jolt/ObjectStream/ObjectStream.h>
  8. JPH_NAMESPACE_BEGIN
  9. //////////////////////////////////////////////////////////////////////////////////////////
  10. // Macros to add properties to be serialized
  11. //////////////////////////////////////////////////////////////////////////////////////////
  12. template <class MemberType>
  13. inline void AddSerializableAttributeEnum(RTTI &inRTTI, uint inOffset, const char *inName)
  14. {
  15. inRTTI.AddAttribute(SerializableAttribute(inName, inOffset,
  16. []() -> const RTTI *
  17. {
  18. return nullptr;
  19. },
  20. [](int inArrayDepth, EOSDataType inDataType, [[maybe_unused]] const char *inClassName)
  21. {
  22. return inArrayDepth == 0 && inDataType == EOSDataType::T_uint32;
  23. },
  24. [](IObjectStreamIn &ioStream, void *inObject)
  25. {
  26. uint32 temporary;
  27. if (OSReadData(ioStream, temporary))
  28. {
  29. *reinterpret_cast<MemberType *>(inObject) = static_cast<MemberType>(temporary);
  30. return true;
  31. }
  32. return false;
  33. },
  34. [](IObjectStreamOut &ioStream, const void *inObject)
  35. {
  36. static_assert(sizeof(MemberType) <= sizeof(uint32));
  37. uint32 temporary = uint32(*reinterpret_cast<const MemberType *>(inObject));
  38. OSWriteData(ioStream, temporary);
  39. },
  40. [](IObjectStreamOut &ioStream)
  41. {
  42. ioStream.WriteDataType(EOSDataType::T_uint32);
  43. }));
  44. }
  45. // JPH_ADD_ENUM_ATTRIBUTE_WITH_ALIAS
  46. #define JPH_ADD_ENUM_ATTRIBUTE_WITH_ALIAS(class_name, member_name, alias_name) \
  47. AddSerializableAttributeEnum<decltype(class_name::member_name)>(inRTTI, offsetof(class_name, member_name), alias_name);
  48. // JPH_ADD_ENUM_ATTRIBUTE
  49. #define JPH_ADD_ENUM_ATTRIBUTE(class_name, member_name) \
  50. JPH_ADD_ENUM_ATTRIBUTE_WITH_ALIAS(class_name, member_name, #member_name);
  51. JPH_NAMESPACE_END
  52. #else
  53. #define JPH_ADD_ENUM_ATTRIBUTE_WITH_ALIAS(...)
  54. #define JPH_ADD_ENUM_ATTRIBUTE(...)
  55. #endif // JPH_OBJECT_STREAM