SerializableAttributeTyped.h 1.5 KB

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