Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/pickup3/src/libraries/core/OrxonoxClass.h @ 6514

Last change on this file since 6514 was 6497, checked in by dafrick, 15 years ago

Fixed bug in clone() (Argument needed to be as reference). Pickups seem to be working now (after very sporadic testing), more systematic testing (and probably still some more bug fixes) will follow.

  • Property svn:eol-style set to native
File size: 7.4 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#include "Super.h"
42
43#include <set>
44#include <vector>
45
46/**
47@def CCOUT
48    Acts almost exactly like COUT(x), but prepends "ClassName: "
49*/
50#define CCOUT(level) \
51    COUT(level) << this->getIdentifier()->getName() << ": "
52
53namespace orxonox
54{
55    //! The class all objects and interfaces of the game-logic (not the engine) are derived from.
56    /**
57        The BaseObject and Interfaces are derived with 'virtual public OrxonoxClass' from OrxonoxClass.
58        OrxonoxClass is needed to create the class-hierarchy at startup and to store the Identifier and the MetaObjectList.
59    */
60    class _CoreExport OrxonoxClass
61    {
62        template <class T>
63        friend class ClassIdentifier;
64
65        template <class T>
66        friend class SmartPtr;
67
68        template <class T>
69        friend class WeakPtr;
70
71        public:
72            OrxonoxClass();
73            virtual ~OrxonoxClass();
74
75            void destroy();
76            void unregisterObject();
77
78            /** @brief Function to collect the SetConfigValue-macro calls. */
79            void setConfigValues() {};
80
81            /** @brief Returns the Identifier of the object. @return The Identifier */
82            inline Identifier* getIdentifier() const { return this->identifier_; }
83
84            bool isA(const Identifier* identifier);
85            bool isExactlyA(const Identifier* identifier);
86            bool isChildOf(const Identifier* identifier);
87            bool isDirectChildOf(const Identifier* identifier);
88            bool isParentOf(const Identifier* identifier);
89            bool isDirectParentOf(const Identifier* identifier);
90
91            template <class B> inline bool isA(const SubclassIdentifier<B>* identifier)
92                { return this->isA(*identifier); }
93            template <class B> inline bool isExactlyA(const SubclassIdentifier<B>* identifier)
94                { return this->isExactlyA(*identifier); }
95            template <class B> inline bool isChildOf(const SubclassIdentifier<B>* identifier)
96                { return this->isChildOf(*identifier); }
97            template <class B> inline bool isDirectChildOf(const SubclassIdentifier<B>* identifier)
98                { return this->isDirectChildOf(*identifier); }
99            template <class B> inline bool isParentOf(const SubclassIdentifier<B>* identifier)
100                { return this->isParentOf(*identifier); }
101            template <class B> inline bool isDirectParentOf(const SubclassIdentifier<B>* identifier)
102                { return this->isDirectParentOf(*identifier); }
103
104            bool isA(const OrxonoxClass* object);
105            bool isExactlyA(const OrxonoxClass* object);
106            bool isChildOf(const OrxonoxClass* object);
107            bool isDirectChildOf(const OrxonoxClass* object);
108            bool isParentOf(const OrxonoxClass* object);
109            bool isDirectParentOf(const OrxonoxClass* object);
110           
111            virtual void clone(OrxonoxClass*& item) {}
112
113            inline unsigned int getReferenceCount() const
114                { return this->referenceCount_; }
115
116            /**
117            @brief
118                Returns a valid pointer of any derived type that is
119                registered in the class hierarchy.
120            @return
121                Returns NULL if the no pointer was found.
122            */
123            FORCEINLINE void* getDerivedPointer(unsigned int classID)
124            {
125                for (int i = this->objectPointers_.size() - 1; i >= 0; --i)
126                {
127                    if (this->objectPointers_[i].first == classID)
128                        return this->objectPointers_[i].second;
129                }
130                return NULL;
131            }
132
133            //! Version of getDerivedPointer with template
134            template <class T> FORCEINLINE T* getDerivedPointer(unsigned int classID)
135            {   return static_cast<T*>(this->getDerivedPointer(classID));   }
136            //! Const version of getDerivedPointer with template
137            template <class T> FORCEINLINE const T* getDerivedPointer(unsigned int classID) const
138            {   return const_cast<OrxonoxClass*>(this)->getDerivedPointer<T>(classID);   }
139
140        protected:
141            virtual void preDestroy() {}
142
143        private:
144            /** @brief Increments the reference counter (for smart pointers). */
145            inline void incrementReferenceCount()
146                { ++this->referenceCount_; }
147            /** @brief Decrements the reference counter (for smart pointers). */
148            inline void decrementReferenceCount()
149            {
150                --this->referenceCount_;
151                if (this->referenceCount_ == 0 && this->requestedDestruction_)
152                    this->destroy();
153            }
154
155            /** @brief Register a weak pointer which points to this object. */
156            template <class T>
157            inline void registerWeakPtr(WeakPtr<T>* pointer)
158                { this->weakPointers_.insert(reinterpret_cast<WeakPtr<OrxonoxClass>*>(pointer)); }
159            /** @brief Unegister a weak pointer which pointed to this object before. */
160            template <class T>
161            inline void unregisterWeakPtr(WeakPtr<T>* pointer)
162                { this->weakPointers_.erase(reinterpret_cast<WeakPtr<OrxonoxClass>*>(pointer)); }
163
164            Identifier* identifier_;                   //!< The Identifier of the object
165            std::set<const Identifier*>* parents_;     //!< List of all parents of the object
166            MetaObjectList* metaList_;                 //!< MetaObjectList, containing all ObjectLists and ObjectListElements the object is registered in
167            int referenceCount_;                       //!< Counts the references from smart pointers to this object
168            bool requestedDestruction_;                //!< Becomes true after someone called delete on this object
169            std::set<WeakPtr<OrxonoxClass>*> weakPointers_; //!< All weak pointers which point to this object (and like to get notified if it dies)
170
171            //! 'Fast map' that holds this-pointers of all derived types
172            std::vector<std::pair<unsigned int, void*> > objectPointers_;
173    };
174   
175    SUPER_FUNCTION(11, OrxonoxClass, clone, true);
176   
177}
178
179#endif /* _OrxonoxClass_H__ */
Note: See TracBrowser for help on using the repository browser.