Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/unity_build/src/libraries/core/ObjectListBase.h @ 8672

Last change on this file since 8672 was 8672, checked in by rgrieder, 13 years ago

Removed some includes in the Core header files.
Also removed SubclassIdentifier.h from CoreIncludes (if you ever need an SCI, you will probably use it in a class definition anyway).

  • Property svn:eol-style set to native
File size: 6.3 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Fabian 'x3n' Landau
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29/**
30    @file
31    @ingroup Object ObjectList
32    @brief Declaration of the ObjectListBase class which stores all objects of each class.
33
34    orxonox::ObjectListBase is a double-linked list, used by @ref orxonox::Identifier "Identifiers"
35    to store all objects of a given class. Newly created objects are added to the list through the
36    @c RegisterObject() macro in the constructor.
37*/
38
39#ifndef _ObjectListBase_H__
40#define _ObjectListBase_H__
41
42#include "CorePrereqs.h"
43#include <vector>
44
45namespace orxonox
46{
47    // ###############################
48    // ###  ObjectListBaseElement  ###
49    // ###############################
50    /// The list-element of the ObjectListBase
51    class _CoreExport ObjectListBaseElement
52    {
53        public:
54            /**
55                @brief Constructor: Creates the list-element with an object.
56                @param objectBase The object to store
57            */
58            ObjectListBaseElement(OrxonoxClass* objectBase) : next_(0), prev_(0), objectBase_(objectBase) {}
59
60            ObjectListBaseElement* next_;       //!< The next element in the list
61            ObjectListBaseElement* prev_;       //!< The previous element in the list
62            OrxonoxClass* objectBase_;
63    };
64
65
66    // ###############################
67    // ###    ObjectListElement    ###
68    // ###############################
69    /// The list-element that actually contains the object
70    template <class T>
71    class ObjectListElement : public ObjectListBaseElement
72    {
73        public:
74            ObjectListElement(T* object) : ObjectListBaseElement(static_cast<OrxonoxClass*>(object)), object_(object) {}
75            T* object_;              //!< The object
76    };
77
78
79    // ###############################
80    // ###     ObjectListBase      ###
81    // ###############################
82    /**
83        @brief The ObjectListBase contains all objects of a given class.
84
85        The ObjectListBase is used by Identifiers to store all objects of their class.
86        You can use Identifier::getObjects() to get the object-list from an Identifier.
87        Use @ref Iterator "Iterator<T>" to iterate through them.
88
89        Alternatively you can also use the static helper class @ref orxonox::ObjectList "ObjectList<T>"
90        to get the list of all objects of type @a T. Use @ref ObjectListIterator "ObjectListIterator<T>"
91        or @ref Iterator "Iterator<T>" to iterate through them.
92    */
93    class _CoreExport ObjectListBase
94    {
95        friend class MetaObjectListElement;
96
97        public:
98            ObjectListBase(Identifier* identifier);
99            ~ObjectListBase();
100
101            ObjectListBaseElement* add(ObjectListBaseElement* element);
102
103            /// Helper struct, used to export an element and the list to an instance of Iterator.
104            struct Export
105            {
106                Export(ObjectListBase* list, ObjectListBaseElement* element) : list_(list), element_(element) {}
107                ObjectListBase* list_;
108                ObjectListBaseElement* element_;
109            };
110
111            /// Returns a pointer to the first element in the list. Works only with Iterator.
112            inline Export begin() { return ObjectListBase::Export(this, this->first_); }
113            /// Returns a pointer to the element after the last element in the list. Works only with Iterator.
114            inline Export end() { return ObjectListBase::Export(this, 0); }
115            /// Returns a pointer to the last element in the list. Works only with Iterator.
116            inline Export rbegin() { return ObjectListBase::Export(this, this->last_); }
117            /// Returns a pointer to the element in front of the first element in the list. Works only with Iterator.
118            inline Export rend() { return ObjectListBase::Export(this, 0); }
119
120            inline void registerIterator(void* iterator) { this->iterators_.push_back(iterator); }
121            inline void unregisterIterator(void* iterator)
122            {
123                for (unsigned int i = 0; i < this->iterators_.size(); ++i)
124                {
125                    if (iterators_[i] == iterator)
126                    {
127                        iterators_.erase(iterators_.begin() + i);
128                        break;
129                    }
130                }
131            }
132            inline void registerObjectListIterator(void* iterator) { this->objectListIterators_.push_back(iterator); }
133            inline void unregisterObjectListIterator(void* iterator)
134            {
135                for (unsigned int i = 0; i < this->objectListIterators_.size(); ++i)
136                {
137                    if (objectListIterators_[i] == iterator)
138                    {
139                        objectListIterators_.erase(objectListIterators_.begin() + i);
140                        break;
141                    }
142                }
143            }
144            void notifyIterators(OrxonoxClass* object) const;
145
146            inline Identifier* getIdentifier() const { return this->identifier_; }
147
148        private:
149            Identifier* identifier_;                 //!< The Iterator owning this list
150            ObjectListBaseElement* first_;           //!< The first element in the list
151            ObjectListBaseElement* last_;            //!< The last element in the list
152            std::vector<void*> iterators_;           //!< A list of Iterators pointing on an element in this list
153            std::vector<void*> objectListIterators_; //!< A list of ObjectListIterators pointing on an element in this list
154    };
155}
156
157#endif /* _ObjectListBase_H__ */
Note: See TracBrowser for help on using the repository browser.