Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/libraries/core/CoreIncludes.h @ 8707

Last change on this file since 8707 was 8706, checked in by dafrick, 13 years ago

Merging presentation branch back into trunk.
There are many new features and also a lot of other changes and bugfixes, if you want to know, digg through the svn log.
Not everything is yet working as it should, but it should be fairly stable. If you habe any bug reports, just send me an email.

  • Property svn:eol-style set to native
File size: 5.7 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 "SubclassIdentifier.h"
83#include "ClassFactory.h"
84#include "ObjectList.h"
85
86
87/**
88    @brief Intern macro, containing the common parts of @c RegisterObject and @c RegisterRootObject.
89    @param ClassName The name of the class
90    @param bRootClass True if the class is directly derived from orxonox::OrxonoxClass
91*/
92#define InternRegisterObject(ClassName, bRootClass) \
93    if (ClassIdentifier<ClassName>::getIdentifier(#ClassName)->initialiseObject(this, #ClassName, bRootClass)) \
94        return; \
95    else \
96        ((void)0)
97
98/**
99    @brief Registers a newly created object in the core. Has to be called at the beginning of the constructor of @a ClassName.
100    @param ClassName The name of the class
101*/
102#define RegisterObject(ClassName) \
103    InternRegisterObject(ClassName, false)
104
105/**
106    @brief Registers a newly created object in the core. Has to be called at the beginning of the constructor of @a ClassName.
107    @param ClassName The name of the class
108
109    In contrast to RegisterObject, this is used for classes that inherit directly from
110    orxonox::OrxonoxClass, namely all interfaces and orxonox::BaseObject.
111*/
112#define RegisterRootObject(ClassName) \
113    InternRegisterObject(ClassName, true)
114
115/**
116    @brief Creates the Factory.
117    @param ClassName The name of the class
118*/
119#define CreateFactory(ClassName) \
120    Factory* _##ClassName##Factory = new orxonox::ClassFactory<ClassName>(#ClassName, true)
121
122/**
123    @brief Creates the Factory for classes which should not be loaded through XML.
124    @param ClassName The name of the class
125*/
126#define CreateUnloadableFactory(ClassName) \
127    Factory* _##ClassName##Factory = new orxonox::ClassFactory<ClassName>(#ClassName, false)
128
129/**
130    @brief Returns the Identifier of the given class.
131    @param ClassName The name of the class
132*/
133#define Class(ClassName) \
134    orxonox::ClassIdentifier<ClassName>::getIdentifier()
135
136
137namespace orxonox
138{
139    /**
140        @brief Returns the Identifier with a given name.
141        @param name The name of the class
142    */
143    inline Identifier* ClassByString(const std::string& name)
144    {
145        return Identifier::getIdentifierByString(name);
146    }
147
148    /**
149        @brief Returns the Identifier with a given lowercase name.
150        @param name The lowercase name of the class
151    */
152    inline Identifier* ClassByLowercaseString(const std::string& name)
153    {
154        return Identifier::getIdentifierByLowercaseString(name);
155    }
156
157    /**
158        @brief Returns the Identifier with a given network ID.
159        @param id The network ID of the class
160    */
161    inline Identifier* ClassByID(uint32_t id)
162    {
163        return Identifier::getIdentifierByID(id);
164    }
165
166    /**
167        @brief Returns the Identifier with a given 'this' pointer.
168        @note This of course only works with OrxonoxClasses.
169              The only use is in conjunction with macros that don't know the class type.
170        @param object Pointer to an OrxonoxClass
171    */
172    template <class T>
173    inline Identifier* ClassByObjectType(const T*)
174    {
175        return ClassIdentifier<T>::getIdentifier();
176    }
177}
178
179#endif /* _CoreIncludes_H__ */
Note: See TracBrowser for help on using the repository browser.