00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef VRS_SERIALIZATIONMACROS_H
00019 #define VRS_SERIALIZATIONMACROS_H
00020
00021 #include <vrs/config.h>
00022
00023 namespace VRS {
00024
00025 class SharedObj;
00026 class SerializationManager;
00027
00028
00029
00030 #define VRS_SERIALIZABLE(SO_CLASS) \
00031 static ::VRS::SharedObj* newInstance() { return new SO_CLASS; } \
00032 virtual void serialize(::VRS::SerializationManager& manager); \
00033 virtual bool isRegisteredForSerialization() const { return isRegisteredForSerialization_; } \
00034 static const bool isRegisteredForSerialization_;
00035
00036
00037
00038 #define VRS_SERIALIZABLE_ABSTRACT_CLASS(ABSTRACT_SO_CLASS) \
00039 virtual void serialize(::VRS::SerializationManager& manager);
00040
00041
00042
00043 #define VRS_SERIALIZABLE_NO_SO_CLASS(NO_SO_CLASS) \
00044 void serialize(::VRS::SerializationManager& manager); \
00045 friend void \
00046 serialization( \
00047 ::VRS::SerializationManager& manager, \
00048 const std::string& attributeName, \
00049 NO_SO_CLASS& object \
00050 ) { \
00051 VRS_SERIALIZATION_START_CLASS(manager, attributeName, object); \
00052 object.serialize(manager); \
00053 VRS_SERIALIZATION_END_CLASS(manager, attributeName, object); \
00054 }
00055
00056
00057
00058 #define VRS_SERIALIZABLE_ENUM(ENUM) \
00059 inline void \
00060 serialization( \
00061 ::VRS::SerializationManager& manager, \
00062 const std::string& attributeName, \
00063 ENUM& attributeValue \
00064 ) { \
00065 serialization(manager, attributeName, reinterpret_cast<int&>(attributeValue)); \
00066 }
00067
00068
00069
00070 #define VRS_SERIALIZABLE_CLASS_ENUM(ENUM) \
00071 friend inline void \
00072 serialization( \
00073 ::VRS::SerializationManager& manager, \
00074 const std::string& attributeName, \
00075 ENUM& attributeValue \
00076 ) { \
00077 serialization(manager, attributeName, reinterpret_cast<int&>(attributeValue)); \
00078 }
00079
00080
00081 #define VRS_SERIALIZATION_REGISTRATION(A) \
00082 const bool A::isRegisteredForSerialization_ = \
00083 ::VRS::SerializationManager::registerClass(A::ClassNameVRS(), A::newInstance);
00084
00085 #define VRS_SERIALIZATION_REGISTRATION_TEMPLATE(A) \
00086 template<class T> \
00087 const bool A<T>::isRegisteredForSerialization_ = \
00088 ::VRS::SerializationManager::registerClass(A<T>::ClassNameVRS(), A<T>::newInstance);
00089
00090 #define VRS_SERIALIZATION_REGISTRATION_TEMPLATE_2(A) \
00091 template<class T1, class T2> \
00092 const bool A<T1, T2>::isRegisteredForSerialization_ = \
00093 ::VRS::SerializationManager::registerClass(A<T1, T2>::ClassNameVRS(), A<T1, T2>::newInstance);
00094
00095 #define VRS_SERIALIZATION_REGISTRATION_TEMPLATE_3(A) \
00096 template<class T1, class T2, class T3> \
00097 const bool A<T1, T2, T3>::isRegisteredForSerialization_ = \
00098 ::VRS::SerializationManager::registerClass(A<T1, T2, T3>::ClassNameVRS(), A<T1, T2, T3>::newInstance);
00099
00100 #define VRS_SERIALIZATION_REGISTRATION_TEMPLATE_4(A) \
00101 template<class T1, class T2, class T3, class T4> \
00102 const bool A<T1, T2, T3, T4>::isRegisteredForSerialization_ = \
00103 ::VRS::SerializationManager::registerClass(A<T1, T2, T3, T4>::ClassNameVRS(), A<T1, T2, T3, T4>::newInstance);
00104
00105 #define VRS_SERIALIZATION_REGISTRATION_TEMPLATE_5(A) \
00106 template<class T1, class T2, class T3, class T4, class T5> \
00107 const bool A<T1, T2, T3, T4, T5>::isRegisteredForSerialization_ = \
00108 ::VRS::SerializationManager::registerClass(A<T1, T2, T3, T4, T5>::ClassNameVRS(), A<T1, T2, T3, T4, T5>::newInstance);
00109
00110 #define VRS_SERIALIZATION_PARENT_CLASS(MANAGER, PARENT) \
00111 MANAGER.startParentClass(typeid(PARENT).name()); \
00112 if(MANAGER.isReading() || MANAGER.isWriting()) { \
00113 PARENT::serialize(MANAGER); \
00114 } else { \
00115 static const VRS::ID classID = VRS::ID(typeid(PARENT).name()); \
00116 if(MANAGER.isRegistered(classID) || (classID == typeid(::VRS::SharedObj).name()) ) { \
00117 MANAGER.serializeParent(classID.text()); \
00118 } else { \
00119 PARENT::serialize(MANAGER); \
00120 } \
00121 } \
00122 MANAGER.endParentClass(typeid(PARENT).name());
00123
00124 #define VRS_SERIALIZATION_START_CLASS(MANAGER, ATTRIBUTE_NAME, OBJECT) \
00125 MANAGER.startClass(typeid(OBJECT).name(), ATTRIBUTE_NAME)
00126
00127 #define VRS_SERIALIZATION_END_CLASS(MANAGER, ATTRIBUTE_NAME, OBJECT) \
00128 MANAGER.endClass(typeid(OBJECT).name(), ATTRIBUTE_NAME)
00129
00130 }
00131
00132 #endif // VRS_SERIALIZATIONMACROS_H