Changeset 2784 for code/trunk
- Timestamp:
- Mar 15, 2009, 1:26:23 AM (16 years ago)
- Location:
- code/trunk/src/core
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
code/trunk/src/core/Identifier.h
r2710 r2784 357 357 static ClassIdentifier<T> *getIdentifier(const std::string& name); 358 358 void addObject(T* object); 359 static bool isFirstCall();360 359 361 360 void updateConfigValues(bool updateChildren = true) const; 362 361 363 362 private: 363 static void initialiseIdentifier(); 364 364 ClassIdentifier(const ClassIdentifier<T>& identifier) {} // don't copy 365 365 ClassIdentifier() … … 376 376 377 377 template <class T> 378 ClassIdentifier<T>* ClassIdentifier<T>::classIdentifier_s; 379 380 /** 381 @brief Returns true if the function gets called the first time, false otherwise. 382 @return True if this function got called the first time. 383 */ 384 template <class T> 385 bool ClassIdentifier<T>::isFirstCall() 386 { 387 static bool bFirstCall = true; 388 389 if (bFirstCall) 378 ClassIdentifier<T>* ClassIdentifier<T>::classIdentifier_s = 0; 379 380 /** 381 @brief Returns the only instance of this class. 382 @return The unique Identifier 383 */ 384 template <class T> 385 ClassIdentifier<T>* ClassIdentifier<T>::getIdentifier() 386 { 387 // check if the static field has already been filled 388 if (ClassIdentifier<T>::classIdentifier_s == 0) 389 ClassIdentifier<T>::initialiseIdentifier(); 390 391 return ClassIdentifier<T>::classIdentifier_s; 392 } 393 394 /** 395 @brief Does the same as getIdentifier() but sets the name if this wasn't done yet. 396 @param name The name of this Identifier 397 @return The Identifier 398 */ 399 template <class T> 400 ClassIdentifier<T>* ClassIdentifier<T>::getIdentifier(const std::string& name) 401 { 402 ClassIdentifier<T>* identifier = ClassIdentifier<T>::getIdentifier(); 403 identifier->setName(name); 404 return identifier; 405 } 406 407 /** 408 @brief Assigns the static field for the identifier singleton. 409 */ 410 template <class T> 411 void ClassIdentifier<T>::initialiseIdentifier() 412 { 413 // Get the name of the class 414 std::string name = typeid(T).name(); 415 416 // create a new identifier anyway. Will be deleted in Identifier::getIdentifier if not used. 417 ClassIdentifier<T>* proposal = new ClassIdentifier<T>(); 418 419 // Get the entry from the map 420 ClassIdentifier<T>::classIdentifier_s = (ClassIdentifier<T>*)Identifier::getIdentifierSingleton(name, proposal); 421 422 if (ClassIdentifier<T>::classIdentifier_s == proposal) 390 423 { 391 bFirstCall = false; 392 return true; 424 COUT(4) << "*** Identifier: Requested Identifier for " << name << " was not yet existing and got created." << std::endl; 393 425 } 394 426 else 395 427 { 396 return false;428 COUT(4) << "*** Identifier: Requested Identifier for " << name << " was already existing and got assigned." << std::endl; 397 429 } 398 }399 400 /**401 @brief Returns the only instance of this class.402 @return The unique Identifier403 */404 template <class T>405 ClassIdentifier<T>* ClassIdentifier<T>::getIdentifier()406 {407 // check if the static field has already been filled408 if (ClassIdentifier<T>::isFirstCall())409 {410 // Get the name of the class411 std::string name = typeid(T).name();412 413 // create a new identifier anyway. Will be deleted in Identifier::getIdentifier if not used.414 ClassIdentifier<T>* proposal = new ClassIdentifier<T>();415 416 // Get the entry from the map417 ClassIdentifier<T>::classIdentifier_s = (ClassIdentifier<T>*)Identifier::getIdentifierSingleton(name, proposal);418 419 if (ClassIdentifier<T>::classIdentifier_s == proposal)420 {421 COUT(4) << "*** Identifier: Requested Identifier for " << name << " was not yet existing and got created." << std::endl;422 }423 else424 {425 COUT(4) << "*** Identifier: Requested Identifier for " << name << " was already existing and got assigned." << std::endl;426 }427 }428 429 // Finally return the unique ClassIdentifier430 return ClassIdentifier<T>::classIdentifier_s;431 }432 433 /**434 @brief Does the same as getIdentifier() but sets the name if this wasn't done yet.435 @param name The name of this Identifier436 @return The Identifier437 */438 template <class T>439 ClassIdentifier<T>* ClassIdentifier<T>::getIdentifier(const std::string& name)440 {441 ClassIdentifier<T>* identifier = ClassIdentifier<T>::getIdentifier();442 identifier->setName(name);443 return identifier;444 430 } 445 431 -
code/trunk/src/core/Iterator.h
r2662 r2784 75 75 this->element_ = exp.element_; 76 76 this->list_ = exp.list_; 77 this-> iterator_ = this->list_->registerIterator(this);77 this->list_->registerIterator(this); 78 78 } 79 79 … … 86 86 this->element_ = other.element_; 87 87 this->list_ = other.list_; 88 this-> iterator_ = this->list_->registerIterator(this);88 this->list_->registerIterator(this); 89 89 } 90 90 … … 98 98 this->element_ = (element) ? static_cast<ObjectListBaseElement*>(element) : 0; 99 99 this->list_ = ClassIdentifier<O>::getIdentifier()->getObjects(); 100 this-> iterator_ = this->list_->registerIterator(this);100 this->list_->registerIterator(this); 101 101 } 102 102 … … 110 110 this->element_ = (other.element_) ? static_cast<ObjectListBaseElement*>(other.element_) : 0; 111 111 this->list_ = ClassIdentifier<O>::getIdentifier()->getObjects(); 112 this-> iterator_ = this->list_->registerIterator(this);112 this->list_->registerIterator(this); 113 113 } 114 114 … … 118 118 inline ~Iterator() 119 119 { 120 this->list_->unregisterIterator(this ->iterator_);120 this->list_->unregisterIterator(this); 121 121 } 122 122 … … 128 128 { 129 129 if (this->list_) 130 this->list_->unregisterIterator(this ->iterator_);130 this->list_->unregisterIterator(this); 131 131 132 132 this->element_ = exp.element_; 133 133 this->list_ = exp.list_; 134 this-> iterator_ = this->list_->registerIterator(this);134 this->list_->registerIterator(this); 135 135 136 136 return (*this); … … 144 144 { 145 145 if (this->list_) 146 this->list_->unregisterIterator(this ->iterator_);146 this->list_->unregisterIterator(this); 147 147 148 148 this->element_ = other.element_; 149 149 this->list_ = other.list_; 150 this-> iterator_ = this->list_->registerIterator(this);150 this->list_->registerIterator(this); 151 151 152 152 return (*this); … … 161 161 { 162 162 if (this->list_) 163 this->list_->unregisterIterator(this ->iterator_);163 this->list_->unregisterIterator(this); 164 164 165 165 this->element_ = (element) ? static_cast<ObjectListBaseElement*>(element) : 0; 166 166 this->list_ = ClassIdentifier<O>::getIdentifier()->getObjects(); 167 this-> iterator_ = this->list_->registerIterator(this);167 this->list_->registerIterator(this); 168 168 169 169 return (*this); … … 179 179 { 180 180 if (this->list_) 181 this->list_->unregisterIterator(this ->iterator_);181 this->list_->unregisterIterator(this); 182 182 183 183 this->element_ = (other.element_) ? (ObjectListBaseElement*)other.element_ : 0; 184 184 this->list_ = ClassIdentifier<O>::getIdentifier()->getObjects(); 185 this-> iterator_ = this->list_->registerIterator(this);185 this->list_->registerIterator(this); 186 186 187 187 return (*this); … … 300 300 ObjectListBaseElement* element_; //!< The element the Iterator points at 301 301 ObjectListBase* list_; //!< The list wherein the element is 302 std::list<void*>::iterator iterator_; //!< The iterator in the notifying list of the ObjectList303 302 }; 304 303 -
code/trunk/src/core/ObjectListBase.cc
r2171 r2784 75 75 void ObjectListBase::notifyIterators(OrxonoxClass* object) const 76 76 { 77 for (std:: list<void*>::const_iterator it = this->iterators_.begin(); it != this->iterators_.end(); ++it)77 for (std::vector<void*>::const_iterator it = this->iterators_.begin(); it != this->iterators_.end(); ++it) 78 78 ((Iterator<OrxonoxClass>*)(*it))->incrementIfEqual(object); 79 for (std:: list<void*>::const_iterator it = this->objectListIterators_.begin(); it != this->objectListIterators_.end(); ++it)79 for (std::vector<void*>::const_iterator it = this->objectListIterators_.begin(); it != this->objectListIterators_.end(); ++it) 80 80 ((ObjectListIterator<OrxonoxClass>*)(*it))->incrementIfEqual(object); 81 81 } -
code/trunk/src/core/ObjectListBase.h
r2171 r2784 38 38 #define _ObjectListBase_H__ 39 39 40 #include < list>40 #include <vector> 41 41 42 42 #include "CorePrereqs.h" … … 110 110 inline Export rend() { return ObjectListBase::Export(this, 0); } 111 111 112 inline std::list<void*>::iterator registerIterator(void* iterator) { return this->iterators_.insert(this->iterators_.begin(), iterator); } 113 inline void unregisterIterator(const std::list<void*>::iterator& iterator) { this->iterators_.erase(iterator); } 114 inline std::list<void*>::iterator registerObjectListIterator(void* iterator) { return this->objectListIterators_.insert(this->objectListIterators_.begin(), iterator); } 115 inline void unregisterObjectListIterator(const std::list<void*>::iterator& iterator) { this->objectListIterators_.erase(iterator); } 112 inline void registerIterator(void* iterator) { this->iterators_.push_back(iterator); } 113 inline void unregisterIterator(void* iterator) 114 { 115 for (unsigned int i = 0; i < this->iterators_.size(); ++i) 116 { 117 if (iterators_[i] == iterator) 118 { 119 iterators_.erase(iterators_.begin() + i); 120 break; 121 } 122 } 123 } 124 inline void registerObjectListIterator(void* iterator) { this->objectListIterators_.push_back(iterator); } 125 inline void unregisterObjectListIterator(void* iterator) 126 { 127 for (unsigned int i = 0; i < this->objectListIterators_.size(); ++i) 128 { 129 if (objectListIterators_[i] == iterator) 130 { 131 objectListIterators_.erase(objectListIterators_.begin() + i); 132 break; 133 } 134 } 135 } 116 136 void notifyIterators(OrxonoxClass* object) const; 117 137 … … 122 142 ObjectListBaseElement* first_; //!< The first element in the list 123 143 ObjectListBaseElement* last_; //!< The last element in the list 124 std:: list<void*> iterators_; //!< A list of Iterators pointing on an element in this list125 std:: list<void*> objectListIterators_; //!< A list of ObjectListIterators pointing on an element in this list144 std::vector<void*> iterators_; //!< A list of Iterators pointing on an element in this list 145 std::vector<void*> objectListIterators_; //!< A list of ObjectListIterators pointing on an element in this list 126 146 }; 127 147 } -
code/trunk/src/core/ObjectListIterator.h
r2662 r2784 65 65 { 66 66 this->element_ = 0; 67 this->iterator_ =ClassIdentifier<T>::getIdentifier()->getObjects()->registerObjectListIterator(this);67 ClassIdentifier<T>::getIdentifier()->getObjects()->registerObjectListIterator(this); 68 68 } 69 69 … … 75 75 { 76 76 this->element_ = element; 77 this->iterator_ =ClassIdentifier<T>::getIdentifier()->getObjects()->registerObjectListIterator(this);77 ClassIdentifier<T>::getIdentifier()->getObjects()->registerObjectListIterator(this); 78 78 } 79 79 … … 85 85 { 86 86 this->element_ = other.element_; 87 this->iterator_ =ClassIdentifier<T>::getIdentifier()->getObjects()->registerObjectListIterator(this);87 ClassIdentifier<T>::getIdentifier()->getObjects()->registerObjectListIterator(this); 88 88 } 89 89 … … 93 93 inline ~ObjectListIterator() 94 94 { 95 ClassIdentifier<T>::getIdentifier()->getObjects()->unregisterObjectListIterator(this ->iterator_);95 ClassIdentifier<T>::getIdentifier()->getObjects()->unregisterObjectListIterator(this); 96 96 } 97 97 … … 227 227 private: 228 228 ObjectListElement<T>* element_; //!< The element the Iterator points at 229 std::list<void*>::iterator iterator_; //!< The iterator in the notifying list of the ObjectList230 229 }; 231 230 }
Note: See TracChangeset
for help on using the changeset viewer.