Changeset 1052 for code/trunk/src/orxonox/core/Functor.h
- Timestamp:
- Apr 14, 2008, 3:42:49 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/trunk/src/orxonox/core/Functor.h
r871 r1052 35 35 #include "CorePrereqs.h" 36 36 37 38 enum FunctionType 37 #define MAX_FUNCTOR_ARGUMENTS 5 38 39 namespace orxonox 39 40 { 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"; } 48 51 49 52 #define CreateTypeToStringTemplate(type) \ 50 53 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() 125 130 { 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 } 128 152 else 129 153 { 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 } 132 161 } 133 162 } 134 else 163 164 void setObject(T* object) 135 165 { 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; 143 168 } 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 }; 173 181 174 182 … … 272 280 273 281 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 274 307 275 308 … … 295 328 } \ 296 329 \ 330 virtual void evaluateParam(unsigned int index, MultiTypeMath& param) const \ 331 { \ 332 FUNCTOR_EVALUATE_PARAM(numparams); \ 333 } \ 334 \ 297 335 private: \ 298 336 FUNCTOR_FUNCTION_RETURNVALUE(returnvalue) (*functionPointer_)(FUNCTOR_FUNCTION_PARAMS(numparams)); \ … … 334 372 } \ 335 373 \ 374 virtual void evaluateParam(unsigned int index, MultiTypeMath& param) const \ 375 { \ 376 FUNCTOR_EVALUATE_PARAM(numparams); \ 377 } \ 378 \ 336 379 private: \ 337 380 FUNCTOR_FUNCTION_RETURNVALUE(returnvalue) (T::*functionPointer_)(FUNCTOR_FUNCTION_PARAMS(numparams)); \ … … 359 402 { \ 360 403 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); \ 361 409 } \ 362 410 \ … … 412 460 413 461 414 CREATE_ALL_STATIC_FUNCTORS(); 415 CREATE_ALL_MEMBER_FUNCTORS(); 462 CREATE_ALL_STATIC_FUNCTORS(); 463 CREATE_ALL_MEMBER_FUNCTORS(); 464 } 416 465 417 466 #endif /* _Functor_H__ */
Note: See TracChangeset
for help on using the changeset viewer.