Changeset 2361 for code/branches/objecthierarchy2/src/core/Super.h
- Timestamp:
- Dec 9, 2008, 2:07:24 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/objecthierarchy2/src/core/Super.h
r2257 r2361 99 99 \ 100 100 static void apply(void* temp) {} \ 101 \ 101 102 static void apply(baseclass* temp) \ 102 103 { \ … … 104 105 for (std::set<const Identifier*>::iterator it = identifier->getDirectChildrenIntern().begin(); it != identifier->getDirectChildrenIntern().end(); ++it) \ 105 106 { \ 107 if (((ClassIdentifier<T>*)(*it))->bSuperFunctionCaller_##functionname##_isFallback_ && ((ClassIdentifier<T>*)(*it))->superFunctionCaller_##functionname##_) \ 108 { \ 109 delete ((ClassIdentifier<T>*)(*it))->superFunctionCaller_##functionname##_; \ 110 ((ClassIdentifier<T>*)(*it))->superFunctionCaller_##functionname##_ = 0; \ 111 ((ClassIdentifier<T>*)(*it))->bSuperFunctionCaller_##functionname##_isFallback_ = false; \ 112 } \ 113 \ 106 114 if (!((ClassIdentifier<T>*)(*it))->superFunctionCaller_##functionname##_) \ 107 115 { \ … … 163 171 for (std::set<const Identifier*>::iterator it = identifier->getDirectChildrenIntern().begin(); it != identifier->getDirectChildrenIntern().end(); ++it) 164 172 { 173 // Check if the caller is a fallback-caller 174 if (((ClassIdentifier<T>*)(*it))->bSuperFunctionCaller_##functionname##_isFallback_ && ((ClassIdentifier<T>*)(*it))->superFunctionCaller_##functionname##_) 175 { 176 // Delete the fallback caller an prepare to get a real caller 177 delete ((ClassIdentifier<T>*)(*it))->superFunctionCaller_##functionname##_; 178 ((ClassIdentifier<T>*)(*it))->superFunctionCaller_##functionname##_ = 0; 179 ((ClassIdentifier<T>*)(*it))->bSuperFunctionCaller_##functionname##_isFallback_ = false; 180 } 181 165 182 // Check if there's not already a caller 166 183 if (!((ClassIdentifier<T>*)(*it))->superFunctionCaller_##functionname##_) … … 183 200 struct SuperFunctionCondition<functionnumber, baseclass, 0, templatehack2> \ 184 201 { \ 185 // The check function just behaves like the fallback - it advances to the check for the next super-function (functionnumber + 1)202 // The check function acts like the fallback - it advances to the check for the next super-function (functionnumber + 1) 186 203 static void check() \ 187 204 { \ … … 301 318 }; \ 302 319 \ 320 class _CoreExport SuperFunctionCaller_##functionname \ 321 { \ 322 public: \ 323 virtual void operator()( SUPER_CALL_ARGUMENTS##hasarguments(__VA_ARGS__) ) = 0; \ 324 virtual ~SuperFunctionCaller_##functionname () {} \ 325 }; \ 326 \ 327 template <class T> \ 328 class SuperFunctionClassCaller_purevirtualfallback_##functionname : public SuperFunctionCaller_##functionname \ 329 { \ 330 public: \ 331 inline void operator()( SUPER_CALL_ARGUMENTS##hasarguments(__VA_ARGS__) ) \ 332 { \ 333 } \ 334 }; \ 335 \ 303 336 template <class T> \ 304 337 struct SuperFunctionInitialization<functionnumber, T> \ … … 306 339 static void initialize(ClassIdentifier<T>* identifier) \ 307 340 { \ 308 identifier->superFunctionCaller_##functionname##_ = 0; \ 341 identifier->superFunctionCaller_##functionname##_ = new SuperFunctionClassCaller_purevirtualfallback_##functionname <T>; \ 342 identifier->bSuperFunctionCaller_##functionname##_isFallback_ = true; \ 309 343 SuperFunctionInitialization<functionnumber + 1, T>::initialize(identifier); \ 310 344 } \ … … 322 356 }; \ 323 357 \ 324 class _CoreExport SuperFunctionCaller_##functionname \325 { \326 public: \327 virtual void operator()( SUPER_CALL_ARGUMENTS##hasarguments(__VA_ARGS__) ) = 0; \328 virtual ~SuperFunctionCaller_##functionname () {} \329 }; \330 \331 358 template <class T> \ 332 359 class SuperFunctionClassCaller_##functionname : public SuperFunctionCaller_##functionname \ … … 375 402 }; 376 403 377 // Initializes the SuperFunctionCaller-pointer with zero. 404 // Baseclass of the super-function caller. The real call will be done by a 405 // templatized subclass through the virtual () operator. 406 class _CoreExport SuperFunctionCaller_##functionname 407 { 408 public: 409 virtual void operator()( SUPER_CALL_ARGUMENTS##hasarguments(__VA_ARGS__) ) = 0; 410 virtual ~SuperFunctionCaller_##functionname () {} 411 }; 412 413 // Fallback if the base is pure virtual 414 template <class T> 415 class SuperFunctionClassCaller_purevirtualfallback_##functionname : public SuperFunctionCaller_##functionname 416 { 417 public: 418 // Fallback does nothing 419 inline void operator()( SUPER_CALL_ARGUMENTS##hasarguments(__VA_ARGS__) ) 420 { 421 } 422 }; 423 424 // Initializes the SuperFunctionCaller-pointer with a fallback caller in case the base function is pure virtual 378 425 template <class T> 379 426 struct SuperFunctionInitialization<functionnumber, T> … … 381 428 static void initialize(ClassIdentifier<T>* identifier) 382 429 { 383 identifier->superFunctionCaller_##functionname##_ = 0; 430 identifier->superFunctionCaller_##functionname##_ = new SuperFunctionClassCaller_purevirtualfallback_##functionname <T>; 431 identifier->bSuperFunctionCaller_##functionname##_isFallback_ = true; 384 432 385 433 // Calls the initialization of the next super-function (functionnumber + 1) … … 400 448 SuperFunctionDestruction<functionnumber + 1, T>::destroy(identifier); 401 449 } 402 };403 404 // Baseclass of the super-function caller. The real call will be done by a405 // templatized subclass through the virtual () operator.406 class _CoreExport SuperFunctionCaller_##functionname407 {408 public:409 virtual void operator()( SUPER_CALL_ARGUMENTS##hasarguments(__VA_ARGS__) ) = 0;410 virtual ~SuperFunctionCaller_##functionname () {}411 450 }; 412 451 … … 497 536 #ifndef SUPER_INTRUSIVE_DECLARATION 498 537 #define SUPER_INTRUSIVE_DECLARATION(functionname) \ 499 SuperFunctionCaller_##functionname * superFunctionCaller_##functionname##_ 538 SuperFunctionCaller_##functionname * superFunctionCaller_##functionname##_; \ 539 bool bSuperFunctionCaller_##functionname##_isFallback_ 500 540 #endif 501 541
Note: See TracChangeset
for help on using the changeset viewer.