Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/objecthierarchie/src/ObjectList.h @ 246

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

added "MetaObjectList", containing the list-element of the ObjectList of all classes an object is registered in. this allowes much faster deleting of objects.

File size: 4.4 KB
Line 
1#ifndef _ObjectList_H__
2#define _ObjectList_H__
3
4namespace orxonox
5{
6    class OrxonoxClass;
7
8    // ###############################
9    // ###    ObjectListElement    ###
10    // ###############################
11    template <class T>
12    class ObjectListElement
13    {
14        public:
15            ObjectListElement(T* object);
16            ~ObjectListElement();
17
18            T* object_;
19            ObjectListElement* next_;
20            ObjectListElement* prev_;
21    };
22
23    template <class T>
24    ObjectListElement<T>::ObjectListElement(T* object)
25    {
26        this->object_ = object;
27        this->next_ = 0;
28        this->prev_ = 0;
29    }
30
31    template <class T>
32    ObjectListElement<T>::~ObjectListElement()
33    {
34    }
35
36
37    // ###############################
38    // ###       ObjectList        ###
39    // ###############################
40    template <class T>
41    class ObjectList
42    {
43        public:
44            ObjectList();
45            ~ObjectList();
46            ObjectListElement<T>* add(T* object);
47            void remove(OrxonoxClass* object, bool bIterateForwards = true);
48
49            ObjectListElement<T>* first_;
50            ObjectListElement<T>* last_;
51    };
52
53    template <class T>
54    ObjectList<T>::ObjectList()
55    {
56        this->first_ = 0;
57        this->last_ = 0;
58    }
59
60    template <class T>
61    ObjectList<T>::~ObjectList()
62    {
63        ObjectListElement<T>* temp;
64        while (this->first_)
65        {
66            temp = this->first_->next_;
67            delete this->first_;
68            this->first_ = temp;
69        }
70    }
71
72    template <class T>
73    ObjectListElement<T>* ObjectList<T>::add(T* object)
74    {
75        if (!this->last_)
76        {
77            this->last_ = new ObjectListElement<T>(object);
78            this->first_ = this->last_;
79        }
80        else
81        {
82            ObjectListElement<T>* temp = this->last_;
83            this->last_ = new ObjectListElement<T>(object);
84            this->last_->prev_ = temp;
85            temp->next_ = this->last_;
86        }
87
88        return this->last_;
89    }
90
91    template <class T>
92    void ObjectList<T>::remove(OrxonoxClass* object, bool bIterateForwards)
93    {
94        if (!object || !this->first_ || !this->last_)
95            return;
96
97        if (this->first_ == this->last_)
98        {
99            if (this->first_->object_ == object)
100            {
101                delete this->first_;
102                this->first_ = 0;
103                this->last_ = 0;
104            }
105
106            return;
107        }
108
109        if (bIterateForwards)
110        {
111            if (this->first_->object_ == object)
112            {
113                ObjectListElement<T>* temp = this->first_->next_;
114                delete this->first_;
115                this->first_ = temp;
116                this->first_->prev_ = 0;
117
118                return;
119            }
120
121            ObjectListElement<T>* temp = this->first_;
122            while (temp->next_)
123            {
124                if (temp->next_->object_ == object)
125                {
126                    ObjectListElement<T>* temp2 = temp->next_->next_;
127                    delete temp->next_;
128                    temp->next_ = temp2;
129                    if (temp2)
130                        temp2->prev_ = temp;
131                    else
132                        this->last_ = temp;
133
134                    return;
135                }
136
137                temp = temp->next_;
138            }
139        }
140        else
141        {
142            if (this->last_->object_ == object)
143            {
144                ObjectListElement<T>* temp = this->last_->prev_;
145                delete this->last_;
146                this->last_ = temp;
147                this->last_->next_ = 0;
148
149                return;
150            }
151
152            ObjectListElement<T>* temp = this->last_;
153            while (temp->prev_)
154            {
155                if (temp->prev_->object_ == object)
156                {
157                    ObjectListElement<T>* temp2 = temp->prev_->prev_;
158                    delete temp->prev_;
159                    temp->prev_ = temp2;
160                    if (temp2)
161                        temp2->next_ = temp;
162                    else
163                        this->first_ = temp;
164
165                    return;
166                }
167
168                temp = temp->prev_;
169            }
170        }
171    }
172}
173
174#endif
Note: See TracBrowser for help on using the repository browser.