Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/libraries/core/class/Super.h

Last change on this file was 11071, checked in by landauf, 9 years ago

merged branch cpp11_v3 back to trunk

  • Property svn:eol-style set to native
File size: 28.2 KB
RevLine 
[1679]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
[1684]29/**
[7401]30    @defgroup Super Super
31    @ingroup Class
32*/
33
34/**
[2171]35    @file
[7401]36    @ingroup Class Super
37    @brief Definition of all super-function related macros, used to call functions of the base class.
[1684]38
[7401]39    This file defines all macros needed to add a new "super-function". If you add
40    a super-function, you can call <tt>SUPER(myclass, functionname, arguments)</tt>
41    inside your code and the function of the parent-class gets called. This is comparable
42    to <tt>super.functionname(arguments)</tt> in Java or other languages.
[1684]43
[7401]44    This works only with virtual functions that return nothing (@c void) and belong to
45    classes that have an @ref orxonox::Identifier "Identifier". Arguments however are
46    supported, there's no limitation for their number and type, except that the type has
47    to be known in Super.h.
[1684]48
[7401]49    To add a new super-function, you have to process 4 steps:
[1684]50
[7401]51    -# Add a new @c SUPER macro <br />
52       This allows you to call the super-function in your code. <br />
53       Location: This file (Super.h), marked with "--> HERE <--" comments (1/3)
54    -# Call the @c SUPER_FUNCTION_GLOBAL_DECLARATION_PART1/2 macros. <br />
55       This defines some global classes and templates, needed to create and call the super-functions. <br />
56       Location: This file (Super.h), marked with "--> HERE <--" comments (2/3)
57    -# Call the @c SUPER_INTRUSIVE_DECLARATION macro. <br />
58       This will be included into the declaration of @c ClassIdentifier<T>. <br />
59       Location: This file (Super.h), marked with "--> HERE <--" comments (3/3)
60    -# Call the @c SUPER_FUNCTION macro. <br />
[1684]61       This defines a partially specialized template that will decide if a class is "super" to another class.
[7401]62       If the check returns true, a @c SuperFunctionCaller gets created, which will be used by the @c SUPER macro.
[1684]63       You have to add this into the header-file of the baseclass of the super-function (the class that first
64       implements the function), below the class declaration. You can't call it directly in this file, because
[7401]65       otherwise you had to include the headerfile right here, which would cause some ugly back-dependencies,
66       include loops and slower compilation. <br />
67       Dont forget to include Super.h in the header-file. <br />
[1684]68       Location: The header-file of the baseclass (Baseclass.h), below the class declaration
69*/
70
[1679]71#ifndef _Super_H__
72#define _Super_H__
73
[9563]74#include "core/CorePrereqs.h"
[8858]75#include "util/Output.h"
[1679]76
[1684]77///////////////////////
78// Macro definitions //
79///////////////////////
80
81//// Common macros ////
82
83    /**
84        @brief Declares a new super-function by creating a specialized template. Add this below the class declaration of the baseclass.
85        @param functionnumber Each super-function needs a unique number, starting with zero, increasing by one
86        @param baseclass The baseclass of the super-function (~the root)
87        @param functionname The name of the super-function
88        @param purevirtualbase "true" if the function is pure virtual in the baseclass, "false" if the function is implemented (without "")
89    */
90    #define SUPER_FUNCTION(functionnumber, baseclass, functionname, purevirtualbase) \
91        template <class T, int templatehack2> \
92        struct SuperFunctionCondition<functionnumber, T, 0, templatehack2> \
93        { \
[8351]94            static void superCheck() \
[1684]95            { \
[11071]96                SuperFunctionCondition<functionnumber, T, 0, templatehack2>::apply(static_cast<T*>(nullptr)); \
[8351]97                SuperFunctionCondition<functionnumber + 1, T, 0, templatehack2>::superCheck(); \
[1684]98            } \
99            \
[8706]100            static void apply(void*) {} \
[2662]101            \
[8706]102            static void apply(baseclass*) \
[1684]103            { \
104                ClassIdentifier<T>* identifier = ClassIdentifier<T>::getIdentifier(); \
[11071]105                for (const Identifier* child : identifier->getDirectChildren()) \
[1684]106                { \
[11071]107                    if (((ClassIdentifier<T>*)child)->bSuperFunctionCaller_##functionname##_isFallback_ && ((ClassIdentifier<T>*)child)->superFunctionCaller_##functionname##_) \
[2662]108                    { \
[11071]109                        delete ((ClassIdentifier<T>*)child)->superFunctionCaller_##functionname##_; \
110                        ((ClassIdentifier<T>*)child)->superFunctionCaller_##functionname##_ = nullptr; \
111                        ((ClassIdentifier<T>*)child)->bSuperFunctionCaller_##functionname##_isFallback_ = false; \
[2662]112                    } \
113                    \
[11071]114                    if (!((ClassIdentifier<T>*)child)->superFunctionCaller_##functionname##_) \
[1684]115                    { \
[11071]116                        orxout(verbose, context::super) << "Added SuperFunctionCaller for " << #functionname << ": " << ClassIdentifier<T>::getIdentifier()->getName() << " <- " << ((ClassIdentifier<T>*)child)->getName() << endl; \
117                        ((ClassIdentifier<T>*)child)->superFunctionCaller_##functionname##_ = new SuperFunctionClassCaller_##functionname <T>; \
[1684]118                    } \
[11071]119                    else if (((ClassIdentifier<T>*)child)->superFunctionCaller_##functionname##_->getParentIdentifier() != ClassIdentifier<T>::getIdentifier()) \
120                        orxout(internal_warning, context::super) << "SuperFunctionCaller for " << #functionname << " in " << ((ClassIdentifier<T>*)child)->getName() << " calls function of " << ((ClassIdentifier<T>*)child)->superFunctionCaller_##functionname##_->getParentIdentifier()->getName() << " but " << ClassIdentifier<T>::getIdentifier()->getName() << " is also possible (do you use multiple inheritance?)" << endl; \
[1684]121                } \
122            } \
123        }; \
124        \
125        SUPER_FUNCTION_PUREVIRTUAL_WORKAROUND##purevirtualbase(functionnumber, baseclass)
126
127    #define SUPER_FUNCTION_PUREVIRTUAL_WORKAROUND0(functionnumber, baseclass) SUPER_FUNCTION_PUREVIRTUAL_WORKAROUNDfalse(functionnumber, baseclass)
128    #define SUPER_FUNCTION_PUREVIRTUAL_WORKAROUND1(functionnumber, baseclass) SUPER_FUNCTION_PUREVIRTUAL_WORKAROUNDtrue(functionnumber, baseclass)
129    #define SUPER_FUNCTION_PUREVIRTUAL_WORKAROUNDfalse(functionnumber, baseclass)
130    #define SUPER_FUNCTION_PUREVIRTUAL_WORKAROUNDtrue(functionnumber, baseclass) \
131        template <int templatehack2> \
132        struct SuperFunctionCondition<functionnumber, baseclass, 0, templatehack2> \
133        { \
[8351]134            static void superCheck() \
[1684]135            { \
[8351]136                SuperFunctionCondition<functionnumber + 1, baseclass, 0, templatehack2>::superCheck(); \
[1684]137            } \
138        };
139
140
141    /*
142    //// Comments about the macro ////
143
144        // Partially specialized template (templatehack is now specialized too).
145        //
146        // This ensures the compiler takes THIS template if the header-file of the super-function
147        // is included. In any other case, the compiler just uses the fallback template which is
148        // defined in this file.
149        template <class T, templatehack2>
150        struct SuperFunctionCondition<functionnumber, T, 0, templatehack2>
151        {
[8351]152            static void superCheck()
[1684]153            {
154                // This call to the apply-function is the whole check. By calling the function with
155                // a T* pointer, the right function get's called.
[11071]156                SuperFunctionCondition<functionnumber, T, 0, templatehack2>::apply(static_cast<T*>(nullptr));
[1684]157
[8351]158                // Go go the superCheck for of next super-function (functionnumber + 1)
159                SuperFunctionCondition<functionnumber + 1, T, 0, templatehack2>::superCheck();
[1684]160            }
161
162            // This function gets called if T is not a child of the baseclass.
163            // The function does nothing.
164            static void apply(void* temp) {}
165
166            // This function gets called if T is a child of the baseclass and can therefore be converted.
167            // The function adds a SuperFunctionCaller to the Identifier of all subclasses of T.
168            static void apply(baseclass* temp)
169            {
170                ClassIdentifier<T>* identifier = ClassIdentifier<T>::getIdentifier();
171
172                // Iterate through all children
[11071]173                for (const Identifier* child : identifier->getDirectChildren())
[1684]174                {
[2662]175                    // Check if the caller is a fallback-caller
[11071]176                    if (((ClassIdentifier<T>*)child)->bSuperFunctionCaller_##functionname##_isFallback_ && ((ClassIdentifier<T>*)child)->superFunctionCaller_##functionname##_)
[2662]177                    {
178                        // Delete the fallback caller an prepare to get a real caller
[11071]179                        delete ((ClassIdentifier<T>*)child)->superFunctionCaller_##functionname##_;
180                        ((ClassIdentifier<T>*)child)->superFunctionCaller_##functionname##_ = nullptr;
181                        ((ClassIdentifier<T>*)child)->bSuperFunctionCaller_##functionname##_isFallback_ = false;
[2662]182                    }
183
[1684]184                    // Check if there's not already a caller
[11071]185                    if (!((ClassIdentifier<T>*)child)->superFunctionCaller_##functionname##_)
[1684]186                    {
187                        // Add the SuperFunctionCaller
[11071]188                        orxout(verbose, context::super) << "adding functionpointer to " << ((ClassIdentifier<T>*)child)->getName() << endl;
189                        ((ClassIdentifier<T>*)child)->superFunctionCaller_##functionname##_ = new SuperFunctionClassCaller_##functionname <T>;
[1684]190                    }
[8863]191
192                    // If there is already a caller, but for another parent, print a warning
[11071]193                    else if (((ClassIdentifier<T>*)child)->superFunctionCaller_##functionname##_->getParentIdentifier() != ClassIdentifier<T>::getIdentifier())
194                        orxout(internal_warning, context::super) << "SuperFunctionCaller for " << #functionname << " in " << ((ClassIdentifier<T>*)child)->getName() << " calls function of " << ((ClassIdentifier<T>*)child)->superFunctionCaller_##functionname##_->getParentIdentifier()->getName() << " but " << ClassIdentifier<T>::getIdentifier()->getName() << " is also possible (do you use multiple inheritance?)" << endl;
[1684]195                }
196            }
197        };
198        SUPER_FUNCTION_PUREVIRTUAL_WORKAROUND##purevirtualbase
199
200
201        // The following piece of code is only added if purevirtualbase = true
202
203        // Explicit specialization of the Condition template for the baseclass to avoid
204        // errors if the function is pure virtual in the baseclass.
205        template <int templatehack2> \
206        struct SuperFunctionCondition<functionnumber, baseclass, 0, templatehack2> \
207        { \
[8351]208            // The superCheck function acts like the fallback - it advances to the check for the next super-function (functionnumber + 1)
209            static void superCheck() \
[1684]210            { \
[8351]211                SuperFunctionCondition<functionnumber + 1, baseclass, 0, templatehack2>::superCheck(); \
[1684]212            } \
213        };
214    */
215
[7401]216    /// SUPER-macro: Calls Parent::functionname(...) where Parent is the direct parent of @a classname
[3325]217    #ifdef ORXONOX_COMPILER_MSVC
218        #define SUPER(classname, functionname, ...) \
219            __super::functionname(__VA_ARGS__)
220    #else
221        #define SUPER(classname, functionname, ...) \
222            SUPER_##functionname(classname, functionname, __VA_ARGS__)
223    #endif
[1684]224
225    // helper macro: for functions without arguments
226    #define SUPER_NOARGS(classname, functionname) \
227        (*ClassIdentifier<classname>::getIdentifier()->superFunctionCaller_##functionname##_)(this)
228
229    // helper macro: for functions with arguments
230    #define SUPER_ARGS(classname, functionname, ...) \
231        (*ClassIdentifier<classname>::getIdentifier()->superFunctionCaller_##functionname##_)(this, __VA_ARGS__)
232
233
234//// Function-specific macros ////
235
236    /*
237        Add a macro for each super-function
238
239        Example (no arguments):
240        #define SUPER_myfunction(classname, functionname, ...) \
241            SUPER_NOARGS(classname, functionname)
242
243        Example (with arguments):
244        #define SUPER_myfunction(classname, functionname, ...) \
245            SUPER_ARGS(classname, functionname, __VA_ARGS__)
246    */
247
[1687]248    // (1/3) --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <--
[1684]249    #define SUPER_XMLPort(classname, functionname, ...) \
250        SUPER_ARGS(classname, functionname, __VA_ARGS__)
251
252    #define SUPER_tick(classname, functionname, ...) \
253        SUPER_ARGS(classname, functionname, __VA_ARGS__)
254
255    #define SUPER_changedActivity(classname, functionname, ...) \
256        SUPER_NOARGS(classname, functionname)
257
258    #define SUPER_changedVisibility(classname, functionname, ...) \
259        SUPER_NOARGS(classname, functionname)
[2087]260
[5929]261    #define SUPER_XMLEventPort(classname, functionname, ...) \
[2087]262        SUPER_ARGS(classname, functionname, __VA_ARGS__)
[2662]263
264    #define SUPER_changedScale(classname, functionname, ...) \
265        SUPER_NOARGS(classname, functionname)
266
267    #define SUPER_changedOwner(classname, functionname, ...) \
268        SUPER_NOARGS(classname, functionname)
269
270    #define SUPER_changedOverlayGroup(classname, functionname, ...) \
271        SUPER_NOARGS(classname, functionname)
272
273    #define SUPER_changedName(classname, functionname, ...) \
274        SUPER_NOARGS(classname, functionname)
275
[6524]276    #define SUPER_changedUsed(classname, functionname, ...) \
277        SUPER_NOARGS(classname, functionname)
[7163]278
[6524]279    #define SUPER_changedCarrier(classname, functionname, ...) \
280        SUPER_NOARGS(classname, functionname)
[7163]281
[6524]282    #define SUPER_changedPickedUp(classname, functionname, ...) \
283        SUPER_NOARGS(classname, functionname)
[7163]284
[1687]285    // (1/3) --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <--
[1684]286
287
[1679]288namespace orxonox
289{
[1684]290    /////////////////////////////////////////////////////////////////////////////////////////////////////
291    // This code gets included by Identifier.h and every other header file that needs a super-function //
292    /////////////////////////////////////////////////////////////////////////////////////////////////////
[1679]293
[1684]294    //// Common code ////
[1679]295
[1687]296        // Base templates
297        /**
298            @brief Creates the SuperFunctionCaller if T is a child of the super-functions baseclass.
299        */
[1684]300        template <int functionnumber, class T, int templatehack1, int templatehack2>
301        struct SuperFunctionCondition
[1679]302        {
[8351]303            static void superCheck() {}
[1684]304        };
[1679]305
[1687]306        /**
307            @brief Initializes the SuperFunctionCaller-pointer with zero.
308        */
309        template <int functionnumber, class T>
310        struct SuperFunctionInitialization
311        {
[8706]312            static void initialize(ClassIdentifier<T>*) {}
[1687]313        };
[1679]314
[1687]315        /**
316            @brief Deletes the SuperFunctionCaller.
317        */
318        template <int functionnumber, class T>
319        struct SuperFunctionDestruction
320        {
[8706]321            static void destroy(ClassIdentifier<T>*) {}
[1687]322        };
323
324
[1684]325    //// Function-specific code ////
326
327        /**
328            @brief Creates the needed objects and templates to call a super-function.
329            @param functionnumber Each super-function needs a unique number, starting with zero, increasing by one
330            @param functionname The name of the super-function
331            @param hasarguments "false" if the function doesn't take any arguments, "true" if it does (without "")
332            @param ... Variadic: If the function takes arguments, add them here with type and name. Example: int myvalue, float myothervalue
333        */
334        #define SUPER_FUNCTION_GLOBAL_DECLARATION_PART1(functionnumber, functionname, hasarguments, ...) \
335            template <class T, int templatehack1, int templatehack2> \
336            struct SuperFunctionCondition<functionnumber, T, templatehack1, templatehack2> \
337            { \
[8351]338                static void superCheck() \
[1684]339                { \
[8351]340                    SuperFunctionCondition<functionnumber + 1, T, templatehack1, templatehack2>::superCheck(); \
[1684]341                } \
342            }; \
343            \
[2662]344            class _CoreExport SuperFunctionCaller_##functionname \
345            { \
346                public: \
347                    virtual void operator()( SUPER_CALL_ARGUMENTS##hasarguments(__VA_ARGS__) ) = 0; \
348                    virtual ~SuperFunctionCaller_##functionname () {} \
[8863]349                    virtual Identifier* getParentIdentifier() const = 0; \
[2662]350            }; \
351            \
[1687]352            template <class T> \
[2662]353            class SuperFunctionClassCaller_purevirtualfallback_##functionname : public SuperFunctionCaller_##functionname \
354            { \
355                public: \
356                    inline void operator()( SUPER_CALL_ARGUMENTS##hasarguments(__VA_ARGS__) ) \
357                    { \
358                    } \
[8863]359                    \
360                    Identifier* getParentIdentifier() const \
361                    { \
362                        return ClassIdentifier<T>::getIdentifier(); \
363                    } \
[2662]364            }; \
365            \
366            template <class T> \
[1687]367            struct SuperFunctionInitialization<functionnumber, T> \
368            { \
369                static void initialize(ClassIdentifier<T>* identifier) \
370                { \
[2662]371                    identifier->superFunctionCaller_##functionname##_ = new SuperFunctionClassCaller_purevirtualfallback_##functionname <T>; \
372                    identifier->bSuperFunctionCaller_##functionname##_isFallback_ = true; \
[1687]373                    SuperFunctionInitialization<functionnumber + 1, T>::initialize(identifier); \
374                } \
375            }; \
376            \
377            template <class T> \
378            struct SuperFunctionDestruction<functionnumber, T> \
379            { \
380                static void destroy(ClassIdentifier<T>* identifier) \
381                { \
382                    if (identifier->superFunctionCaller_##functionname##_) \
383                        delete identifier->superFunctionCaller_##functionname##_; \
384                    SuperFunctionDestruction<functionnumber + 1, T>::destroy(identifier); \
385                } \
386            }; \
387            \
[1684]388            template <class T> \
389            class SuperFunctionClassCaller_##functionname : public SuperFunctionCaller_##functionname \
390            { \
391                public: \
392                    inline void operator()( SUPER_CALL_ARGUMENTS##hasarguments(__VA_ARGS__) ) \
393                    { \
[9348]394                        (orxonox_cast<T*>(object))->T:: functionname
[1684]395
396        /*
397            JUST ADD THE FUNCTION ARGUMENTS BETWEEN BOTH MACROS, ENCLOSED BY BRACKETS
398            EXAMPLE:
399
400              SUPER_FUNCTION_GLOBAL_DECLARATION_PART1(0, myfunction, true, int myvalue, float myothervalue) <-- !!! DONT ADD A SEMICOLON HERE !!!
401                (myvalue, myothervalue)
402              SUPER_FUNCTION_GLOBAL_DECLARATION_PART2
403        */
404
405        #define SUPER_FUNCTION_GLOBAL_DECLARATION_PART2 \
406                                                        ; \
407                    } \
[8863]408                    \
409                    Identifier* getParentIdentifier() const \
410                    { \
411                        return ClassIdentifier<T>::getIdentifier(); \
412                    } \
[1684]413            };
414
[9568]415        #define SUPER_CALL_ARGUMENTSfalse(...) Identifiable* object
416        #define SUPER_CALL_ARGUMENTS0(...)     Identifiable* object
417        #define SUPER_CALL_ARGUMENTStrue(...) Identifiable* object, __VA_ARGS__
418        #define SUPER_CALL_ARGUMENTS1(...)    Identifiable* object, __VA_ARGS__
[1684]419
420
421    /*
422    //// COMMENTS ABOUT THE MACRO ////
423
424        // Partially specialized template (templatehack not yet specialized, this
425        // will be done by the real condition in the header-file of the super-function)
426        // Only used as fallback
427        template <class T, int templatehack1, int templatehack2>
428        struct SuperFunctionCondition<functionnumber, T, templatehack1, templatehack2>
429        {
430            // If this function gets called, the header-file of the super function is not
431            // included, so this fallback template (templatehack not specialized) is used
[8351]432            static void superCheck()
[1679]433            {
[1684]434                // Calls the condition-check of the next super-function (functionnumber + 1)
[8351]435                SuperFunctionCondition<functionnumber + 1, T, templatehack1, templatehack2>::superCheck();
[1679]436            }
[1684]437        };
438
[2662]439        // Baseclass of the super-function caller. The real call will be done by a
440        // templatized subclass through the virtual () operator.
441        class _CoreExport SuperFunctionCaller_##functionname
442        {
443            public:
444                virtual void operator()( SUPER_CALL_ARGUMENTS##hasarguments(__VA_ARGS__) ) = 0;
445                virtual ~SuperFunctionCaller_##functionname () {}
[8863]446                virtual Identifier* getParentIdentifier() const = 0;
[2662]447        };
448
449        // Fallback if the base is pure virtual
[1687]450        template <class T>
[2662]451        class SuperFunctionClassCaller_purevirtualfallback_##functionname : public SuperFunctionCaller_##functionname
452        {
453            public:
454                // Fallback does nothing
455                inline void operator()( SUPER_CALL_ARGUMENTS##hasarguments(__VA_ARGS__) )
456                {
457                }
[8863]458
459                Identifier* getParentIdentifier() const
460                {
461                    return ClassIdentifier<T>::getIdentifier();
462                }
[2662]463        };
464
465        // Initializes the SuperFunctionCaller-pointer with a fallback caller in case the base function is pure virtual
466        template <class T>
[1687]467        struct SuperFunctionInitialization<functionnumber, T>
468        {
469            static void initialize(ClassIdentifier<T>* identifier)
470            {
[2662]471                identifier->superFunctionCaller_##functionname##_ = new SuperFunctionClassCaller_purevirtualfallback_##functionname <T>;
472                identifier->bSuperFunctionCaller_##functionname##_isFallback_ = true;
[1687]473
474                // Calls the initialization of the next super-function (functionnumber + 1)
475                SuperFunctionInitialization<functionnumber + 1, T>::initialize(identifier);
476            }
477        };
478
479        // Deletes the SuperFunctionCaller.
480        template <class T>
481        struct SuperFunctionDestruction<functionnumber, T>
482        {
483            static void destroy(ClassIdentifier<T>* identifier)
484            {
485                if (identifier->superFunctionCaller_##functionname##_)
486                    delete identifier->superFunctionCaller_##functionname##_;
487
488                // Calls the destruction of the next super-function (functionnumber + 1)
489                SuperFunctionDestruction<functionnumber + 1, T>::destroy(identifier);
490            }
491        };
492
[1684]493        // The real super-function caller: Calls T::functionname()
494        // T should be the parent, but this will be done by the spezialized condition template
495        template <class T>
496        class SuperFunctionClassCaller_##functionname : public SuperFunctionCaller_##functionname
497        {
498            public:
499                // @brief Calls the function.
500                // @param object The object to call the function on
501                // @param ... The arguments of the function
502                inline void operator()( SUPER_CALL_ARGUMENTS##hasarguments(__VA_ARGS__) )
503                {
[9348]504                    (orxonox_cast<T*>(object))->T:: functionname ( Call the function with it's arguments );
[1684]505                }
[8863]506
507                Identifier* getParentIdentifier() const
508                {
509                    return ClassIdentifier<T>::getIdentifier();
510                }
[1684]511        }
512    */
513
[1687]514
[1684]515    //// Execute the code for each super-function ////
[1687]516
517        // (2/3) --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <--
[1736]518        SUPER_FUNCTION_GLOBAL_DECLARATION_PART1(0, XMLPort, true, Element& xmlelement, XMLPort::Mode mode)
[1684]519            (xmlelement, mode)
520        SUPER_FUNCTION_GLOBAL_DECLARATION_PART2;
521
[1736]522        SUPER_FUNCTION_GLOBAL_DECLARATION_PART1(1, tick, true, float dt)
[1684]523            (dt)
524        SUPER_FUNCTION_GLOBAL_DECLARATION_PART2;
525
[1736]526        SUPER_FUNCTION_GLOBAL_DECLARATION_PART1(2, changedActivity, false)
[1684]527            ()
528        SUPER_FUNCTION_GLOBAL_DECLARATION_PART2;
529
[1736]530        SUPER_FUNCTION_GLOBAL_DECLARATION_PART1(3, changedVisibility, false)
[1684]531            ()
532        SUPER_FUNCTION_GLOBAL_DECLARATION_PART2;
[2087]533
[5929]534        SUPER_FUNCTION_GLOBAL_DECLARATION_PART1(4, XMLEventPort, true, Element& xmlelement, XMLPort::Mode mode)
535            (xmlelement, mode)
[2087]536        SUPER_FUNCTION_GLOBAL_DECLARATION_PART2;
[2662]537
538        SUPER_FUNCTION_GLOBAL_DECLARATION_PART1(5, changedScale, false)
539            ()
540        SUPER_FUNCTION_GLOBAL_DECLARATION_PART2;
541
[5929]542        SUPER_FUNCTION_GLOBAL_DECLARATION_PART1(6, changedOwner, false)
[2662]543            ()
544        SUPER_FUNCTION_GLOBAL_DECLARATION_PART2;
545
[5929]546        SUPER_FUNCTION_GLOBAL_DECLARATION_PART1(7, changedOverlayGroup, false)
[2662]547            ()
548        SUPER_FUNCTION_GLOBAL_DECLARATION_PART2;
549
[5929]550        SUPER_FUNCTION_GLOBAL_DECLARATION_PART1(8, changedName, false)
[2662]551            ()
552        SUPER_FUNCTION_GLOBAL_DECLARATION_PART2;
553
[10624]554        SUPER_FUNCTION_GLOBAL_DECLARATION_PART1(9, changedUsed, false)
[2662]555            ()
556        SUPER_FUNCTION_GLOBAL_DECLARATION_PART2;
[7163]557
[10624]558        SUPER_FUNCTION_GLOBAL_DECLARATION_PART1(10, changedCarrier, false)
[6524]559            ()
560        SUPER_FUNCTION_GLOBAL_DECLARATION_PART2;
561
[10624]562        SUPER_FUNCTION_GLOBAL_DECLARATION_PART1(11, changedPickedUp, false)
[6524]563            ()
564        SUPER_FUNCTION_GLOBAL_DECLARATION_PART2;
[7163]565
[1687]566        // (2/3) --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <--
[1684]567
[1679]568}
569
570#else /* _Super_H__ */
[1684]571  #ifdef SUPER_INTRUSIVE_DECLARATION_INCLUDE
[1679]572
[1684]573//////////////////////////////////////////////////////////////////////////
574// This code gets included within the declaration of ClassIdentifier<T> //
575//////////////////////////////////////////////////////////////////////////
[1679]576
[1684]577//// Common code ////
[1679]578
[1684]579    private:
[1687]580
[1684]581        template <int functionnumber, class TT, int templatehack1, int templatehack2>
582        friend struct SuperFunctionCondition;
[1679]583
[1684]584        // Creates the super-function-callers by calling the first SuperFunctionCondition check
585        // This get's called within the initialization of an Identifier
[11071]586        virtual void createSuperFunctionCaller() const override
[1684]587        {
[8351]588            SuperFunctionCondition<0, T, 0, 0>::superCheck();
[1684]589        }
[1679]590
591
[1684]592//// Function-specific code ////
593
594    public:
595        /**
596            @brief Adds a pointer to the SuperFunctionCaller as a member of ClassIdentifier.
597            @param functionname The name of the super-function
598        */
599        #ifndef SUPER_INTRUSIVE_DECLARATION
600          #define SUPER_INTRUSIVE_DECLARATION(functionname) \
[2662]601            SuperFunctionCaller_##functionname * superFunctionCaller_##functionname##_; \
602            bool bSuperFunctionCaller_##functionname##_isFallback_
[1684]603        #endif
604
605
606//// Execute the code for each super-function ////
[1687]607
608    // (3/3) --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <--
[1684]609    SUPER_INTRUSIVE_DECLARATION(XMLPort);
610    SUPER_INTRUSIVE_DECLARATION(tick);
611    SUPER_INTRUSIVE_DECLARATION(changedActivity);
612    SUPER_INTRUSIVE_DECLARATION(changedVisibility);
[5929]613    SUPER_INTRUSIVE_DECLARATION(XMLEventPort);
[2662]614    SUPER_INTRUSIVE_DECLARATION(changedScale);
615    SUPER_INTRUSIVE_DECLARATION(changedOwner);
616    SUPER_INTRUSIVE_DECLARATION(changedOverlayGroup);
617    SUPER_INTRUSIVE_DECLARATION(changedName);
[6524]618    SUPER_INTRUSIVE_DECLARATION(changedUsed);
619    SUPER_INTRUSIVE_DECLARATION(changedCarrier);
620    SUPER_INTRUSIVE_DECLARATION(changedPickedUp);
[1687]621    // (3/3) --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <--
[1684]622
623
624    #undef SUPER_INTRUSIVE_DECLARATION_INCLUDE
625  #endif /* SUPER_INTRUSIVE_DECLARATION_INCLUDE */
[1679]626#endif /* _Super_H__ */
Note: See TracBrowser for help on using the repository browser.