Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 5642 was 5642, checked in by bensch, 19 years ago

orxonox/trunk: valgrind sweep

File size: 11.1 KB
Line 
1/*!
2 * @file executor.h
3 * Definition of a on-screen-shell
4 */
5
6#ifndef _EXECUTOR_H
7#define _EXECUTOR_H
8
9#include "base_object.h"
10
11#include "helper_functions.h"
12#include "multi_type.h"
13#include "substring.h"
14#include "functor_list.h" //< MUST BE INCLUDED HERE AT LEAST ONCE.
15
16#include <stdarg.h>
17
18// FORWARD DECLARATION
19template<class T> class tList;
20
21//! an enumerator for the definition of the Type.
22typedef enum {
23  Executor_Objective   = 1,
24  Executor_Static      = 2,
25} Executor_Type;
26
27////////////////
28// BASE CLASS //
29////////////////
30//! a baseClass for all possible Executors
31class Executor: public BaseObject
32{
33  public:
34    virtual ~Executor();
35
36    virtual Executor* clone () const = 0;
37
38    Executor* defaultValues(unsigned int count, ...);
39    Executor* defaultValues(unsigned int count, va_list values);
40
41    /** executes a Command @param object the object to apply this to @param parameters the parameters the command takes */
42    virtual void execute (BaseObject* object, const char* parameters) = 0;
43
44    /** @returns the Type of this Function (either static or objective) */
45    inline Executor_Type getType() const { return this->functorType; };
46    /** @returns the Count of Parameters this Executor takes */
47    inline unsigned int getParamCount() const { return this->paramCount; };
48
49    static void debug();
50
51  protected:
52    Executor();
53    Executor(unsigned int paramCount, ...);
54
55    void cloning(Executor* executor) const;
56
57  protected:
58    Executor_Type                    functorType;      //!< The type of Function we've got (either static or objective).
59    unsigned int                     paramCount;       //!< the count of parameters.
60    MultiType*                       defaultValue;     //!< Default Values.
61};
62
63///////////////////////////////////////////////////
64///////////////////////////////////////////////////
65
66/////////////////////////////////
67// MACRO DEFINITION EXTENSIONS //
68/////////////////////////////////
69//! where to chek for default BOOL values
70#define   l_BOOL_DEFGRAB(i)         this->defaultValue[i].getBool()
71//! where to chek for default INT values
72#define   l_INT_DEFGRAB(i)          this->defaultValue[i].getInt()
73//! where to chek for default UINT values
74#define   l_UINT_DEFGRAB(i)         (unsigned int)this->defaultValue[i].getInt()
75//! where to chek for default LONG values
76#define   l_LONG_DEFGRAB(i)         (long)this->defaultValue[i].getInt()
77//! where to chek for default FLOAT values
78#define   l_FLOAT_DEFGRAB(i)        this->defaultValue[i].getFloat()
79//! where to chek for default STRING values
80#define   l_STRING_DEFGRAB(i)       this->defaultValue[i].getString()
81
82//////////////////////////
83// COMMAND REGISTRATION //
84//////////////////////////
85// EXECUTOR             can be redefined as Executor or ExecutorStatic
86// EXECUTOREXECUTER     can be redefined too.
87// EXECUTORINCLASS
88// EXECUTORTYPE
89
90
91///////////////////////
92// FUNCTION POINTERS //
93///////////////////////
94#define ExecutorFunctionPoiter0() \
95  void EXECUTORINCLASS(*functionPointer_0)();
96
97#define ExecutorFunctionPoiter1(t1) \
98  void EXECUTORINCLASS(*functionPointer_1_##t1)(t1##_TYPE);
99
100#define ExecutorFunctionPoiter2(t1, t2) \
101  void EXECUTORINCLASS(*functionPointer_2_##t1##_##t2)(t1##_TYPE, t2##_TYPE);
102
103
104#define ExecutorFunctionPoiter3(t1, t2, t3) \
105  void EXECUTORINCLASS(*functionPointer_3_##t1##_##t2##_##t3)(t1##_TYPE, t2##_TYPE, t3##_TYPE);
106
107#define ExecutorFunctionPoiter4(t1, t2, t3, t4) \
108  void EXECUTORINCLASS(*functionPointer_4_##t1##_##t2##_##t3##_##t4)(t1##_TYPE, t2##_TYPE, t3##_TYPE, t4##_TYPE);
109
110
111#define ExecutorFunctionPoiter5(t1, t2, t3, t4, t5) \
112  void EXECUTORINCLASS(*functionPointer_5_##t1##_##t2##_##t3##_##t4##_##t5)(t1##_TYPE, t2##_TYPE, t3##_TYPE, t4##_TYPE, t5##_TYPE); \
113
114
115//////////////////
116// CONSTRUCTORS //
117/////////////////
118//! creates a command that takes no parameters
119#define ExecutorConstructor0() \
120  EXECUTOR(void EXECUTORINCLASS(*function)()) \
121  : Executor(0) \
122  { \
123    this->functorType = EXECUTORTYPE; \
124    this->fp.functionPointer_0 = function; \
125  }
126
127//! creates a command that takes one parameter
128#define ExecutorConstructor1(t1) \
129  EXECUTOR(void EXECUTORINCLASS(*function)(t1##_TYPE)) \
130  : Executor(1, t1##_PARAM) \
131  { \
132    this->functorType = EXECUTORTYPE; \
133    this->fp.functionPointer_1_##t1 = function; \
134  }
135
136//! creates a command that takes two parameters
137#define ExecutorConstructor2(t1,t2) \
138  EXECUTOR(void EXECUTORINCLASS(*function)(t1##_TYPE, t2##_TYPE)) \
139  : Executor(2, t1##_PARAM, t2##_PARAM) \
140  { \
141    this->functorType = EXECUTORTYPE; \
142    this->fp.functionPointer_2_##t1##_##t2 = function; \
143  }
144
145//! creates a command that takes three parameter
146#define ExecutorConstructor3(t1,t2,t3) \
147  EXECUTOR(void EXECUTORINCLASS(*function)(t1##_TYPE, t2##_TYPE, t3##_TYPE)) \
148  : Executor(3, t1##_PARAM, t2##_PARAM, t3##_PARAM) \
149  { \
150    this->functorType = EXECUTORTYPE; \
151    this->fp.functionPointer_3_##t1##_##t2##_##t3 = function; \
152  }
153
154//! creates a command that takes four parameter
155#define ExecutorConstructor4(t1,t2,t3,t4) \
156  EXECUTOR(void EXECUTORINCLASS(*function)(t1##_TYPE, t2##_TYPE, t3##_TYPE, t4##_TYPE)) \
157  : Executor(4, t1##_PARAM, t2##_PARAM, t3##_PARAM, t4##_PARAM) \
158  { \
159    this->functorType = EXECUTORTYPE; \
160    this->fp.functionPointer_4_##t1##_##t2##_##t3##_##t4 = function; \
161  }
162
163//! creates a command that takes five parameter
164#define ExecutorConstructor5(t1,t2,t3,t4,t5) \
165  EXECUTOR(void EXECUTORINCLASS(*function)(t1##_TYPE, t2##_TYPE, t3##_TYPE, t4##_TYPE, t5##_TYPE)) \
166  : Executor(5, t1##_PARAM, t2##_PARAM, t3##_PARAM, t4##_PARAM, t5##_PARAM) \
167  { \
168    this->functorType = EXECUTORTYPE; \
169    this->fp.functionPointer_5_##t1##_##t2##_##t3##_##t4##_##t5 = function; \
170  }
171
172///////////////
173// EXECUTION //
174///////////////
175//! execute-macro for functions with no parameters
176#define ExecutorExecute0() \
177  if (this->paramCount == 0) \
178    EXECUTOREXECUTER(_0)()
179
180//! execute-macro for functions with one parameter
181#define ExecutorExecute1(t1) \
182   else if (this->paramCount == 1 && this->defaultValue[0].getType() == t1##_PARAM) \
183    EXECUTOREXECUTER(_1_##t1)(t1##_FUNC(parameters, t1##_DEFGRAB(0)))
184
185//! execute-macro for functions with two parameters
186#define ExecutorExecute2(t1,t2) \
187   else if (this->paramCount == 2 && this->defaultValue[0].getType() == t1##_PARAM && this->defaultValue[1].getType() == t2##_PARAM) \
188    EXECUTOREXECUTER(_2_##t1##_##t2)(t1##_FUNC(sub.getString(0), t1##_DEFGRAB(0)), t2##_FUNC(sub.getString(1), t2##_DEFGRAB(1)))
189
190//! execute-macro for functions with three parameters
191#define ExecutorExecute3(t1,t2,t3) \
192   else if (this->paramCount == 3 && this->defaultValue[0].getType() == t1##_PARAM && this->defaultValue[1].getType() == t2##_PARAM && this->defaultValue[2].getType() == t3##_PARAM) \
193    EXECUTOREXECUTER(_3_##t1##_##t2##_##t3)(t1##_FUNC(sub.getString(0), t1##_DEFGRAB(0)), t2##_FUNC(sub.getString(1), t2##_DEFGRAB(1)), t3##_FUNC(sub.getString(2), t3##_DEFGRAB(2)))
194
195//! execute-macro for functions with four parameters
196#define ExecutorExecute4(t1,t2,t3,t4) \
197   else if (this->paramCount == 4 && this->defaultValue[0].getType() == t1##_PARAM && this->defaultValue[1].getType() == t2##_PARAM && this->defaultValue[2].getType() == t3##_PARAM && this->defaultValue[3].getType() == t4##_PARAM) \
198    EXECUTOREXECUTER(_4_##t1##_##t2##_##t3##_##t4)(t1##_FUNC(sub.getString(0), t1##_DEFGRAB(0)), t2##_FUNC(sub.getString(1), t2##_DEFGRAB(1)), t3##_FUNC(sub.getString(2), t3##_DEFGRAB(2)), t4##_FUNC(sub.getString(3), t4##_DEFGRAB(3)))
199
200//! execute-macro for functions with five parameters
201#define ExecutorExecute5(t1,t2,t3,t4,t5) \
202   else if (this->paramCount == 5 && this->defaultValue[0].getType() == t1##_PARAM && this->defaultValue[1].getType() == t2##_PARAM && this->defaultValue[2].getType() == t3##_PARAM && this->defaultValue[3].getType() == t4##_PARAM && this->defaultValue[4].getType() == t5##_PARAM) \
203    EXECUTOREXECUTER(_5_##t1##_##t2##_##t3##_##t4##_##t5)(t1##_FUNC(sub.getString(0), t1##_DEFGRAB(0)), t2##_FUNC(sub.getString(1), t2##_DEFGRAB(1)), t3##_FUNC(sub.getString(2), t3##_DEFGRAB(2)), t4##_FUNC(sub.getString(3), t4##_DEFGRAB(3)), t5##_FUNC(sub.getString(4), t5##_DEFGRAB(4)))
204
205
206
207
208
209//////////\//////////
210// DYNAMIC FUNCTOR //
211///////////\/////////
212#ifdef FUNCTOR_LIST
213#undef FUNCTOR_LIST
214#endif
215#ifdef EXECUTOR
216#undef EXECUTOR
217#endif
218#define EXECUTOR                       ExecutorObjective
219#ifdef EXECUTOREXECUTER
220#undef EXECUTOREXECUTER
221#endif
222#define EXECUTOREXECUTER(nameExt)      (dynamic_cast<T*>(object)->*(fp.functionPointer##nameExt))
223#ifdef EXECUTORINCLASS
224#undef EXECUTORINCLASS
225#endif
226#define EXECUTORINCLASS(FUNCTION)      (T::FUNCTION)
227#ifdef EXECUTORTYPE
228#undef EXECUTORTYPE
229#endif
230#define EXECUTORTYPE                   Executor_Objective
231//! keeps information about a Executor
232template<class T> class ExecutorObjective : public Executor
233{
234  public:
235    ExecutorObjective() : Executor() { };
236    // COPY constuctor (virtual version)
237    virtual Executor* clone () const
238    {
239      ExecutorObjective<T>* executor = new ExecutorObjective<T>();
240      this->cloning(executor);
241      executor->fp = this->fp;
242      return executor;
243    }
244
245//! FUNCTOR_LIST is the List of CommandConstructors
246#define FUNCTOR_LIST(x) ExecutorConstructor ## x
247#include "functor_list.h"
248#undef FUNCTOR_LIST
249
250  private:
251//! FUNCTOR_LIST is the List of FunctionPointers
252    union FunctionPointers {
253#define FUNCTOR_LIST(x) ExecutorFunctionPoiter ## x
254#include "functor_list.h"
255#undef FUNCTOR_LIST
256    } fp;
257
258    virtual void execute (BaseObject* object, const char* parameters)
259    {
260      SubString sub(parameters, true);
261//! FUNCTOR_LIST is the List of Executive Functions
262#define FUNCTOR_LIST(x) ExecutorExecute ## x
263#include "functor_list.h"
264#undef FUNCTOR_LIST
265    }
266};
267
268
269////////////////////
270// STATIC FUNCTOR //
271////////////////////
272#ifdef FUNCTOR_LIST
273#undef FUNCTOR_LIST
274#endif
275#ifdef EXECUTOR
276#undef EXECUTOR
277#endif
278#define EXECUTOR                      ExecutorStatic
279#ifdef EXECUTOREXECUTER
280#undef EXECUTOREXECUTER
281#endif
282#define EXECUTOREXECUTER(nameExt)     fp.functionPointer##nameExt
283#ifdef EXECUTORINCLASS
284#undef EXECUTORINCLASS
285#endif
286#define EXECUTORINCLASS(FUNCTION)     (FUNCTION)
287#ifdef EXECUTORTYPE
288#undef EXECUTORTYPE
289#endif
290#define EXECUTORTYPE                   Executor_Static
291
292//! keeps information about a Executor, that points to a Static Function
293template<class T> class ExecutorStatic : public Executor
294{
295  public:
296    ExecutorStatic() : Executor() { };
297    // COPY constuctor
298    virtual Executor* clone () const
299    {
300      ExecutorStatic<T>* executor = new ExecutorStatic<T>();
301      this->cloning(executor);
302      executor->fp = this->fp;
303      return executor;
304    }
305
306//! FUNCTOR_LIST is the List of CommandConstructors
307#define FUNCTOR_LIST(x) ExecutorConstructor ## x
308#include "functor_list.h"
309#undef FUNCTOR_LIST
310
311  private:
312//! FUNCTOR_LIST is the List of FunctionPointers
313    union FunctionPointers {
314#define FUNCTOR_LIST(x) ExecutorFunctionPoiter ## x
315#include "functor_list.h"
316#undef FUNCTOR_LIST
317    } fp;
318
319
320    virtual void execute (BaseObject* object, const char* parameters)
321    {
322  SubString sub(parameters, true);
323//! FUNCTOR_LIST is the List of Executive Functions
324#define FUNCTOR_LIST(x) ExecutorExecute ## x
325#include "functor_list.h"
326#undef FUNCTOR_LIST
327    }
328};
329
330#endif /* _EXECUTOR_H */
Note: See TracBrowser for help on using the repository browser.