Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Apr 14, 2008, 3:42:49 AM (16 years ago)
Author:
landauf
Message:

merged core2 back to trunk
there might be some errors, wasn't able to test it yet due to some strange g++ and linker behaviour.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • code/trunk/src/orxonox/core/Functor.h

    r871 r1052  
    3535#include "CorePrereqs.h"
    3636
    37 
    38 enum FunctionType
     37#define MAX_FUNCTOR_ARGUMENTS 5
     38
     39namespace orxonox
    3940{
    40     FT_MEMBER,
    41     FT_CONSTMEMBER,
    42     FT_STATIC
    43 };
    44 
    45 
    46 template <class T>
    47 inline std::string typeToString();
     41    enum FunctionType
     42    {
     43        FT_MEMBER,
     44        FT_CONSTMEMBER,
     45        FT_STATIC
     46    };
     47
     48
     49    template <class T>
     50    inline std::string typeToString() { return "unknown"; }
    4851
    4952#define CreateTypeToStringTemplate(type) \
    5053    template <> \
    51     inline std::string typeToString<type>() { return #type; }
    52 
    53 CreateTypeToStringTemplate(int);
    54 CreateTypeToStringTemplate(unsigned int);
    55 CreateTypeToStringTemplate(char);
    56 CreateTypeToStringTemplate(unsigned char);
    57 CreateTypeToStringTemplate(short);
    58 CreateTypeToStringTemplate(unsigned short);
    59 CreateTypeToStringTemplate(long);
    60 CreateTypeToStringTemplate(unsigned long);
    61 CreateTypeToStringTemplate(float);
    62 CreateTypeToStringTemplate(double);
    63 CreateTypeToStringTemplate(long double);
    64 CreateTypeToStringTemplate(bool);
    65 CreateTypeToStringTemplate(std::string);
    66 CreateTypeToStringTemplate(orxonox::Vector2);
    67 CreateTypeToStringTemplate(orxonox::Vector3);
    68 CreateTypeToStringTemplate(orxonox::Quaternion);
    69 CreateTypeToStringTemplate(orxonox::ColourValue);
    70 CreateTypeToStringTemplate(orxonox::Radian);
    71 CreateTypeToStringTemplate(orxonox::Degree);
    72 
    73 
    74 class _CoreExport Functor
    75 {
    76     public:
    77         Functor() {}
    78         virtual ~Functor() {}
    79 
    80         virtual void operator()(const MultiTypeMath& param1 = MT_null, const MultiTypeMath& param2 = MT_null, const MultiTypeMath& param3 = MT_null, const MultiTypeMath& param4 = MT_null, const MultiTypeMath& param5 = MT_null) = 0;
    81 
    82         inline int getParamCount() const { return this->numParams_; }
    83         inline bool hasReturnvalue() const { return this->hasReturnValue_; }
    84         inline FunctionType getType() const { return this->type_; }
    85         inline MultiTypeMath getReturnvalue() const { return this->returnedValue_; }
    86 
    87         std::string getTypenameParam(int param) const { return (param > 0 && param <= 5) ? this->typeParam_[param-1] : ""; }
    88         std::string getTypenameReturnvalue() const { return this->typeReturnvalue_; }
    89 
    90     protected:
    91         int numParams_;
    92         bool hasReturnValue_;
    93         FunctionType type_;
    94         MultiTypeMath returnedValue_;
    95 
    96         std::string typeReturnvalue_;
    97         std::string typeParam_[5];
    98 };
    99 
    100 class _CoreExport FunctorStatic : public Functor
    101 {
    102     public:
    103         virtual ~FunctorStatic() {}
    104         virtual void operator()(const MultiTypeMath& param1 = MT_null, const MultiTypeMath& param2 = MT_null, const MultiTypeMath& param3 = MT_null, const MultiTypeMath& param4 = MT_null, const MultiTypeMath& param5 = MT_null) = 0;
    105 };
    106 
    107 template <class T>
    108 class FunctorMember : public Functor
    109 {
    110     public:
    111         FunctorMember()
    112         {
    113             constObject_ = 0;
    114             object_ = 0;
    115             bConstObject_ = false;
    116         }
    117         virtual ~FunctorMember() {}
    118 
    119         virtual void operator()(T* object, const MultiTypeMath& param1 = MT_null, const MultiTypeMath& param2 = MT_null, const MultiTypeMath& param3 = MT_null, const MultiTypeMath& param4 = MT_null, const MultiTypeMath& param5 = MT_null) = 0;
    120         virtual void operator()(const T* object, const MultiTypeMath& param1 = MT_null, const MultiTypeMath& param2 = MT_null, const MultiTypeMath& param3 = MT_null, const MultiTypeMath& param4 = MT_null, const MultiTypeMath& param5 = MT_null) = 0;
    121 
    122         virtual void operator()(const MultiTypeMath& param1 = MT_null, const MultiTypeMath& param2 = MT_null, const MultiTypeMath& param3 = MT_null, const MultiTypeMath& param4 = MT_null, const MultiTypeMath& param5 = MT_null)
    123         {
    124             if (this->bConstObject_)
     54    inline std::string typeToString<type>() { return #type; } \
     55    template <> \
     56    inline std::string typeToString<type&>() { return #type; } \
     57    template <> \
     58    inline std::string typeToString<const type>() { return #type; } \
     59    template <> \
     60    inline std::string typeToString<const type&>() { return #type; }
     61
     62    CreateTypeToStringTemplate(int);
     63    CreateTypeToStringTemplate(unsigned int);
     64    CreateTypeToStringTemplate(char);
     65    CreateTypeToStringTemplate(unsigned char);
     66    CreateTypeToStringTemplate(short);
     67    CreateTypeToStringTemplate(unsigned short);
     68    CreateTypeToStringTemplate(long);
     69    CreateTypeToStringTemplate(unsigned long);
     70    CreateTypeToStringTemplate(float);
     71    CreateTypeToStringTemplate(double);
     72    CreateTypeToStringTemplate(long double);
     73    CreateTypeToStringTemplate(bool);
     74    CreateTypeToStringTemplate(Vector2);
     75    CreateTypeToStringTemplate(Vector3);
     76    CreateTypeToStringTemplate(Quaternion);
     77    CreateTypeToStringTemplate(ColourValue);
     78    CreateTypeToStringTemplate(Radian);
     79    CreateTypeToStringTemplate(Degree);
     80
     81    template <> \
     82    inline std::string typeToString<std::string>() { return "string"; } \
     83    template <> \
     84    inline std::string typeToString<std::string&>() { return "string"; } \
     85    template <> \
     86    inline std::string typeToString<const std::string>() { return "string"; } \
     87    template <> \
     88    inline std::string typeToString<const std::string&>() { return "string"; }
     89
     90    class _CoreExport Functor
     91    {
     92        public:
     93            Functor() {}
     94            virtual ~Functor() {}
     95
     96            virtual void operator()(const MultiTypeMath& param1 = MT_null, const MultiTypeMath& param2 = MT_null, const MultiTypeMath& param3 = MT_null, const MultiTypeMath& param4 = MT_null, const MultiTypeMath& param5 = MT_null) = 0;
     97
     98            inline unsigned int getParamCount() const { return this->numParams_; }
     99            inline bool hasReturnvalue() const { return this->hasReturnValue_; }
     100            inline FunctionType getType() const { return this->type_; }
     101            inline MultiTypeMath getReturnvalue() const { return this->returnedValue_; }
     102
     103            std::string getTypenameParam(unsigned int param) const { return (param >= 0 && param < 5) ? this->typeParam_[param] : ""; }
     104            std::string getTypenameReturnvalue() const { return this->typeReturnvalue_; }
     105
     106            virtual void evaluateParam(unsigned int index, MultiTypeMath& param) const = 0;
     107
     108        protected:
     109            unsigned int numParams_;
     110            bool hasReturnValue_;
     111            FunctionType type_;
     112            MultiTypeMath returnedValue_;
     113
     114            std::string typeReturnvalue_;
     115            std::string typeParam_[MAX_FUNCTOR_ARGUMENTS];
     116    };
     117
     118    class _CoreExport FunctorStatic : public Functor
     119    {
     120        public:
     121            virtual ~FunctorStatic() {}
     122            virtual void operator()(const MultiTypeMath& param1 = MT_null, const MultiTypeMath& param2 = MT_null, const MultiTypeMath& param3 = MT_null, const MultiTypeMath& param4 = MT_null, const MultiTypeMath& param5 = MT_null) = 0;
     123    };
     124
     125    template <class T>
     126    class FunctorMember : public Functor
     127    {
     128        public:
     129            FunctorMember()
    125130            {
    126                 if (this->constObject_)
    127                     (*this)(this->constObject_, param1, param2, param3, param4, param5);
     131                constObject_ = 0;
     132                object_ = 0;
     133                bConstObject_ = false;
     134            }
     135            virtual ~FunctorMember() {}
     136
     137            virtual void operator()(T* object, const MultiTypeMath& param1 = MT_null, const MultiTypeMath& param2 = MT_null, const MultiTypeMath& param3 = MT_null, const MultiTypeMath& param4 = MT_null, const MultiTypeMath& param5 = MT_null) = 0;
     138            virtual void operator()(const T* object, const MultiTypeMath& param1 = MT_null, const MultiTypeMath& param2 = MT_null, const MultiTypeMath& param3 = MT_null, const MultiTypeMath& param4 = MT_null, const MultiTypeMath& param5 = MT_null) = 0;
     139
     140            virtual void operator()(const MultiTypeMath& param1 = MT_null, const MultiTypeMath& param2 = MT_null, const MultiTypeMath& param3 = MT_null, const MultiTypeMath& param4 = MT_null, const MultiTypeMath& param5 = MT_null)
     141            {
     142                if (this->bConstObject_)
     143                {
     144                    if (this->constObject_)
     145                        (*this)(this->constObject_, param1, param2, param3, param4, param5);
     146                    else
     147                    {
     148                        COUT(1) << "An error occurred in Functor.h:" << std::endl;
     149                        COUT(1) << "Error: No const object set." << std::endl;
     150                    }
     151                }
    128152                else
    129153                {
    130                     COUT(1) << "An error occurred in Functor.h:" << std::endl;
    131                     COUT(1) << "Error: No const object set." << std::endl;
     154                    if (this->object_)
     155                        (*this)(this->object_, param1, param2, param3, param4, param5);
     156                    else
     157                    {
     158                        COUT(1) << "An error occurred in Functor.h:" << std::endl;
     159                        COUT(1) << "Error: No object set." << std::endl;
     160                    }
    132161                }
    133162            }
    134             else
     163
     164            void setObject(T* object)
    135165            {
    136                 if (this->object_)
    137                     (*this)(this->object_, param1, param2, param3, param4, param5);
    138                 else
    139                 {
    140                     COUT(1) << "An error occurred in Functor.h:" << std::endl;
    141                     COUT(1) << "Error: No object set." << std::endl;
    142                 }
     166                this->bConstObject_ = false;
     167                this->object_ = object;
    143168            }
    144         }
    145 
    146         void setObject(T* object)
    147         {
    148             this->bConstObject_ = false;
    149             this->object_ = object;
    150         }
    151 
    152         void setObject(const T* object)
    153         {
    154             this->bConstObject_ = true;
    155             this->constObject_ = object;
    156         }
    157 
    158     private:
    159         const T* constObject_;
    160         T* object_;
    161         bool bConstObject_;
    162 };
    163 
    164 
    165 
    166 #define MAKE_COMMA(x) MAKE_COMMA##x
    167 #define MAKE_COMMA0
    168 #define MAKE_COMMA1 ,
    169 #define MAKE_COMMA2 ,
    170 #define MAKE_COMMA3 ,
    171 #define MAKE_COMMA4 ,
    172 #define MAKE_COMMA5 ,
     169
     170            void setObject(const T* object)
     171            {
     172                this->bConstObject_ = true;
     173                this->constObject_ = object;
     174            }
     175
     176        private:
     177            const T* constObject_;
     178            T* object_;
     179            bool bConstObject_;
     180    };
    173181
    174182
     
    272280
    273281
     282#define FUNCTOR_EVALUATE_PARAM(numparams) FUNCTOR_EVALUATE_PARAM##numparams
     283#define FUNCTOR_EVALUATE_PARAM0
     284#define FUNCTOR_EVALUATE_PARAM1 \
     285    if (index == 0) param = (P1)param
     286#define FUNCTOR_EVALUATE_PARAM2 \
     287    if (index == 0) param = (P1)param; \
     288    else if (index == 1) param = (P2)param
     289#define FUNCTOR_EVALUATE_PARAM3 \
     290    if (index == 0) param = (P1)param; \
     291    else if (index == 1) param = (P2)param; \
     292    else if (index == 2) param = (P3)param
     293#define FUNCTOR_EVALUATE_PARAM4 \
     294    if (index == 0) param = (P1)param; \
     295    else if (index == 1) param = (P2)param; \
     296    else if (index == 2) param = (P3)param; \
     297    else if (index == 3) param = (P4)param
     298#define FUNCTOR_EVALUATE_PARAM5 \
     299    if (index == 0) param = (P1)param; \
     300    else if (index == 1) param = (P2)param; \
     301    else if (index == 2) param = (P3)param; \
     302    else if (index == 3) param = (P4)param; \
     303    else if (index == 4) param = (P5)param
     304
     305
     306
    274307
    275308
     
    295328            } \
    296329    \
     330            virtual void evaluateParam(unsigned int index, MultiTypeMath& param) const \
     331            { \
     332                FUNCTOR_EVALUATE_PARAM(numparams); \
     333            } \
     334    \
    297335        private: \
    298336            FUNCTOR_FUNCTION_RETURNVALUE(returnvalue) (*functionPointer_)(FUNCTOR_FUNCTION_PARAMS(numparams)); \
     
    334372            } \
    335373    \
     374            virtual void evaluateParam(unsigned int index, MultiTypeMath& param) const \
     375            { \
     376                FUNCTOR_EVALUATE_PARAM(numparams); \
     377            } \
     378    \
    336379        private: \
    337380            FUNCTOR_FUNCTION_RETURNVALUE(returnvalue) (T::*functionPointer_)(FUNCTOR_FUNCTION_PARAMS(numparams)); \
     
    359402            { \
    360403                FUNCTOR_STORE_RETURNVALUE(returnvalue, (*object.*this->functionPointer_)(FUNCTOR_FUNCTION_CALL(numparams))); \
     404            } \
     405    \
     406            virtual void evaluateParam(unsigned int index, MultiTypeMath& param) const \
     407            { \
     408                FUNCTOR_EVALUATE_PARAM(numparams); \
    361409            } \
    362410    \
     
    412460
    413461
    414 CREATE_ALL_STATIC_FUNCTORS();
    415 CREATE_ALL_MEMBER_FUNCTORS();
     462    CREATE_ALL_STATIC_FUNCTORS();
     463    CREATE_ALL_MEMBER_FUNCTORS();
     464}
    416465
    417466#endif /* _Functor_H__ */
Note: See TracChangeset for help on using the changeset viewer.