Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/trunk/src/lib/util/executor/executor_functional.h @ 7718

Last change on this file since 7718 was 7718, checked in by bensch, 18 years ago

trunk: functionality almost reached

File size: 7.9 KB
Line 
1/*!
2 * @file executor_functional.h
3 * Definition of an Executor
4 */
5
6/*
7   orxonox - the future of 3D-vertical-scrollers
8
9   Copyright (C) 2004 orx
10
11   This program is free software; you can redistribute it and/or modify
12   it under the terms of the GNU General Public License as published by
13   the Free Software Foundation; either version 2, or (at your option)
14   any later version.
15
16### File Specific:
17   main-programmer: Benjamin Grauer
18   co-programmer: ...
19*/
20
21
22#ifndef __EXECUTOR_FUNCTIONAL_H_
23#define __EXECUTOR_FUNCTIONAL_H_
24
25
26
27template<typename type> MT_Type ExecutorParamType() { return MT_EXT1; };
28template<> MT_Type ExecutorParamType<bool>() { return MT_EXT1; };
29template<> MT_Type ExecutorParamType<int>() { return MT_INT; };
30template<> MT_Type ExecutorParamType<unsigned int>() { return MT_UINT; };
31template<> MT_Type ExecutorParamType<float>() { return MT_FLOAT; };
32template<> MT_Type ExecutorParamType<char>() { return MT_CHAR; };
33template<> MT_Type ExecutorParamType<const std::string&>() { return MT_STRING; };
34
35template<typename type> type fromString(const std::string& input, type defaultValue) {return defaultValue; };
36template<> bool fromString<bool>(const std::string& input, bool defaultValue) { return isBool(input, defaultValue); };
37template<> int fromString<int>(const std::string& input, int defaultValue) { return isInt(input, defaultValue); };
38template<> unsigned int fromString<unsigned int>(const std::string& input, unsigned int defaultValue) { return isInt(input, defaultValue); };
39template<> float fromString<float>(const std::string& input, float defaultValue) { return isFloat(input, defaultValue); };
40template<> char fromString<char>(const std::string& input, char defaultValue) { return isInt(input, defaultValue); };
41template<> const std::string& fromString<const std::string&>(const std::string& input, const std::string& defaultValue) { return isString(input, defaultValue); };
42
43template<typename type> type getDefault(const MultiType* const defaultValues, unsigned int i) { return (type)0; };
44template<> bool getDefault<bool>(const MultiType* const defaultValues, unsigned int i) { return defaultValues[i].getBool(); };
45template<> int getDefault<int>(const MultiType* const defaultValues, unsigned int i) { return defaultValues[i].getInt(); };
46template<> unsigned int getDefault<unsigned int>(const MultiType* const defaultValues, unsigned int i) { return defaultValues[i].getInt(); };
47template<> float getDefault<float>(const MultiType* const defaultValues, unsigned int i) { return defaultValues[i].getFloat(); };
48template<> char getDefault<char>(const MultiType* const defaultValues, unsigned int i) { return defaultValues[i].getChar(); };
49template<> std::string getDefault<std::string>(const MultiType* const defaultValues, unsigned int i) { return defaultValues[i].getString(); };
50
51#endif /* __EXECUTOR_FUNCTIONAL_H_ */
52
53
54#define __EXECUTOR_FUNCTIONAL_CONST
55#define __EXECUTOR_FUNCTIONAL_NAME(ParamCount)   Executor##ParamCount##Params
56#define __EXECUTOR_FUNCTIONAL_FUNCTION_EXEC      dynamic_cast<T*>(object)->*(functionPointer)
57#define __EXECUTOR_FUNCTIONAL_FUNCTION_POINTER   T::*functionPointer
58
59#ifdef EXECUTOR_FUNCTIONAL_USE_CONST
60 #undef __EXECUTOR_FUNCTIONAL_CONST
61 #define __EXECUTOR_FUNCTIONAL_CONST const
62 #undef __EXECUTOR_FUNCTIONAL_NAME
63 #define __EXECUTOR_FUNCTIONAL_NAME(ParamCount) Executor##ParamCount##Params_const
64 #undef EXECUTOR_FUNCTIONAL_USE_CONST
65#endif
66
67#ifdef EXECUTOR_FUNCTIONAL_USE_STATIC
68 #ifdef EXECUTOR_FUNCTIONAL_USE_CONST
69  #error you obviously do not know what you are doing !! ask the bensch
70 #endif /* EXECUTOR_FUNCTIONAL_USE_CONST */
71
72 #undef __EXECUTOR_FUNCTIONAL_FUNCTION_EXEC
73 #define __EXECUTOR_FUNCTIONAL_FUNCTION_EXEC       functionPointer
74 #undef __EXECUTOR_FUNCTIONAL_NAME
75 #define __EXECUTOR_FUNCTIONAL_NAME(ParamCount)    Executor##ParamCount##Params_static
76 #undef __EXECUTOR_FUNCTIONAL_FUNCTION_POINTER
77 #define __EXECUTOR_FUNCTIONAL_FUNCTION_POINTER    *functionPointer
78
79 #undef EXECUTOR_FUNCTIONAL_USE_STATIC
80#endif /* EXECUTOR_FUNCTIONAL_USE_STATIC */
81
82template<class T> class __EXECUTOR_FUNCTIONAL_NAME(0) : public Executor
83{
84private:
85  void (__EXECUTOR_FUNCTIONAL_FUNCTION_POINTER)() __EXECUTOR_FUNCTIONAL_CONST;
86
87public:
88  __EXECUTOR_FUNCTIONAL_NAME(0) (void (__EXECUTOR_FUNCTIONAL_FUNCTION_POINTER)() __EXECUTOR_FUNCTIONAL_CONST )
89      : Executor()
90  {
91    this->functorType = Executor_Objective;
92    this->functionPointer = functionPointer;
93  };
94
95  virtual void operator()(BaseObject* object, const SubString& sub = SubString()) const
96  {
97    (__EXECUTOR_FUNCTIONAL_FUNCTION_EXEC)();
98  };
99
100  virtual Executor* clone() const {
101    return new __EXECUTOR_FUNCTIONAL_NAME(0)<T>(this->functionPointer);
102  };
103};
104
105
106template<class T, typename type0> class __EXECUTOR_FUNCTIONAL_NAME(1) : public Executor
107{
108private:
109  void (__EXECUTOR_FUNCTIONAL_FUNCTION_POINTER)(type0) __EXECUTOR_FUNCTIONAL_CONST;
110
111public:
112  __EXECUTOR_FUNCTIONAL_NAME(1) (void (__EXECUTOR_FUNCTIONAL_FUNCTION_POINTER)(type0) __EXECUTOR_FUNCTIONAL_CONST)
113      : Executor(ExecutorParamType<type0>())
114  {
115    this->functorType = Executor_Objective;
116    this->functionPointer = functionPointer;
117  };
118
119  virtual void operator()(BaseObject* object, const SubString& sub = SubString()) const
120  {
121
122    /* // THE VERY COOL DEBUG
123      printf("SUB[0] : %s\n", sub[0].c_str());
124      printf("getDefault<type0>(this->defaultValue, 0):::: %d\n", getDefault<type0>(this->defaultValue, 0));
125      printf("VALUE: %d\n", fromString<type0>(sub[0], getDefault<type0>(this->defaultValue, 0)));
126    */
127    (__EXECUTOR_FUNCTIONAL_FUNCTION_EXEC)(
128      fromString<type0>(sub[0], getDefault<type0>(this->defaultValue, 0)) );
129  };
130
131  virtual Executor* clone() const {
132    return  new __EXECUTOR_FUNCTIONAL_NAME(1)<T, type0>(this->functionPointer);
133  };
134};
135
136/// DOUBLE PENETRATION
137template<class T, typename type0, typename type1> class __EXECUTOR_FUNCTIONAL_NAME(2) : public Executor
138{
139private:
140  void (__EXECUTOR_FUNCTIONAL_FUNCTION_POINTER)(type0, type1) __EXECUTOR_FUNCTIONAL_CONST;
141
142public:
143  __EXECUTOR_FUNCTIONAL_NAME(2) (void (__EXECUTOR_FUNCTIONAL_FUNCTION_POINTER)(type0, type1) __EXECUTOR_FUNCTIONAL_CONST)
144      : Executor(ExecutorParamType<type0>(), ExecutorParamType<type1>())
145  {
146    this->functorType = Executor_Objective;
147    this->functionPointer = functionPointer;
148  };
149
150  virtual void operator()(BaseObject* object, const SubString& sub = SubString()) const
151  {
152    (__EXECUTOR_FUNCTIONAL_FUNCTION_EXEC)(
153      fromString<type0>(sub[0], getDefault<type0>(this->defaultValue, 0)),
154      fromString<type1>(sub[1], getDefault<type1>(this->defaultValue, 1)));
155  };
156
157  virtual Executor* clone() const {
158    return new __EXECUTOR_FUNCTIONAL_NAME(2)<T, type0, type1>(this->functionPointer);
159  };
160};
161
162
163
164/// HACK !! THESE WILL BE RESET AGAIN !!
165
166
167#define EXECUTOR_FUNCTIONAL_CREATOR0() \
168template<class T> Executor* createExecutor(void (__EXECUTOR_FUNCTIONAL_FUNCTION_POINTER)() __EXECUTOR_FUNCTIONAL_CONST) \
169{ \
170  return new __EXECUTOR_FUNCTIONAL_NAME(0)<T>(functionPointer); \
171}
172
173#define EXECUTOR_FUNCTIONAL_CREATOR1(type0) \
174template<class T> Executor* createExecutor(void (__EXECUTOR_FUNCTIONAL_FUNCTION_POINTER)(type0##_TYPE) __EXECUTOR_FUNCTIONAL_CONST) \
175{ \
176  return new __EXECUTOR_FUNCTIONAL_NAME(1)<T, type0##_TYPE>(functionPointer); \
177}
178
179#define EXECUTOR_FUNCTIONAL_CREATOR2(type0, type1) \
180template<class T> Executor* createExecutor(void (__EXECUTOR_FUNCTIONAL_FUNCTION_POINTER)(type0##_TYPE, type1##_TYPE) __EXECUTOR_FUNCTIONAL_CONST) \
181{ \
182  return new __EXECUTOR_FUNCTIONAL_NAME(2)<T, type0##_TYPE, type1##_TYPE>(functionPointer); \
183}
184
185#define EXECUTOR_FUNCTIONAL_CREATOR3(type0, type1, type2)
186#define EXECUTOR_FUNCTIONAL_CREATOR4(type0, type1, type2, type3)
187#define EXECUTOR_FUNCTIONAL_CREATOR5(type0, type1, type2, type3, type4)
188
189
190
191#define FUNCTOR_LIST(x) EXECUTOR_FUNCTIONAL_CREATOR ## x
192#include "functor_list.h"
193#undef FUNCTOR_LIST
194
195
196
197#undef __EXECUTOR_FUNCTIONAL_CONST
198#undef __EXECUTOR_FUNCTIONAL_NAME
199#undef __EXECUTOR_FUNCTIONAL_FUNCTION_EXEC
200#undef __EXECUTOR_FUNCTIONAL_FUNCTION_POINTER
Note: See TracBrowser for help on using the repository browser.