SerializableAttributeTyped.h 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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/GetPrimitiveTypeOfType.h>
  8. #include <Jolt/ObjectStream/ObjectStream.h>
  9. JPH_NAMESPACE_BEGIN
  10. //////////////////////////////////////////////////////////////////////////////////////////
  11. // Macros to add properties to be serialized
  12. //////////////////////////////////////////////////////////////////////////////////////////
  13. template <class MemberType>
  14. inline void AddSerializableAttributeTyped(RTTI &inRTTI, uint inOffset, const char *inName)
  15. {
  16. inRTTI.AddAttribute(SerializableAttribute(inName, inOffset,
  17. []()
  18. {
  19. return GetPrimitiveTypeOfType((MemberType *)nullptr);
  20. },
  21. [](int inArrayDepth, EOSDataType inDataType, const char *inClassName)
  22. {
  23. return OSIsType((MemberType *)nullptr, inArrayDepth, inDataType, inClassName);
  24. },
  25. [](IObjectStreamIn &ioStream, void *inObject)
  26. {
  27. return OSReadData(ioStream, *reinterpret_cast<MemberType *>(inObject));
  28. },
  29. [](IObjectStreamOut &ioStream, const void *inObject)
  30. {
  31. OSWriteData(ioStream, *reinterpret_cast<const MemberType *>(inObject));
  32. },
  33. [](IObjectStreamOut &ioStream)
  34. {
  35. OSWriteDataType(ioStream, (MemberType *)nullptr);
  36. }));
  37. }
  38. // JPH_ADD_ATTRIBUTE
  39. #define JPH_ADD_ATTRIBUTE_WITH_ALIAS(class_name, member_name, alias_name) \
  40. AddSerializableAttributeTyped<decltype(class_name::member_name)>(inRTTI, offsetof(class_name, member_name), alias_name);
  41. // JPH_ADD_ATTRIBUTE
  42. #define JPH_ADD_ATTRIBUTE(class_name, member_name) \
  43. JPH_ADD_ATTRIBUTE_WITH_ALIAS(class_name, member_name, #member_name)
  44. JPH_NAMESPACE_END
  45. #else
  46. #define JPH_ADD_ATTRIBUTE_WITH_ALIAS(...)
  47. #define JPH_ADD_ATTRIBUTE(...)
  48. #endif // JPH_OBJECT_STREAM