Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Sep 25, 2009, 12:54:12 AM (15 years ago)
Author:
landauf
Message:

Removed end-iterator-safety from Iterator and ObjectListIterator. This means, when you reach end(), don't use *it anymore (this returned 0 in the past, now you'll get a segfault).
Changed ClassTreeMask and Radar accordingly.

Also, please always use "for (…) { (it++)→function() }" instead of "for (…; ++it) { it→function() }" if there's a chance function() destroys the object pointed by the iterator. Our objectlists are deletionsafe, but you'll encounter strange problems like overleaped elements and run-over-end() situations if you use the second pattern and don't doublecheck the iterator in the loop.
Changed GSRoot accordingly.

Location:
code/branches/core5/src/libraries/core
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • code/branches/core5/src/libraries/core/ClassTreeMask.h

    r5738 r5785  
    265265
    266266            /** @brief Returns true if the ClassTreeMaskObjectIterator points at the given object. @param pointer The pointer of the object */
    267             inline bool operator==(BaseObject* pointer) const { return ((*this->objectIterator_) == pointer); }
     267            inline bool operator==(BaseObject* pointer) const { return (this->objectIterator_ && (*this->objectIterator_) == pointer) || (!this->objectIterator_ && pointer == 0); }
    268268            /** @brief Returns true if the ClassTreeMaskObjectIterator doesn't point at the given object. @param pointer The pointer of the object */
    269             inline bool operator!=(BaseObject* pointer) const { return ((*this->objectIterator_) != pointer); }
     269            inline bool operator!=(BaseObject* pointer) const { return (this->objectIterator_ && (*this->objectIterator_) != pointer) || (!this->objectIterator_ && pointer != 0); }
    270270            /** @brief Returns true if the ClassTreeMaskObjectIterator hasn't already reached the end. */
    271271            inline operator bool() const { return (this->objectIterator_); }
  • code/branches/core5/src/libraries/core/Iterator.h

    r5738 r5785  
    167167
    168168                return (*this);
    169                 return *this;
    170169            }
    171170
     
    193192            inline const Iterator<T>& operator++()
    194193            {
    195                 if (this->element_)
    196                     this->element_ = this->element_->next_;
     194                this->element_ = this->element_->next_;
    197195                return *this;
    198196            }
     
    205203            {
    206204                Iterator<T> copy = *this;
    207                 if (this->element_)
    208                     this->element_ = this->element_->next_;
     205                this->element_ = this->element_->next_;
    209206                return copy;
    210207            }
     
    216213            inline const Iterator<T>& operator--()
    217214            {
    218                 if (this->element_)
    219                     this->element_ = this->element_->prev_;
     215                this->element_ = this->element_->prev_;
    220216                return *this;
    221217            }
     
    228224            {
    229225                Iterator<T> copy = *this;
    230                 if (this->element_)
    231                     this->element_ = this->element_->prev_;
     226                this->element_ = this->element_->prev_;
    232227                return copy;
    233228            }
     
    239234            inline T* operator*() const
    240235            {
    241                 if (this->element_)
    242                     return orxonox_cast<T*>(this->element_->objectBase_);
    243                 else
    244                     return 0;
     236                return orxonox_cast<T*>(this->element_->objectBase_);
    245237            }
    246238
     
    251243            inline T* operator->() const
    252244            {
    253                 if (this->element_)
    254                     return orxonox_cast<T*>(this->element_->objectBase_);
    255                 else
    256                     return 0;
     245                return orxonox_cast<T*>(this->element_->objectBase_);
    257246            }
    258247
  • code/branches/core5/src/libraries/core/ObjectListIterator.h

    r5738 r5785  
    123123            inline const ObjectListIterator<T>& operator++()
    124124            {
    125                 if (this->element_)
    126                     this->element_ = static_cast<ObjectListElement<T>*>(this->element_->next_);
     125                this->element_ = static_cast<ObjectListElement<T>*>(this->element_->next_);
    127126                return *this;
    128127            }
     
    135134            {
    136135                ObjectListIterator<T> copy = *this;
    137                 if (this->element_)
    138                     this->element_ = static_cast<ObjectListElement<T>*>(this->element_->next_);
     136                this->element_ = static_cast<ObjectListElement<T>*>(this->element_->next_);
    139137                return copy;
    140138            }
     
    146144            inline const ObjectListIterator<T>& operator--()
    147145            {
    148                 if (this->element_)
    149                     this->element_ = static_cast<ObjectListElement<T>*>(this->element_->prev_);
     146                this->element_ = static_cast<ObjectListElement<T>*>(this->element_->prev_);
    150147                return *this;
    151148            }
     
    158155            {
    159156                ObjectListIterator<T> copy = *this;
    160                 if (this->element_)
    161                     this->element_ = static_cast<ObjectListElement<T>*>(this->element_->prev_);
     157                this->element_ = static_cast<ObjectListElement<T>*>(this->element_->prev_);
    162158                return copy;
    163159            }
     
    169165            inline T* operator*() const
    170166            {
    171                 if (this->element_)
    172                     return this->element_->object_;
    173                 else
    174                     return 0;
     167                return this->element_->object_;
    175168            }
    176169
     
    181174            inline T* operator->() const
    182175            {
    183                 if (this->element_)
    184                     return this->element_->object_;
    185                 else
    186                     return 0;
     176                return this->element_->object_;
    187177            }
    188178
Note: See TracChangeset for help on using the changeset viewer.