Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/unity_build/src/libraries/core/CoreIncludes.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: 5.6 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    @defgroup Factory RegisterObject() and CreateFactory()
31    @ingroup Object
32*/
33
34/**
35    @file
36    @ingroup Object Factory
37    @brief Defines several very important macros used to register objects, create factories, and to work with identifiers.
38
39    Every class needs the @c RegisterObject(class) macro in its constructor. If the class is an interface
40    or the @c BaseObject itself, it needs the macro @c RegisterRootObject(class) instead.
41
42    To allow the object being created through the factory, use the @c CreateFactory(class) macro outside
43    of the class implementation, so it gets executed statically before @c main(). This will at the same time
44    register @a class in the class-hierarchy. If you don't want @a class to be loadable, but still
45    register it, call @c CreateUnloadableFactory(class).
46
47    Example:
48    @code
49    // Create the factory for MyClass
50    CreateFactory(MyClass);
51
52    // Constructor:
53    MyClass::MyClass()
54    {
55        // Register the object in the Identifier of MyClass
56        RegisterObject(MyClass);
57    }
58    @endcode
59
60    This file also defines a number of other useful macros, like, for example, @c Class(class) which
61    returns the @ref orxonox::Identifier "Identifier" of @a class, or @c ClassByString("class") which
62    returns the Identifier of a class with name @a "class".
63
64    Example:
65    @code
66    // Assigns the Identifier of MyClass
67    Identifier* identifier = Class(MyClass);
68    @endcode
69    @code
70    // Assigns the Identifier of a class named "MyClass"
71    Identifier* identifier = ClassByString("MyClass");
72    @endcode
73*/
74
75#ifndef _CoreIncludes_H__
76#define _CoreIncludes_H__
77
78#include "CorePrereqs.h"
79
80#include "util/Debug.h"
81#include "Identifier.h"
82#include "ClassFactory.h"
83#include "ObjectList.h"
84
85
86/**
87    @brief Intern macro, containing the common parts of @c RegisterObject and @c RegisterRootObject.
88    @param ClassName The name of the class
89    @param bRootClass True if the class is directly derived from orxonox::OrxonoxClass
90*/
91#define InternRegisterObject(ClassName, bRootClass) \
92    if (ClassIdentifier<ClassName>::getIdentifier(#ClassName)->initialiseObject(this, #ClassName, bRootClass)) \
93        return; \
94    else \
95        ((void)0)
96
97/**
98    @brief Registers a newly created object in the core. Has to be called at the beginning of the constructor of @a ClassName.
99    @param ClassName The name of the class
100*/
101#define RegisterObject(ClassName) \
102    InternRegisterObject(ClassName, false)
103
104/**
105    @brief Registers a newly created object in the core. Has to be called at the beginning of the constructor of @a ClassName.
106    @param ClassName The name of the class
107
108    In contrast to RegisterObject, this is used for classes that inherit directly from
109    orxonox::OrxonoxClass, namely all interfaces and orxonox::BaseObject.
110*/
111#define RegisterRootObject(ClassName) \
112    InternRegisterObject(ClassName, true)
113
114/**
115    @brief Creates the Factory.
116    @param ClassName The name of the class
117*/
118#define CreateFactory(ClassName) \
119    Factory* _##ClassName##Factory = new orxonox::ClassFactory<ClassName>(#ClassName, true)
120
121/**
122    @brief Creates the Factory for classes which should not be loaded through XML.
123    @param ClassName The name of the class
124*/
125#define CreateUnloadableFactory(ClassName) \
126    Factory* _##ClassName##Factory = new orxonox::ClassFactory<ClassName>(#ClassName, false)
127
128/**
129    @brief Returns the Identifier of the given class.
130    @param ClassName The name of the class
131*/
132#define Class(ClassName) \
133    orxonox::ClassIdentifier<ClassName>::getIdentifier()
134
135
136namespace orxonox
137{
138    /**
139        @brief Returns the Identifier with a given name.
140        @param name The name of the class
141    */
142    inline Identifier* ClassByString(const std::string& name)
143    {
144        return Identifier::getIdentifierByString(name);
145    }
146
147    /**
148        @brief Returns the Identifier with a given lowercase name.
149        @param name The lowercase name of the class
150    */
151    inline Identifier* ClassByLowercaseString(const std::string& name)
152    {
153        return Identifier::getIdentifierByLowercaseString(name);
154    }
155
156    /**
157        @brief Returns the Identifier with a given network ID.
158        @param id The network ID of the class
159    */
160    inline Identifier* ClassByID(uint32_t id)
161    {
162        return Identifier::getIdentifierByID(id);
163    }
164
165    /**
166        @brief Returns the Identifier with a given 'this' pointer.
167        @note This of course only works with OrxonoxClasses.
168              The only use is in conjunction with macros that don't know the class type.
169        @param object Pointer to an OrxonoxClass
170    */
171    template <class T>
172    inline Identifier* ClassByObjectType(const T* object)
173    {
174        return ClassIdentifier<T>::getIdentifier();
175    }
176}
177
178#endif /* _CoreIncludes_H__ */
Note: See TracBrowser for help on using the repository browser.