Path: blob/master/thirdparty/jolt_physics/Jolt/ObjectStream/SerializableObject.h
9913 views
// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)1// SPDX-FileCopyrightText: 2021 Jorrit Rouwe2// SPDX-License-Identifier: MIT34#pragma once56#include <Jolt/ObjectStream/ObjectStream.h>78JPH_NAMESPACE_BEGIN910//////////////////////////////////////////////////////////////////////////////////////////11// Helper macros12//////////////////////////////////////////////////////////////////////////////////////////1314#ifdef JPH_OBJECT_STREAM1516// JPH_DECLARE_SERIALIZATION_FUNCTIONS17#define JPH_DECLARE_SERIALIZATION_FUNCTIONS(linkage, prefix, class_name) \18linkage prefix bool OSReadData(IObjectStreamIn &ioStream, class_name &inInstance); \19linkage prefix bool OSReadData(IObjectStreamIn &ioStream, class_name *&inPointer); \20linkage prefix bool OSIsType(class_name *, int inArrayDepth, EOSDataType inDataType, const char *inClassName); \21linkage prefix bool OSIsType(class_name **, int inArrayDepth, EOSDataType inDataType, const char *inClassName); \22linkage prefix void OSWriteData(IObjectStreamOut &ioStream, const class_name &inInstance); \23linkage prefix void OSWriteData(IObjectStreamOut &ioStream, class_name *const &inPointer); \24linkage prefix void OSWriteDataType(IObjectStreamOut &ioStream, class_name *); \25linkage prefix void OSWriteDataType(IObjectStreamOut &ioStream, class_name **);2627// JPH_IMPLEMENT_SERIALIZATION_FUNCTIONS28#define JPH_IMPLEMENT_SERIALIZATION_FUNCTIONS(class_name) \29bool OSReadData(IObjectStreamIn &ioStream, class_name &inInstance) \30{ \31return ioStream.ReadClassData(#class_name, (void *)&inInstance); \32} \33bool OSReadData(IObjectStreamIn &ioStream, class_name *&inPointer) \34{ \35return ioStream.ReadPointerData(JPH_RTTI(class_name), (void **)&inPointer); \36} \37bool OSIsType(class_name *, int inArrayDepth, EOSDataType inDataType, const char *inClassName) \38{ \39return inArrayDepth == 0 && inDataType == EOSDataType::Instance && strcmp(inClassName, #class_name) == 0; \40} \41bool OSIsType(class_name **, int inArrayDepth, EOSDataType inDataType, const char *inClassName) \42{ \43return inArrayDepth == 0 && inDataType == EOSDataType::Pointer && strcmp(inClassName, #class_name) == 0; \44} \45void OSWriteData(IObjectStreamOut &ioStream, const class_name &inInstance) \46{ \47ioStream.WriteClassData(JPH_RTTI(class_name), (void *)&inInstance); \48} \49void OSWriteData(IObjectStreamOut &ioStream, class_name *const &inPointer) \50{ \51if (inPointer) \52ioStream.WritePointerData(GetRTTI(inPointer), (void *)inPointer); \53else \54ioStream.WritePointerData(nullptr, nullptr); \55} \56void OSWriteDataType(IObjectStreamOut &ioStream, class_name *) \57{ \58ioStream.WriteDataType(EOSDataType::Instance); \59ioStream.WriteName(#class_name); \60} \61void OSWriteDataType(IObjectStreamOut &ioStream, class_name **) \62{ \63ioStream.WriteDataType(EOSDataType::Pointer); \64ioStream.WriteName(#class_name); \65}6667#else6869#define JPH_DECLARE_SERIALIZATION_FUNCTIONS(...)70#define JPH_IMPLEMENT_SERIALIZATION_FUNCTIONS(...)7172#endif // JPH_OBJECT_STREAM7374//////////////////////////////////////////////////////////////////////////////////////////75// Use these macros on non-virtual objects to make them serializable76//////////////////////////////////////////////////////////////////////////////////////////7778// JPH_DECLARE_SERIALIZABLE_NON_VIRTUAL79#define JPH_DECLARE_SERIALIZABLE_NON_VIRTUAL(linkage, class_name) \80public: \81JPH_DECLARE_RTTI_NON_VIRTUAL(linkage, class_name) \82JPH_DECLARE_SERIALIZATION_FUNCTIONS(linkage, friend, class_name) \8384// JPH_IMPLEMENT_SERIALIZABLE_NON_VIRTUAL85#define JPH_IMPLEMENT_SERIALIZABLE_NON_VIRTUAL(class_name) \86JPH_IMPLEMENT_SERIALIZATION_FUNCTIONS(class_name) \87JPH_IMPLEMENT_RTTI_NON_VIRTUAL(class_name) \8889//////////////////////////////////////////////////////////////////////////////////////////90// Same as above, but when you cannot insert the declaration in the class itself91//////////////////////////////////////////////////////////////////////////////////////////9293// JPH_DECLARE_SERIALIZABLE_OUTSIDE_CLASS94#define JPH_DECLARE_SERIALIZABLE_OUTSIDE_CLASS(linkage, class_name) \95JPH_DECLARE_RTTI_OUTSIDE_CLASS(linkage, class_name) \96JPH_DECLARE_SERIALIZATION_FUNCTIONS(linkage, extern, class_name) \9798// JPH_IMPLEMENT_SERIALIZABLE_OUTSIDE_CLASS99#define JPH_IMPLEMENT_SERIALIZABLE_OUTSIDE_CLASS(class_name) \100JPH_IMPLEMENT_SERIALIZATION_FUNCTIONS(class_name) \101JPH_IMPLEMENT_RTTI_OUTSIDE_CLASS(class_name) \102103//////////////////////////////////////////////////////////////////////////////////////////104// Same as above, but for classes that have virtual functions105//////////////////////////////////////////////////////////////////////////////////////////106107// JPH_DECLARE_SERIALIZABLE_VIRTUAL - Use for concrete, non-base classes108#define JPH_DECLARE_SERIALIZABLE_VIRTUAL(linkage, class_name) \109public: \110JPH_DECLARE_RTTI_VIRTUAL(linkage, class_name) \111JPH_DECLARE_SERIALIZATION_FUNCTIONS(linkage, friend, class_name) \112113// JPH_IMPLEMENT_SERIALIZABLE_VIRTUAL114#define JPH_IMPLEMENT_SERIALIZABLE_VIRTUAL(class_name) \115JPH_IMPLEMENT_SERIALIZATION_FUNCTIONS(class_name) \116JPH_IMPLEMENT_RTTI_VIRTUAL(class_name) \117118// JPH_DECLARE_SERIALIZABLE_ABSTRACT - Use for abstract, non-base classes119#define JPH_DECLARE_SERIALIZABLE_ABSTRACT(linkage, class_name) \120public: \121JPH_DECLARE_RTTI_ABSTRACT(linkage, class_name) \122JPH_DECLARE_SERIALIZATION_FUNCTIONS(linkage, friend, class_name) \123124// JPH_IMPLEMENT_SERIALIZABLE_ABSTRACT125#define JPH_IMPLEMENT_SERIALIZABLE_ABSTRACT(class_name) \126JPH_IMPLEMENT_SERIALIZATION_FUNCTIONS(class_name) \127JPH_IMPLEMENT_RTTI_ABSTRACT(class_name) \128129// JPH_DECLARE_SERIALIZABLE_VIRTUAL_BASE - Use for concrete base classes130#define JPH_DECLARE_SERIALIZABLE_VIRTUAL_BASE(linkage, class_name) \131public: \132JPH_DECLARE_RTTI_VIRTUAL_BASE(linkage, class_name) \133JPH_DECLARE_SERIALIZATION_FUNCTIONS(linkage, friend, class_name) \134135// JPH_IMPLEMENT_SERIALIZABLE_VIRTUAL_BASE136#define JPH_IMPLEMENT_SERIALIZABLE_VIRTUAL_BASE(class_name) \137JPH_IMPLEMENT_SERIALIZATION_FUNCTIONS(class_name) \138JPH_IMPLEMENT_RTTI_VIRTUAL_BASE(class_name) \139140// JPH_DECLARE_SERIALIZABLE_ABSTRACT_BASE - Use for abstract base class141#define JPH_DECLARE_SERIALIZABLE_ABSTRACT_BASE(linkage, class_name) \142public: \143JPH_DECLARE_RTTI_ABSTRACT_BASE(linkage, class_name) \144JPH_DECLARE_SERIALIZATION_FUNCTIONS(linkage, friend, class_name) \145146// JPH_IMPLEMENT_SERIALIZABLE_ABSTRACT_BASE147#define JPH_IMPLEMENT_SERIALIZABLE_ABSTRACT_BASE(class_name) \148JPH_IMPLEMENT_SERIALIZATION_FUNCTIONS(class_name) \149JPH_IMPLEMENT_RTTI_ABSTRACT_BASE(class_name)150151/// Classes must be derived from SerializableObject if you want to be able to save pointers or152/// reference counting pointers to objects of this or derived classes. The type will automatically153/// be determined during serialization and upon deserialization it will be restored correctly.154class JPH_EXPORT SerializableObject : public NonCopyable155{156JPH_DECLARE_SERIALIZABLE_ABSTRACT_BASE(JPH_EXPORT, SerializableObject)157158public:159/// Constructor160virtual ~SerializableObject() = default;161};162163JPH_NAMESPACE_END164165166