Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/core5/src/libraries/core/OrxonoxClass.h @ 5791

Last change on this file since 5791 was 5791, checked in by landauf, 15 years ago

Added destroy() function to OrxonoxClass.
Removed destroy() functions from some subclasses.
Expanded Timer to accept Functors of other classes too.

  • Property svn:eol-style set to native
File size: 6.0 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    @brief Declaration of the OrxonoxClass Class.
32
33    All objects and interfaces of the game-logic (not the engine) are derived from OrxonoxClass.
34    It stores the Identifier and the MetaObjectList and has all needed functions to create and use the class-hierarchy.
35*/
36
37#ifndef _OrxonoxClass_H__
38#define _OrxonoxClass_H__
39
40#include "CorePrereqs.h"
41
42#include <set>
43#include <vector>
44
45namespace orxonox
46{
47    //! The class all objects and interfaces of the game-logic (not the engine) are derived from.
48    /**
49        The BaseObject and Interfaces are derived with 'virtual public OrxonoxClass' from OrxonoxClass.
50        OrxonoxClass is needed to create the class-hierarchy at startup and to store the Identifier and the MetaObjectList.
51    */
52    class _CoreExport OrxonoxClass
53    {
54        template <class T>
55        friend class ClassIdentifier;
56
57        public:
58            OrxonoxClass();
59            virtual ~OrxonoxClass();
60
61            void destroy();
62
63            /** @brief Function to collect the SetConfigValue-macro calls. */
64            void setConfigValues() {};
65
66            /** @brief Returns the Identifier of the object. @return The Identifier */
67            inline Identifier* getIdentifier() const { return this->identifier_; }
68
69            bool isA(const Identifier* identifier);
70            bool isExactlyA(const Identifier* identifier);
71            bool isChildOf(const Identifier* identifier);
72            bool isDirectChildOf(const Identifier* identifier);
73            bool isParentOf(const Identifier* identifier);
74            bool isDirectParentOf(const Identifier* identifier);
75
76            template <class B> inline bool isA(const SubclassIdentifier<B>* identifier)
77                { return this->isA(*identifier); }
78            template <class B> inline bool isExactlyA(const SubclassIdentifier<B>* identifier)
79                { return this->isExactlyA(*identifier); }
80            template <class B> inline bool isChildOf(const SubclassIdentifier<B>* identifier)
81                { return this->isChildOf(*identifier); }
82            template <class B> inline bool isDirectChildOf(const SubclassIdentifier<B>* identifier)
83                { return this->isDirectChildOf(*identifier); }
84            template <class B> inline bool isParentOf(const SubclassIdentifier<B>* identifier)
85                { return this->isParentOf(*identifier); }
86            template <class B> inline bool isDirectParentOf(const SubclassIdentifier<B>* identifier)
87                { return this->isDirectParentOf(*identifier); }
88
89            bool isA(const OrxonoxClass* object);
90            bool isExactlyA(const OrxonoxClass* object);
91            bool isChildOf(const OrxonoxClass* object);
92            bool isDirectChildOf(const OrxonoxClass* object);
93            bool isParentOf(const OrxonoxClass* object);
94            bool isDirectParentOf(const OrxonoxClass* object);
95
96            inline unsigned int getReferenceCount() const
97                { return this->referenceCount_; }
98
99            /**
100            @brief
101                Returns a valid pointer of any derived type that is
102                registered in the class hierarchy.
103            @return
104                Returns NULL if the no pointer was found.
105            */
106            template <class T>
107            FORCEINLINE T* getDerivedPointer(unsigned int classID)
108            {
109                for (int i = this->objectPointers_.size() - 1; i >= 0; --i)
110                {
111                    if (this->objectPointers_[i].first == classID)
112                        return static_cast<T*>(this->objectPointers_[i].second);
113                }
114                return NULL;
115            }
116            //! Const version of getDerivedPointer
117            template <class T>
118            FORCEINLINE const T* getDerivedPointer(unsigned int classID) const
119            {
120                return const_cast<OrxonoxClass*>(this)->getDerivedPointer<T>(classID);
121            }
122
123        private:
124            /** @brief Increments the reference counter (for smart pointers). */
125            inline void incrementReferenceCount()
126                { ++this->referenceCount_; }
127            /** @brief Decrements the reference counter (for smart pointers). */
128            inline void decrementReferenceCount()
129                { --this->referenceCount_; if (this->referenceCount_ == 0 && this->requestedDestruction_) { delete this; } }
130
131            Identifier* identifier_;                   //!< The Identifier of the object
132            std::set<const Identifier*>* parents_;     //!< List of all parents of the object
133            MetaObjectList* metaList_;                 //!< MetaObjectList, containing all ObjectLists and ObjectListElements the object is registered in
134            unsigned int referenceCount_;              //!< Counts the references from smart pointers to this object
135            bool requestedDestruction_;                //!< Becomes true after someone called delete on this object
136
137            //! 'Fast map' that holds this-pointers of all derived types
138            std::vector<std::pair<unsigned int, void*> > objectPointers_;
139    };
140}
141
142#endif /* _OrxonoxClass_H__ */
Note: See TracBrowser for help on using the repository browser.