47 #ifndef _MIRA_FACTORYMACROS_H_ 48 #define _MIRA_FACTORYMACROS_H_ 51 #include <boost/mpl/assert.hpp> 59 class ________________________________PLEASE_USE_THE__MIRA_TEMPLATE_CLASS_REGISTER__MACRO_IN_GLOBAL_NAMESPACE_ONLY________________________________
61 virtual int FOR_CLASS();
62 virtual ~________________________________PLEASE_USE_THE__MIRA_TEMPLATE_CLASS_REGISTER__MACRO_IN_GLOBAL_NAMESPACE_ONLY________________________________() {}
67 class ________________________________PLEASE_USE_THE__MIRA_CLASS_REGISTER__MACRO_IN_GLOBAL_NAMESPACE_ONLY________________________________
69 virtual int FOR_CLASS();
70 virtual ~________________________________PLEASE_USE_THE__MIRA_CLASS_REGISTER__MACRO_IN_GLOBAL_NAMESPACE_ONLY________________________________() {}
75 class ________________________________PLEASE_USE_THE__MIRA_NO_PUBLIC_DEFAULT_CONSTRUCTOR__MACRO_IN_GLOBAL_NAMESPACE_ONLY________________________________
77 virtual int FOR_CLASS();
78 virtual ~________________________________PLEASE_USE_THE__MIRA_NO_PUBLIC_DEFAULT_CONSTRUCTOR__MACRO_IN_GLOBAL_NAMESPACE_ONLY________________________________() {}
94 size_t pos = std::string::npos;
95 if ( identifier[identifier.length()-1] ==
'>' )
96 pos = identifier.rfind(
'<');
97 std::string tReturn = ( identifier.rfind(
"::",pos) != std::string::npos ) ?
98 identifier.substr( identifier.rfind(
"::",pos) + 2 )
113 #define MIRA_OBJECT_BASE( classIdentifier ) \ 114 friend class mira::ClassFactory; \ 116 template<typename pCLASS, typename pBASECLASS> \ 117 friend struct mira::FactoryRegisterClassHelper; \ 119 template<typename pCLASS> \ 120 friend class mira::TClass; \ 124 mira::TClass<classIdentifier> const& getClass() const { \ 129 static_cast<mira::TClass<classIdentifier> const&>( internalGetClass() ); \ 133 static mira::TClass<classIdentifier> const& CLASS() { \ 139 virtual mira::Class& internalGetClass() const { \ 142 static mira::TClass<classIdentifier>& _staticClassObject( \ 143 std::string const& identifier, \ 144 std::string const& name, \ 159 #define MIRA_NAMEDOBJECT( classIdentifier, className ) \ 160 MIRA_OBJECT_BASE( MIRA_PPARAM( classIdentifier ) ) \ 163 static mira::TClass<classIdentifier>& _CLASS() { \ 164 return _staticClassObject( mira::typeName<classIdentifier>(), \ 165 #className, true ); \ 169 static void addMetaInfo( std::map<std::string, std::string>& metaMap ) \ 183 #define MIRA_OBJECT( classIdentifier ) \ 184 MIRA_OBJECT_BASE( MIRA_PPARAM( classIdentifier ) ) \ 187 static mira::TClass<classIdentifier>& _CLASS() { \ 188 return _staticClassObject( mira::typeName<classIdentifier>(), \ 189 mira::mira_stripNameFromIdentifier( \ 190 mira::typeName<classIdentifier>() ), true ); \ 194 static void addMetaInfo( std::map<std::string, std::string>& metaMap ) \ 208 #define MIRA_META_OBJECT( classIdentifier, MetaInfo ) \ 209 MIRA_OBJECT_BASE( MIRA_PPARAM( classIdentifier ) ) \ 212 static mira::TClass<classIdentifier>& _CLASS() { \ 213 return _staticClassObject( mira::typeName<classIdentifier>(), \ 214 mira::mira_stripNameFromIdentifier( \ 215 mira::typeName<classIdentifier>() ), true ); \ 219 static void addMetaInfo( std::map<std::string, std::string>& metaMap ) \ 222 boost::assign::insert( metaMap ) MetaInfo; \ 239 #define MIRA_ABSTRACT_OBJECT( classIdentifier ) \ 240 MIRA_META_OBJECT( MIRA_PPARAM( classIdentifier ), ("AbstractClass", mira::typeName<classIdentifier>()) ) 246 #define MIRA_ABSTRACT_META_OBJECT( classIdentifier, MetaInfo ) \ 247 MIRA_META_OBJECT( MIRA_PPARAM( classIdentifier ), ("AbstractClass", mira::typeName<classIdentifier>())MetaInfo ) 257 #define MIRA_CLASS_REGISTER( Class, ... ) \ 260 ________________________________PLEASE_USE_THE__MIRA_CLASS_REGISTER__MACRO_IN_GLOBAL_NAMESPACE_ONLY________________________________ \ 261 <Class>::FOR_CLASS() { return 0; } \ 262 MIRA_REGISTRAR( MIRA_PPARAM( mira::FactoryRegisterClass<Class, __VA_ARGS__> ) ) \ 263 mira::TClass<Class>& Class::_staticClassObject(std::string const& identifier, \ 264 std::string const& name, \ 266 static mira::TClass<Class> sClass(identifier, name, libLoaded); \ 274 #define MIRA_NO_PUBLIC_DEFAULT_CONSTRUCTOR(CLASS) \ 277 class HasPublicDefaultConstructor<CLASS> : public std::false_type {}; \ 281 std::string
const& specialIdent )
283 size_t tFirstOccGeneric = genericIdent.find(
'<');
284 size_t tLastOccGeneric = genericIdent.rfind(
'>');
285 size_t tFirstOccSpecial = specialIdent.find(
'<');
286 size_t tLastOccSpecial = specialIdent.rfind(
'>');
288 assert( tFirstOccGeneric != std::string::npos &&
289 tLastOccGeneric != std::string::npos );
291 assert( tFirstOccSpecial != std::string::npos &&
292 tLastOccSpecial != std::string::npos );
294 std::string tReturnValue = genericIdent;
296 return tReturnValue.replace( tFirstOccGeneric, tLastOccGeneric-tFirstOccGeneric,
297 specialIdent.substr( tFirstOccSpecial,
298 tLastOccSpecial - tFirstOccSpecial ) );
303 #define MIRA_INTERNAL_OPEN_NAMESPACE(r,data,t) \ 306 #define MIRA_INTERNAL_CLOSE_NAMESPACE(r,data,t) } 310 #define MIRA_VA_NUM_ARGS(...) MIRA_VA_NUM_ARGS_IMPL(__VA_ARGS__,5,4,3,2,1) 311 #define MIRA_VA_NUM_ARGS_IMPL(_1,_2,_3,_4,_5,N,...) N 315 #define MIRA_MAKE_SEQ(size, rel) MIRA_MAKE_SEQ_D(size, rel) 316 #define MIRA_MAKE_SEQ_D(size, rel) \ 318 MIRA_MAKE_SEQ_A_ ## size rel, \ 324 #define MIRA_MAKE_SEQ_A_1(a) ((a)) MIRA_MAKE_SEQ_B_1 325 #define MIRA_MAKE_SEQ_B_1(a) ((a)) MIRA_MAKE_SEQ_A_1 327 #define MIRA_MAKE_SEQ_A_10X0() 328 #define MIRA_MAKE_SEQ_B_10X0() 331 #define MIRA_MAKE_SEQ_A_2(a, b) ((a, b)) MIRA_MAKE_SEQ_B_2 332 #define MIRA_MAKE_SEQ_B_2(a, b) ((a, b)) MIRA_MAKE_SEQ_A_2 334 #define MIRA_MAKE_SEQ_A_20X0() 335 #define MIRA_MAKE_SEQ_B_20X0() 338 #define MIRA_MAKE_SEQ_A_3(a, b, c) ((a, b, c)) MIRA_MAKE_SEQ_B_3 339 #define MIRA_MAKE_SEQ_B_3(a, b, c) ((a, b, c)) MIRA_MAKE_SEQ_A_3 341 #define MIRA_MAKE_SEQ_A_30X0() 342 #define MIRA_MAKE_SEQ_B_30X0() 345 #define MIRA_MAKE_SEQ_A_4(a, b, c, d) ((a, b, c, d)) MIRA_MAKE_SEQ_B_4 346 #define MIRA_MAKE_SEQ_B_4(a, b, c, d) ((a, b, c, d)) MIRA_MAKE_SEQ_A_4 348 #define MIRA_INTERNAL_PRINT_TOKEN(TOKEN) #TOKEN 350 #define MIRA_DO_NOTHING(Sequence,StartId) 352 #define MIRA_INTERNAL_NAMESPACE_FOLD(r,data,t) \ 355 #define MIRA_INTERNAL_CONC_NAMESPACE_IMPL(Sequence, StartId) \ 356 BOOST_PP_SEQ_FOLD_RIGHT(MIRA_INTERNAL_NAMESPACE_FOLD,,BOOST_PP_SEQ_REST_N(StartId,Sequence)) 358 #define MIRA_INTERNAL_CONC_NAMESPACE(Sequence,StartId) \ 360 BOOST_PP_IF( BOOST_PP_SEQ_SIZE( BOOST_PP_SEQ_REST_N( StartId, Sequence) ), \ 362 MIRA_INTERNAL_CONC_NAMESPACE_IMPL \ 364 , MIRA_DO_NOTHING )(Sequence, StartId) 366 #define MIRA_INTERNAL_TEMPLATE_CLASS_REGISTER( r, Args, TmplSpec) \ 373 MIRA_REGISTRAR( MIRA_PPARAM( mira::FactoryRegisterClass< \ 376 BOOST_PP_IF( BOOST_PP_SEQ_SIZE( BOOST_PP_SEQ_REST_N( \ 377 BOOST_PP_SEQ_ELEM(3,Args),Args) ), \ 379 MIRA_INTERNAL_CONC_NAMESPACE_IMPL \ 381 , MIRA_DO_NOTHING )( Args, BOOST_PP_SEQ_ELEM(3,Args) ) \ 382 BOOST_PP_SEQ_ELEM(0,Args)<BOOST_PP_TUPLE_REM_CTOR( BOOST_PP_SEQ_ELEM(2,Args), TmplSpec)>, \ 383 BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_SUBSEQ(Args,4,BOOST_PP_SEQ_ELEM(1,Args)))> ) ) \ 386 #define MIRA_INTERNAL_TEMPLATE_CLASS_STATIC( r, Args, TmplSpec) \ 389 template<> mira::TClass<\ 390 BOOST_PP_SEQ_ELEM(0,Args)<BOOST_PP_TUPLE_REM_CTOR(BOOST_PP_SEQ_ELEM(1,Args), TmplSpec)> >& \ 391 BOOST_PP_SEQ_ELEM(0,Args)<BOOST_PP_TUPLE_REM_CTOR(BOOST_PP_SEQ_ELEM(1,Args), TmplSpec)>::_staticClassObject( \ 392 std::string const& identifier, \ 393 std::string const& name, \ 395 static mira::TemplateClass<BOOST_PP_SEQ_ELEM(0,Args)<BOOST_PP_TUPLE_REM_CTOR(BOOST_PP_SEQ_ELEM(1,Args), TmplSpec)> > \ 396 sClass(identifier, name, libLoaded); \ 401 #define MIRA_TMPL_SPEC_CONCAT(r, data, i, elem) "," BOOST_PP_STRINGIZE(elem) 403 #define TAIL_NAME( Seq ) \ 404 BOOST_PP_SEQ_FOR_EACH_I( MIRA_TMPL_SPEC_CONCAT, , Seq) 406 #define MIRA_INTERNAL_TEMPLATE_IDENTIFIER( r, Args, TmplSpec) \ 412 std::string const& TemplateClass<MIRA_INTERNAL_CONC_NAMESPACE(Args,2) \ 413 BOOST_PP_SEQ_ELEM(0,Args)<BOOST_PP_TUPLE_REM_CTOR(BOOST_PP_SEQ_ELEM(1,Args), TmplSpec)> >::getIdentifier() const { \ 416 static std::string tIdent = replaceTemplateGeneric( \ 417 TClass<MIRA_INTERNAL_CONC_NAMESPACE(Args,2) \ 418 BOOST_PP_SEQ_ELEM(0,Args)<BOOST_PP_TUPLE_REM_CTOR(BOOST_PP_SEQ_ELEM(1,Args), TmplSpec)> >::getIdentifier(), \ 420 BOOST_PP_STRINGIZE(BOOST_PP_SEQ_HEAD(BOOST_PP_TUPLE_TO_SEQ(BOOST_PP_SEQ_ELEM(1,Args),TmplSpec))) \ 422 BOOST_PP_SEQ_FOR_EACH_I( MIRA_TMPL_SPEC_CONCAT, , BOOST_PP_SEQ_TAIL(BOOST_PP_TUPLE_TO_SEQ(BOOST_PP_SEQ_ELEM(1,Args), TmplSpec))) \ 429 std::string const& TemplateClass<MIRA_INTERNAL_CONC_NAMESPACE(Args,2) \ 430 BOOST_PP_SEQ_ELEM(0,Args)<BOOST_PP_TUPLE_REM_CTOR(BOOST_PP_SEQ_ELEM(1,Args), TmplSpec)> >::getName() const { \ 431 static std::string tName = mira_stripNameFromIdentifier( \ 450 #define MIRA_TEMPLATE_CLASS_REGISTER( Namespace, Class, TmplSpec, ... ) \ 451 MIRA_TEMPLATE_CLASS_REGISTER_IMPL( Namespace, Class, 1, MIRA_MAKE_SEQ(1,TmplSpec), __VA_ARGS__ ) 465 #define MIRA_VARTEMPLATE_CLASS_REGISTER( Namespace, Class, NumTmplPrm, TmplSpec, ... ) \ 466 MIRA_TEMPLATE_CLASS_REGISTER_IMPL( Namespace, Class, NumTmplPrm, MIRA_MAKE_SEQ(NumTmplPrm,TmplSpec), __VA_ARGS__ ) 470 #define MIRA_TMPL_SIG_FROM_SEQ( NumTmplPrm, SeqId, Sequence )\ 471 BOOST_PP_TUPLE_REM_CTOR( NumTmplPrm, BOOST_PP_SEQ_ELEM(SeqId,Sequence) ) 473 #define MIRA_TEMPLATE_CLASS_REGISTER_IMPL( Namespace, Class, NumTmplPrm, TmplSpec, ... ) \ 476 ________________________________PLEASE_USE_THE__MIRA_TEMPLATE_CLASS_REGISTER__MACRO_IN_GLOBAL_NAMESPACE_ONLY________________________________\ 477 <MIRA_INTERNAL_CONC_NAMESPACE(Namespace,0)Class \ 478 <MIRA_TMPL_SIG_FROM_SEQ(NumTmplPrm,0,TmplSpec)> >::FOR_CLASS() { return 0; } \ 482 BOOST_PP_SEQ_FOR_EACH(MIRA_INTERNAL_TEMPLATE_CLASS_REGISTER, \ 484 (MIRA_VA_NUM_ARGS(__VA_ARGS__))(NumTmplPrm)(BOOST_PP_ADD(MIRA_VA_NUM_ARGS(__VA_ARGS__),4))\ 485 BOOST_PP_TUPLE_TO_SEQ(MIRA_VA_NUM_ARGS(__VA_ARGS__),(__VA_ARGS__)) \ 486 Namespace,TmplSpec) \ 490 BOOST_PP_IF( BOOST_PP_SEQ_SIZE( Namespace ), \ 492 BOOST_PP_SEQ_FOR_EACH(MIRA_INTERNAL_OPEN_NAMESPACE,~,Namespace) \ 498 BOOST_PP_SEQ_FOR_EACH(MIRA_INTERNAL_TEMPLATE_CLASS_STATIC, \ 499 (Class)(NumTmplPrm), TmplSpec) \ 501 BOOST_PP_IF( BOOST_PP_SEQ_SIZE( Namespace ), \ 503 BOOST_PP_SEQ_FOR_EACH(MIRA_INTERNAL_CLOSE_NAMESPACE,~,Namespace) \ 509 BOOST_PP_SEQ_FOR_EACH(MIRA_INTERNAL_TEMPLATE_IDENTIFIER, \ 510 (Class)(NumTmplPrm)Namespace,TmplSpec) \ specialize cv::DataType for our ImgPixel and inherit from cv::DataType<Vec>
Definition: IOService.h:67
Get compiler and platform independent typenames.
std::string mira_stripNameFromIdentifier(std::string const &identifier)
Auxiliary function to extract the class name from the given identifier.
Definition: FactoryMacros.h:92
std::string replaceTemplateGeneric(std::string const &genericIdent, std::string const &specialIdent)
Definition: FactoryMacros.h:280