Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Nov 20, 2007, 2:57:59 AM (16 years ago)
Author:
landauf
Message:
  • made ObjectList double-linked to allow forward- and backward-iterating. its now a LI(F/L)O list.
  • added an iterator to iterate through object-lists. you can iterate forwards and backwards.

iterating forwards is easy: you get "0 1 2 … last"
iterating backwards is a bit tricky: you still get "0" first, but then "last … 2 1".
thats caused by the structure of the for-loop: you get the first element before the iterator knows if you'll increase or decrease it

File:
1 edited

Legend:

Unmodified
Added
Removed
  • code/branches/objecthierarchie/src/ObjectList.cc

    r197 r221  
    99    {
    1010        this->first_ = 0;
     11        this->last_ = 0;
    1112    }
    1213
     
    2425    void ObjectList::add(OrxonoxClass* object)
    2526    {
    26         ObjectListElement* temp = this->first_;
    27         this->first_ = new ObjectListElement(object);
    28         this->first_->next_ = temp;
     27        if (!this->last_)
     28        {
     29            this->last_ = new ObjectListElement(object);
     30            this->first_ = this->last_;
     31        }
     32        else
     33        {
     34            ObjectListElement* temp = this->last_;
     35            this->last_ = new ObjectListElement(object);
     36            this->last_->prev_ = temp;
     37            temp->next_ = this->last_;
     38        }
    2939    }
    3040
    31     void ObjectList::remove(OrxonoxClass* object)
     41    void ObjectList::remove(OrxonoxClass* object, bool bIterateForwards)
    3242    {
    33         if (!object)
     43        if (!object || !this->first_ || !this->last_)
    3444            return;
    3545
    36         if (this->first_->object_ == object)
     46        if (this->first_ == this->last_)
    3747        {
    38             ObjectListElement* temp = this->first_->next_;
    39             delete this->first_;
    40             this->first_ = temp;
     48            if (this->first_->object_ == object)
     49            {
     50                delete this->first_;
     51                this->first_ = 0;
     52                this->last_ = 0;
     53            }
    4154
    4255            return;
    4356        }
    4457
    45         ObjectListElement* temp = this->first_;
    46         while (temp->next_)
     58        if (bIterateForwards)
    4759        {
    48             if (temp->next_->object_ == object)
     60            if (this->first_->object_ == object)
    4961            {
    50                 ObjectListElement* temp2 = temp->next_->next_;
    51                 delete temp->next_;
    52                 temp->next_ = temp2;
     62                ObjectListElement* temp = this->first_->next_;
     63                delete this->first_;
     64                this->first_ = temp;
    5365
    5466                return;
    5567            }
    5668
    57             temp = temp->next_;
     69            ObjectListElement* temp = this->first_;
     70            while (temp->next_)
     71            {
     72                if (temp->next_->object_ == object)
     73                {
     74                    ObjectListElement* temp2 = temp->next_->next_;
     75                    delete temp->next_;
     76                    temp->next_ = temp2;
     77                    temp2->prev_ = temp;
     78
     79                    return;
     80                }
     81
     82                temp = temp->next_;
     83            }
     84        }
     85        else
     86        {
     87            if (this->last_->object_ == object)
     88            {
     89                ObjectListElement* temp = this->last_->prev_;
     90                delete this->last_;
     91                this->last_ = temp;
     92
     93                return;
     94            }
     95
     96            ObjectListElement* temp = this->last_;
     97            while (temp->prev_)
     98            {
     99                if (temp->prev_->object_ == object)
     100                {
     101                    ObjectListElement* temp2 = temp->prev_->prev_;
     102                    delete temp->prev_;
     103                    temp->prev_ = temp2;
     104                    temp2->next_ = temp;
     105
     106                    return;
     107                }
     108
     109                temp = temp->prev_;
     110            }
    58111        }
    59112    }
     
    67120        this->object_ = object;
    68121        this->next_ = 0;
     122        this->prev_ = 0;
    69123    }
    70124
Note: See TracChangeset for help on using the changeset viewer.