Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/core/src/orxonox/core/CoreIncludes.h @ 813

Last change on this file since 813 was 813, checked in by landauf, 16 years ago
  • removed IdentifierList and replaced it by a std::list
  • changed several doxygen tags
File size: 6.1 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *
4 *
5 *   License notice:
6 *
7 *   This program is free software; you can redistribute it and/or
8 *   modify it under the terms of the GNU General Public License
9 *   as published by the Free Software Foundation; either version 2
10 *   of the License, or (at your option) any later version.
11 *
12 *   This program is distributed in the hope that it will be useful,
13 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
14 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 *   GNU General Public License for more details.
16 *
17 *   You should have received a copy of the GNU General Public License
18 *   along with this program; if not, write to the Free Software
19 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
20 *
21 *   Author:
22 *      Fabian 'x3n' Landau
23 *   Co-authors:
24 *      ...
25 *
26 */
27
28/**
29    @file CoreIncludes.h
30    @brief Definition of macros and typedefs.
31
32    Every class needs the RegisterObject(class) macro in its constructor. If the class is an interface
33    or the BaseObject itself, it needs the macro RegisterRootObject(class) instead.
34
35    To allow the object being created through the factory, use the CreateFactory(class) macro outside
36    the of the class implementation, so it gets executed before main().
37*/
38
39#ifndef _CoreIncludes_H__
40#define _CoreIncludes_H__
41
42#include "CorePrereqs.h"
43
44// All needed header-files
45#include "Identifier.h"
46#include "ClassManager.h"
47#include "Factory.h"
48#include "ClassFactory.h"
49#include "Iterator.h"
50#include "OrxonoxClass.h"
51#include "ConfigValueContainer.h"
52#include "Debug.h"
53
54
55// All needed macros
56/**
57    @brief Intern macro, containing the common parts of RegisterObject and RegisterRootObject.
58    @param ClassName The name of the class
59    @param bRootClass True if the class is directly derived from OrxonoxClass
60*/
61#define InternRegisterObject(ClassName, bRootClass) \
62    this->setIdentifier(orxonox::ClassManager<ClassName>::getIdentifier()->registerClass(this->getParents(), #ClassName, bRootClass)); \
63    if (orxonox::Identifier::isCreatingHierarchy() && this->getParents()) \
64        this->getParents()->insert(this->getParents()->end(), this->getIdentifier()); \
65    orxonox::ClassManager<ClassName>::getIdentifier()->addObject(this)
66
67/**
68    @brief Intern macro, containing the specific part of RegisterRootObject.
69    @param ClassName The name of the class
70*/
71#define InternRegisterRootObject(ClassName) \
72    if (orxonox::Identifier::isCreatingHierarchy() && !this->getParents()) \
73        this->createParents(); \
74    InternRegisterObject(ClassName, true)
75
76/**
77    @brief RegisterObject - with and without debug output.
78    @param ClassName The name of the class
79*/
80#define RegisterObject(ClassName) \
81    COUT(4) << "*** Register Object: " << #ClassName << std::endl; \
82    InternRegisterObject(ClassName, false)
83
84/**
85    @brief RegisterRootObject - with and without debug output.
86    @param ClassName The name of the class
87*/
88#define RegisterRootObject(ClassName) \
89    COUT(4) << "*** Register Root-Object: " << #ClassName << std::endl; \
90    InternRegisterRootObject(ClassName)
91
92/**
93    @brief Exports the necessary templates in order to make them available to all libraries.
94    @param ClassName The name of the Class
95    @param LibraryName The name of the Library
96*/
97#define ExportClass(ClassName, LibraryName) \
98    template class _##LibraryName##Export orxonox::ClassIdentifier<ClassName>; \
99    template class _##LibraryName##Export orxonox::ObjectList<ClassName>; \
100    template class _##LibraryName##Export orxonox::ClassFactory<ClassName>
101
102/**
103    @brief Exports the necessary templates in order to make them available to all libraries.
104    @param ClassName The name of the Class
105    @param LibraryName The name of the Library
106*/
107#define ExportAbstractClass(ClassName, LibraryName) \
108    template class _##LibraryName##Export orxonox::ClassIdentifier<ClassName>; \
109    template class _##LibraryName##Export orxonox::ObjectList<ClassName>
110
111/**
112    @brief Returns the Identifier of the given class.
113    @param ClassName The name of the class
114*/
115#define Class(ClassName) \
116    ClassManager<ClassName>::getIdentifier()
117
118/**
119    @brief Creates the entry in the Factory.
120    @param ClassName The name of the class
121*/
122#define CreateFactory(ClassName) \
123    bool bCreated##ClassName##Factory = orxonox::ClassFactory<ClassName>::create(#ClassName)
124
125/**
126    @brief Returns the Identifier with either a given name or a given network ID through the factory.
127    @param StringOrInt The name or the network ID of the class
128*/
129#define ID(StringOrInt) \
130    orxonox::Factory::getIdentifier(StringOrInt)
131
132/**
133    @brief Assigns the value, defined in the config-file, to the variable (or the default-value, if there is no entry in the file).
134    @param varname The name of the variable
135    @param defvalue The default-value of the variable
136*/
137#define SetConfigValue(varname, defvalue) \
138    orxonox::ConfigValueContainer* container##varname = this->getIdentifier()->getConfigValueContainer(#varname); \
139    if (!container##varname) \
140    { \
141        container##varname = new orxonox::ConfigValueContainer(this->getIdentifier()->getName(), #varname, varname = defvalue); \
142        this->getIdentifier()->setConfigValueContainer(#varname, container##varname); \
143    } \
144    container##varname->getValue(&varname)
145
146/**
147    @brief Sets the variable and the config-file entry back to the previously defined default-value.
148    @param varname The name of the variable
149*/
150#define ResetConfigValue(varname) \
151    orxonox::ConfigValueContainer* container##varname##reset = this->getIdentifier()->getConfigValueContainer(#varname); \
152    if (container##varname##reset) \
153    { \
154        container##varname##reset->resetConfigValue(); \
155        container##varname##reset->getValue(&varname); \
156    } \
157    else \
158        COUT(2) << "Warning: Couldn't reset variable " << #varname << ", corresponding container doesn't exist." << std::endl
159
160#endif /* _CoreIncludes_H__ */
Note: See TracBrowser for help on using the repository browser.