Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/objecthierarchie/src/ObjectList.cc @ 222

Last change on this file since 222 was 222, checked in by landauf, 16 years ago

fixed a small bug in the double-linked list

File size: 3.4 KB
Line 
1#include "ObjectList.h"
2
3namespace orxonox
4{
5    // ###############################
6    // ###       ObjectList        ###
7    // ###############################
8    ObjectList::ObjectList()
9    {
10        this->first_ = 0;
11        this->last_ = 0;
12    }
13
14    ObjectList::~ObjectList()
15    {
16        ObjectListElement* temp;
17        while (this->first_)
18        {
19            temp = this->first_->next_;
20            delete this->first_;
21            this->first_ = temp;
22        }
23    }
24
25    void ObjectList::add(OrxonoxClass* object)
26    {
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        }
39    }
40
41    void ObjectList::remove(OrxonoxClass* object, bool bIterateForwards)
42    {
43        if (!object || !this->first_ || !this->last_)
44            return;
45
46        if (this->first_ == this->last_)
47        {
48            if (this->first_->object_ == object)
49            {
50                delete this->first_;
51                this->first_ = 0;
52                this->last_ = 0;
53            }
54
55            return;
56        }
57
58        if (bIterateForwards)
59        {
60            if (this->first_->object_ == object)
61            {
62                ObjectListElement* temp = this->first_->next_;
63                delete this->first_;
64                this->first_ = temp;
65
66                return;
67            }
68
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                    if (temp2)
78                        temp2->prev_ = temp;
79                    else
80                        this->last_ = temp;
81
82                    return;
83                }
84
85                temp = temp->next_;
86            }
87        }
88        else
89        {
90            if (this->last_->object_ == object)
91            {
92                ObjectListElement* temp = this->last_->prev_;
93                delete this->last_;
94                this->last_ = temp;
95
96                return;
97            }
98
99            ObjectListElement* temp = this->last_;
100            while (temp->prev_)
101            {
102                if (temp->prev_->object_ == object)
103                {
104                    ObjectListElement* temp2 = temp->prev_->prev_;
105                    delete temp->prev_;
106                    temp->prev_ = temp2;
107                    if (temp2)
108                        temp2->next_ = temp;
109                    else
110                        this->first_ = temp;
111
112                    return;
113                }
114
115                temp = temp->prev_;
116            }
117        }
118    }
119
120
121    // ###############################
122    // ###    ObjectListElement    ###
123    // ###############################
124    ObjectListElement::ObjectListElement(OrxonoxClass* object)
125    {
126        this->object_ = object;
127        this->next_ = 0;
128        this->prev_ = 0;
129    }
130
131    ObjectListElement::~ObjectListElement()
132    {
133    }
134}
Note: See TracBrowser for help on using the repository browser.