14 #ifndef __IPSDKUTIL_DYNAMICSRCMACRO_H__ 15 #define __IPSDKUTIL_DYNAMICSRCMACRO_H__ 17 #include <IPSDKUtil/Dynamic/DynamicObjectFactory.h> 21 #include <boost/thread/lock_guard.hpp> 22 #include <boost/make_shared.hpp> 33 #define IPSDK_IMPLEMENT_DYNAMIC(namespaceSeq, className) \ 34 const std::string& className::getTypeName() { \ 35 boost::lock_guard<boost::mutex> lock(TypeNameMutex::get()); \ 36 static const std::string g_typeName( \ 37 IPSDK_FULL_CLASSNAME_STR(namespaceSeq, className)); \ 40 const std::string& className::getClassName() const { \ 41 return IPSDK_NAMESPACE_NAME(namespaceSeq)className::getTypeName(); \ 43 ipsdk::BaseDynamicObject* className::createNewObject() { \ 44 return new className(); \ 46 ipsdk::DynamicObjectPtr className::createSharedObject() { \ 47 return boost::make_shared<className>(); \ 49 ipsdk::BaseDynamicObject* className::createNew() const { \ 50 return new className(); \ 52 ipsdk::DynamicObjectPtr className::createShared() const { \ 53 return boost::make_shared<className>(); \ 57 struct DynamicRegistrator<className> { \ 58 static BaseDynamicObject* newCreatorFcn() { \ 59 return className::createNewObject(); \ 61 static DynamicObjectPtr sharedCreatorFcn() { \ 62 return className::createSharedObject(); \ 64 DynamicRegistrator() \ 66 DynamicObjectFactory& factory = DynamicObjectFactory::getInstance(); \ 67 factory.registerClass(IPSDK_FULL_CLASSNAME_STR(namespaceSeq, \ 69 newCreatorFcn, sharedCreatorFcn); \ 71 ~DynamicRegistrator() \ 73 DynamicObjectFactory& factory = DynamicObjectFactory::getInstance(); \ 74 factory.unRegisterClass(IPSDK_FULL_CLASSNAME_STR(namespaceSeq, \ 77 static DynamicRegistrator g_classRegistrator; \ 79 DynamicRegistrator<className> DynamicRegistrator<className>::g_classRegistrator; \ 84 #define IPSDK_IMPLEMENT_COPY_SUPPORT(className) \ 85 className::className(const className& object) { \ 86 if (this != &object) { \ 87 initCtorCopy(object); \ 91 className& className::operator= (const className& object) { \ 95 ipsdk::BaseDynamicObject* className::duplicate() const { \ 96 std::auto_ptr<className> pObject(new className()); \ 97 pObject->copy(*this); \ 98 return pObject.release(); \ 100 ipsdk::DynamicObjectPtr className::duplicateShared() const { \ 101 boost::shared_ptr<className> pObject(boost::make_shared<className>()); \ 102 pObject->copy(*this); \ 108 #define IPSDK_IMPLEMENT_DYNAMIC_WITH_COPY(namespaceSeq, className) \ 109 IPSDK_IMPLEMENT_COPY_SUPPORT(className) \ 110 IPSDK_IMPLEMENT_DYNAMIC(namespaceSeq, className) 114 #define IPSDK_IMPLEMENT_DYNAMIC_WITHOUT_COPY(namespaceSeq, className) \ 115 void className::copy(const ipsdk::BaseDynamicObject& object) { \ 116 IPSDKUTIL_THROW([ipsdk::eIPSDKUtilErrors::eCantCopyObject] % \ 117 className::getTypeName()); \ 119 ipsdk::BaseDynamicObject* className::duplicate() const { \ 120 IPSDKUTIL_THROW([ipsdk::eIPSDKUtilErrors::eCantCopyObject] % \ 121 className::getTypeName()); \ 124 ipsdk::DynamicObjectPtr className::duplicateShared() const { \ 125 IPSDKUTIL_THROW([ipsdk::eIPSDKUtilErrors::eCantCopyObject] % \ 126 className::getTypeName()); \ 127 return ipsdk::DynamicObjectPtr(); \ 129 IPSDK_IMPLEMENT_DYNAMIC(namespaceSeq, className) 136 #define IPSDK_IMPLEMENT_ABSTRACT_DYNAMIC(namespaceSeq, className) \ 137 const std::string& className::getTypeName() { \ 138 boost::lock_guard<boost::mutex> lock(TypeNameMutex::get()); \ 139 static const std::string g_typeName( \ 140 IPSDK_FULL_CLASSNAME_STR(namespaceSeq, className)); \ 143 const std::string& className::getClassName() const { \ 144 return className::getTypeName(); \ 149 #define IPSDK_IMPLEMENT_ABSTRACT_DYNAMIC_WITH_COPY(namespaceSeq, className) \ 150 IPSDK_IMPLEMENT_ABSTRACT_DYNAMIC(namespaceSeq, className) 154 #define IPSDK_IMPLEMENT_ABSTRACT_DYNAMIC_WITHOUT_COPY(namespaceSeq, className) \ 155 void className::copy(const ipsdk::BaseDynamicObject& object) { \ 156 IPSDKUTIL_THROW([ipsdk::eIPSDKUtilErrors::eCantCopyObject] % \ 157 className::getTypeName()); \ 159 ipsdk::BaseDynamicObject* className::duplicate() const { \ 160 IPSDKUTIL_THROW([ipsdk::eIPSDKUtilErrors::eCantCopyObject] % \ 161 className::getTypeName()); \ 164 ipsdk::DynamicObjectPtr className::duplicateShared() const { \ 165 IPSDKUTIL_THROW([ipsdk::eIPSDKUtilErrors::eCantCopyObject] % \ 166 className::getTypeName()); \ 167 return ipsdk::DynamicObjectPtr(); \ 169 IPSDK_IMPLEMENT_ABSTRACT_DYNAMIC(namespaceSeq, className) 176 #define IPSDK_IMPLEMENT_COPY(className, baseClassName) \ 177 void className::copy(const ipsdk::BaseDynamicObject& object) { \ 178 const className* pObject = static_cast<const className*>(&object); \ 179 baseClassName::copy(object); 184 #endif // __IPSDKUTIL_DYNAMICSRCMACRO_H__ Utility functions for dynamic objects copy.
Logger api for library IPSDKUtil.
Macros allowing to define a getter to a static mutex.
#define IPSDK_STATIC_MUTEX(MutexName)
macro allowing to create a static mutex
Definition: MutexMacros.h:27