14 #ifndef __IPSDKUTIL_DYNAMICTEMPLATESRCMACRO_H__ 15 #define __IPSDKUTIL_DYNAMICTEMPLATESRCMACRO_H__ 20 #include <boost/preprocessor/seq.hpp> 21 #include <boost/preprocessor/stringize.hpp> 22 #include <boost/thread/lock_guard.hpp> 23 #include <boost/make_shared.hpp> 31 #define IPSDK_TEMPLATE_CLASSID_MACRO_TRUE(state, type) \ 32 state ", " BOOST_PP_STRINGIZE(type) 36 #define IPSDK_TEMPLATE_CLASSID_MACRO_FALSE(state, type) \ 37 state BOOST_PP_STRINGIZE(type) 41 #define IPSDK_TEMPLATE_CLASSID_MACRO(s, state, type) \ 42 BOOST_PP_IF(BOOST_PP_SUB(s, 2), \ 43 IPSDK_TEMPLATE_CLASSID_MACRO_TRUE, \ 44 IPSDK_TEMPLATE_CLASSID_MACRO_FALSE)(state, type) 48 #define IPSDK_TEMPLATE_CLASSID(className, seqT) \ 49 BOOST_PP_SEQ_FOLD_LEFT(IPSDK_TEMPLATE_CLASSID_MACRO, \ 50 BOOST_PP_STRINGIZE(className) "<", \ 59 #define IPSDK_IMPLEMENT_TEMPLATE_DYNAMIC(className, seqT) \ 60 IPSDK_TEMPLATE_PARAMS(seqT) \ 61 static ipsdk::BaseDynamicObject* className##NewCreatorFcn() { \ 62 return new className<IPSDK_TEMPLATE_ARGS(seqT)>(); \ 64 IPSDK_TEMPLATE_PARAMS(seqT) \ 65 static ipsdk::DynamicObjectPtr className##SharedCreatorFcn() { \ 66 return boost::make_shared<className<IPSDK_TEMPLATE_ARGS(seqT)> >(); \ 68 IPSDK_TEMPLATE_PARAMS(seqT) \ 69 struct className##DynamicRegistrator { \ 70 className##DynamicRegistrator(); \ 71 ~className##DynamicRegistrator(); \ 72 static className##DynamicRegistrator g_classRegistrator; \ 77 #define IPSDK_IMPLEMENT_ABSTRACT_TEMPLATE_DYNAMIC(className, seqT) 81 #define IPSDK_IMPLEMENT_TEMPLATE_COPY_SUPPORT(className, seqT) \ 82 IPSDK_TEMPLATE_PARAMS(seqT) \ 83 className<IPSDK_TEMPLATE_ARGS(seqT)>::className(const className<IPSDK_TEMPLATE_ARGS(seqT)>& object) { \ 84 if (this != &object) { \ 85 this->initCtorCopy(object); \ 89 IPSDK_TEMPLATE_PARAMS(seqT) \ 90 className<IPSDK_TEMPLATE_ARGS(seqT)>& \ 91 className<IPSDK_TEMPLATE_ARGS(seqT)>::operator= (const className<IPSDK_TEMPLATE_ARGS(seqT)>& object) { \ 95 IPSDK_TEMPLATE_PARAMS(seqT) \ 96 ipsdk::BaseDynamicObject* className<IPSDK_TEMPLATE_ARGS(seqT)>::duplicate() const { \ 97 std::auto_ptr<className> pObject; \ 98 pObject.reset(static_cast<className*>(createNew())); \ 99 pObject->copy(*this); \ 100 return pObject.release(); \ 102 IPSDK_TEMPLATE_PARAMS(seqT) \ 103 ipsdk::DynamicObjectPtr className<IPSDK_TEMPLATE_ARGS(seqT)>::duplicateShared() const { \ 104 boost::shared_ptr<className> pObject(boost::make_shared<className>()); \ 105 pObject->copy(*this); \ 111 #define IPSDK_IMPLEMENT_TEMPLATE_DYNAMIC_WITH_COPY(className, seqT) \ 112 IPSDK_IMPLEMENT_TEMPLATE_COPY_SUPPORT(className, seqT) \ 113 IPSDK_IMPLEMENT_TEMPLATE_DYNAMIC(className, seqT) 117 #define IPSDK_IMPLEMENT_TEMPLATE_DYNAMIC_WITHOUT_COPY(className, seqT) \ 118 IPSDK_TEMPLATE_PARAMS(seqT) \ 119 void className<IPSDK_TEMPLATE_ARGS(seqT)>::copy(const ipsdk::BaseDynamicObject& object) { \ 120 IPSDKUTIL_THROW([ipsdk::eIPSDKUtilErrors::eCantCopyObject] % \ 121 (className<IPSDK_TEMPLATE_ARGS(seqT)>::getTypeName())); \ 123 IPSDK_TEMPLATE_PARAMS(seqT) \ 124 ipsdk::BaseDynamicObject* className<IPSDK_TEMPLATE_ARGS(seqT)>::duplicate() const { \ 125 IPSDKUTIL_THROW([ipsdk::eIPSDKUtilErrors::eCantCopyObject] % \ 126 (className<IPSDK_TEMPLATE_ARGS(seqT)>::getTypeName())); \ 129 IPSDK_TEMPLATE_PARAMS(seqT) \ 130 ipsdk::DynamicObjectPtr className<IPSDK_TEMPLATE_ARGS(seqT)>::duplicateShared() const { \ 131 IPSDKUTIL_THROW([ipsdk::eIPSDKUtilErrors::eCantCopyObject] % \ 132 (className<IPSDK_TEMPLATE_ARGS(seqT)>::getTypeName())); \ 133 return ipsdk::DynamicObjectPtr(); \ 135 IPSDK_IMPLEMENT_TEMPLATE_DYNAMIC(className, seqT) 139 #define IPSDK_IMPLEMENT_ABSTRACT_TEMPLATE_DYNAMIC_WITH_COPY(className, seqT) \ 140 IPSDK_IMPLEMENT_ABSTRACT_TEMPLATE_DYNAMIC(className, seqT) 144 #define IPSDK_IMPLEMENT_ABSTRACT_TEMPLATE_DYNAMIC_WITHOUT_COPY(className, seqT) \ 145 IPSDK_TEMPLATE_PARAMS(seqT) \ 146 void className<IPSDK_TEMPLATE_ARGS(seqT)>::copy(const ipsdk::BaseDynamicObject& object) { \ 147 IPSDKUTIL_THROW([ipsdk::eIPSDKUtilErrors::eCantCopyObject] % \ 148 (className<IPSDK_TEMPLATE_ARGS(seqT)>::getTypeName())); \ 150 IPSDK_TEMPLATE_PARAMS(seqT) \ 151 ipsdk::BaseDynamicObject* className<IPSDK_TEMPLATE_ARGS(seqT)>::duplicate() const { \ 152 IPSDKUTIL_THROW([ipsdk::eIPSDKUtilErrors::eCantCopyObject] % \ 153 (className<IPSDK_TEMPLATE_ARGS(seqT)>::getTypeName())); \ 156 IPSDK_TEMPLATE_PARAMS(seqT) \ 157 ipsdk::DynamicObjectPtr className<IPSDK_TEMPLATE_ARGS(seqT)>::duplicateShared() const { \ 158 IPSDKUTIL_THROW([ipsdk::eIPSDKUtilErrors::eCantCopyObject] % \ 159 (className<IPSDK_TEMPLATE_ARGS(seqT)>::getTypeName())); \ 160 return ipsdk::DynamicObjectPtr(); \ 162 IPSDK_IMPLEMENT_ABSTRACT_TEMPLATE_DYNAMIC(className, seqT) 169 #define IPSDK_EXPORT_TEMPLATE_DYNAMIC_MACRO(r, Seq, seqT) \ 170 BOOST_PP_SEQ_ELEM(1, Seq) \ 171 template <> BOOST_PP_SEQ_ELEM(0, Seq) \ 172 const std::string& BOOST_PP_SEQ_ELEM(2, Seq)<IPSDK_TEMPLATE_VALUES(seqT)>::getTypeName() { \ 173 boost::lock_guard<boost::mutex> lock(TypeNameMutex::get()); \ 174 static const std::string g_typeName(BOOST_PP_SEQ_ELEM(4, Seq) \ 175 IPSDK_TEMPLATE_CLASSID(BOOST_PP_SEQ_ELEM(2, Seq), seqT)); \ 178 template <> BOOST_PP_SEQ_ELEM(0, Seq) \ 179 const std::string& BOOST_PP_SEQ_ELEM(2, Seq)<IPSDK_TEMPLATE_VALUES(seqT)>::getClassName() const { \ 180 return BOOST_PP_SEQ_ELEM(2, Seq)<IPSDK_TEMPLATE_VALUES(seqT)>::getTypeName(); \ 182 template <> BOOST_PP_SEQ_ELEM(0, Seq) \ 183 ipsdk::BaseDynamicObject* BOOST_PP_SEQ_ELEM(2, Seq)<IPSDK_TEMPLATE_VALUES(seqT)>::createNewObject() { \ 184 return new BOOST_PP_SEQ_ELEM(2, Seq)<IPSDK_TEMPLATE_VALUES(seqT)>(); \ 186 template <> BOOST_PP_SEQ_ELEM(0, Seq) \ 187 ipsdk::DynamicObjectPtr BOOST_PP_SEQ_ELEM(2, Seq)<IPSDK_TEMPLATE_VALUES(seqT)>::createSharedObject() { \ 188 return boost::make_shared<BOOST_PP_SEQ_ELEM(2, Seq)<IPSDK_TEMPLATE_VALUES(seqT)> >(); \ 190 template <> BOOST_PP_SEQ_ELEM(0, Seq) \ 191 ipsdk::BaseDynamicObject* BOOST_PP_SEQ_ELEM(2, Seq)<IPSDK_TEMPLATE_VALUES(seqT)>::createNew() const { \ 192 return new BOOST_PP_SEQ_ELEM(2, Seq)<IPSDK_TEMPLATE_VALUES(seqT)>(); \ 194 template <> BOOST_PP_SEQ_ELEM(0, Seq) \ 195 ipsdk::DynamicObjectPtr BOOST_PP_SEQ_ELEM(2, Seq)<IPSDK_TEMPLATE_VALUES(seqT)>::createShared() const { \ 196 return boost::make_shared<BOOST_PP_SEQ_ELEM(2, Seq)<IPSDK_TEMPLATE_VALUES(seqT)> >(); \ 198 BOOST_PP_SEQ_ELEM(3, Seq) \ 200 BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(2, Seq), DynamicRegistrator)<IPSDK_TEMPLATE_VALUES(seqT)>:: \ 201 BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(2, Seq), DynamicRegistrator)() { \ 202 ipsdk::DynamicObjectFactory& factory = ipsdk::DynamicObjectFactory::getInstance(); \ 203 factory.registerClass(BOOST_PP_SEQ_ELEM(4, Seq) \ 204 IPSDK_TEMPLATE_CLASSID(BOOST_PP_SEQ_ELEM(2, Seq), seqT), \ 205 BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(2, Seq), NewCreatorFcn)<IPSDK_TEMPLATE_VALUES(seqT)>, \ 206 BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(2, Seq), SharedCreatorFcn)<IPSDK_TEMPLATE_VALUES(seqT)>); \ 209 BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(2, Seq), DynamicRegistrator)<IPSDK_TEMPLATE_VALUES(seqT)>:: \ 210 ~BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(2, Seq), DynamicRegistrator)() { \ 211 ipsdk::DynamicObjectFactory& factory = ipsdk::DynamicObjectFactory::getInstance(); \ 212 factory.unRegisterClass(BOOST_PP_SEQ_ELEM(4, Seq) \ 213 IPSDK_TEMPLATE_CLASSID(BOOST_PP_SEQ_ELEM(2, Seq), seqT)); \ 216 BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(2, Seq), DynamicRegistrator)<IPSDK_TEMPLATE_VALUES(seqT)> \ 217 BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(2, Seq), DynamicRegistrator)<IPSDK_TEMPLATE_VALUES(seqT)>::g_classRegistrator = \ 218 BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(2, Seq), DynamicRegistrator)<IPSDK_TEMPLATE_VALUES(seqT)>(); \ 219 template class BOOST_PP_SEQ_ELEM(0, Seq) BOOST_PP_SEQ_ELEM(2, Seq)<IPSDK_TEMPLATE_VALUES(seqT)>; 223 #define IPSDK_EXPORT_TEMPLATE_DYNAMIC(libraryName, namespaceSeq, className, TYPE_SEQ) \ 224 BOOST_PP_SEQ_FOR_EACH(IPSDK_EXPORT_TEMPLATE_DYNAMIC_MACRO, \ 225 (IPSDK_LIB_API(libraryName)) \ 226 (IPSDK_START_NAMESPACE(namespaceSeq)) \ 228 (IPSDK_END_NAMESPACE(namespaceSeq)) \ 229 (IPSDK_FULL_NAMESPACE_STR(namespaceSeq)), \ 234 #define IPSDK_EXPORT_ABSTRACT_TEMPLATE_DYNAMIC_MACRO(r, Seq, seqT) \ 235 BOOST_PP_SEQ_ELEM(1, Seq) \ 236 template <> BOOST_PP_SEQ_ELEM(0, Seq) \ 237 const std::string& BOOST_PP_SEQ_ELEM(2, Seq)<IPSDK_TEMPLATE_VALUES(seqT)>::getTypeName() { \ 238 boost::lock_guard<boost::mutex> lock(TypeNameMutex::get()); \ 239 static const std::string g_typeName(BOOST_PP_SEQ_ELEM(4, Seq) \ 240 IPSDK_TEMPLATE_CLASSID(BOOST_PP_SEQ_ELEM(2, Seq), seqT)); \ 243 template <> BOOST_PP_SEQ_ELEM(0, Seq) \ 244 const std::string& BOOST_PP_SEQ_ELEM(2, Seq)<IPSDK_TEMPLATE_VALUES(seqT)>::getClassName() const { \ 245 return BOOST_PP_SEQ_ELEM(2, Seq)<IPSDK_TEMPLATE_VALUES(seqT)>::getTypeName(); \ 247 BOOST_PP_SEQ_ELEM(3, Seq) \ 248 template class BOOST_PP_SEQ_ELEM(0, Seq) BOOST_PP_SEQ_ELEM(2, Seq)<IPSDK_TEMPLATE_VALUES(seqT)>; 252 #define IPSDK_EXPORT_ABSTRACT_TEMPLATE_DYNAMIC(libraryName, namespaceSeq, className, TYPE_SEQ) \ 253 BOOST_PP_SEQ_FOR_EACH(IPSDK_EXPORT_ABSTRACT_TEMPLATE_DYNAMIC_MACRO, \ 254 (IPSDK_LIB_API(libraryName)) \ 255 (IPSDK_START_NAMESPACE(namespaceSeq)) \ 257 (IPSDK_END_NAMESPACE(namespaceSeq)) \ 258 (IPSDK_FULL_NAMESPACE_STR(namespaceSeq)), \ 266 #define IPSDK_IMPLEMENT_TEMPLATE_COPY(className, seqT, baseClassName) \ 267 IPSDK_TEMPLATE_PARAMS(seqT) \ 268 void className<IPSDK_TEMPLATE_ARGS(seqT)>::copy(const ipsdk::BaseDynamicObject& object) { \ 269 const className<IPSDK_TEMPLATE_ARGS(seqT)>* pObject = \ 270 static_cast<const className<IPSDK_TEMPLATE_ARGS(seqT)>*>(&object); \ 271 baseClassName::copy(object); 276 #endif // __IPSDKUTIL_DYNAMICTEMPLATESRCMACRO_H__ Macro set for template class manipulation.
Macro set to manage dynamic objects (source part)
Logger api for library IPSDKUtil.