Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/new_class_id/src/lib/util/executor/executor_functional.h @ 9737

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

split it up

File size: 21.1 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#include "executor.h"
26#include "substring.h"
27
28
29template<typename type> type fromString(const std::string& input, type defaultValue) { return defaultValue; };
30template<> bool fromString<bool>(const std::string& input, bool defaultValue);
31template<> int fromString<int>(const std::string& input, int defaultValue);
32template<> unsigned int fromString<unsigned int>(const std::string& input, unsigned int defaultValue);
33template<> float fromString<float>(const std::string& input, float defaultValue);
34template<> char fromString<char>(const std::string& input, char defaultValue);
35template<> const std::string& fromString<const std::string&>(const std::string& input, const std::string& defaultValue);
36
37template<typename type> type fromMulti(const MultiType& multi) { /* return defaultValue; */ };
38template<> bool fromMulti<bool>(const MultiType& multi);
39template<> int fromMulti<int>(const MultiType& multi);
40template<> unsigned int fromMulti<unsigned int>(const MultiType& multi);
41template<> float fromMulti<float>(const MultiType& multi);
42template<> char fromMulti<char>(const MultiType& multi);
43template<> const std::string& fromMulti<const std::string&>(const MultiType& multi);
44
45
46template<typename type> type getDefault(const MultiType* const defaultValues, unsigned int i) { return (type)0; };
47template<> bool getDefault<bool>(const MultiType* const defaultValues, unsigned int i);
48template<> int getDefault<int>(const MultiType* const defaultValues, unsigned int i);
49template<> unsigned int getDefault<unsigned int>(const MultiType* const defaultValues, unsigned int i);
50template<> float getDefault<float>(const MultiType* const defaultValues, unsigned int i);
51template<> char getDefault<char>(const MultiType* const defaultValues, unsigned int i);
52template<> const std::string& getDefault<const std::string&>(const MultiType* const defaultValues, unsigned int i);
53
54
55/**
56 * @brief this is a Template Class used as an evaluater.
57 *
58 * Trait to determine a default Value for any Type,
59 * and to define the Convertible, and how it is transformed into the
60 * corresponding SubTypes over the operator().
61 *
62 * This Class must be reimplemented for each Convertible and all of its
63 *  conversion-members.
64 *
65 * e.g: Convertible SubSting, that splits up into many Stings
66 *      conversion-members: (int) can be transformed from a String.
67 */
68template<typename FromType> class ExecutorEvaluater
69{
70public:
71  /** @brief Executes the Evaluater
72   * @param CallValue the Value that should be converted
73   * @param defaults the default Values.
74   */
75  template <typename ToType, int index>
76  ToType operator()(FromType& CallValue, const MultiType* const defaults)
77  {
78    return defaultValue; /*(CallValue.size() > index) ?
79           fromString<ToType>(CallValue[index], getDefault<ToType>(defaults, index)) :
80    fromMulti<ToType>(defaults[index]); */
81  }
82  static FromType& defaultValue() { return FromType(); };
83};
84
85/**
86 * @brief to remove writing errors, this function is Used.
87 * @param sub The SubString to use
88 * @param default The default Values.
89 */
90template<> class ExecutorEvaluater <const SubString>
91{
92public:
93  /** @brief Executes the Evaluater
94   * @param CallValue the Value that should be converted
95   * @param defaults the default Values.
96   */
97  template <typename ToType, int index>
98  ToType operator()(const SubString& CallValue, const MultiType* const defaults)
99  {
100    return (CallValue.size() > index) ?
101           fromString<ToType>(CallValue[index], getDefault<ToType>(defaults, index)) :
102           fromMulti<ToType>(defaults[index]);
103  }
104  static const SubString& defaultValue() { return SubString::NullSubString; };
105};
106
107
108
109
110#endif /* __EXECUTOR_FUNCTIONAL_H_ */
111
112//! if Functional is constant calling
113#define __EXECUTOR_FUNCTIONAL_CONST
114//! The Name to be attached to the functional (for normal, static, and const modes)
115#define __EXECUTOR_FUNCTIONAL_NAME(ParamCount)   Executor##ParamCount##Params
116//! The Execution-mode (either static or objective)
117#define __EXECUTOR_FUNCTIONAL_FUNCTION_EXEC      dynamic_cast<T*>(object)->*(functionPointer)
118//! The Function-Pointer, and how to save it internally.
119#define __EXECUTOR_FUNCTIONAL_FUNCTION_POINTER   T::*functionPointer
120#define __EXECUTOR_FUNCTIONAL_FUNCTIONTYPE       Executor<CallType, BaseClass>::FunctionMember
121
122#ifdef EXECUTOR_FUNCTIONAL_USE_CONST            //! USING CONST FUNCTIONALS
123 #ifdef __EXECUTOR_FUNCTIONAL_CONST_INCLUDED    //!< CHECK IF ALREADY INCLUED CONST FUNCTIONALS
124  #define __EXECUTOR_FUNCTIONAL_NOT_INCLUDE_THIS
125 #else
126  #define __EXECUTOR_FUNCTIONAL_CONST_INCLUDED
127 #endif
128 #undef __EXECUTOR_FUNCTIONAL_CONST
129 #define __EXECUTOR_FUNCTIONAL_CONST const
130 #undef __EXECUTOR_FUNCTIONAL_FUNCTIONTYPE
131 #define __EXECUTOR_FUNCTIONAL_FUNCTIONTYPE       Executor<CallType, BaseClass>::FunctionConstMember
132 #undef __EXECUTOR_FUNCTIONAL_NAME
133 #define __EXECUTOR_FUNCTIONAL_NAME(ParamCount) Executor##ParamCount##Params_const
134//#endif /* EXECUTOR_FUNCTIONAL_USE_CONST */
135
136#elif defined EXECUTOR_FUNCTIONAL_USE_STATIC
137 #ifdef EXECUTOR_FUNCTIONAL_USE_CONST
138  #error you obviously do not know what you are doing !! ask the bensch
139 #endif
140
141#ifdef __EXECUTOR_FUNCTIONAL_STATIC_INCLUDED
142   #define __EXECUTOR_FUNCTIONAL_NOT_INCLUDE_THIS
143  #else
144   #define __EXECUTOR_FUNCTIONAL_STATIC_INCLUDED
145  #endif
146
147#undef __EXECUTOR_FUNCTIONAL_FUNCTION_EXEC
148 #define __EXECUTOR_FUNCTIONAL_FUNCTION_EXEC       functionPointer
149 #undef __EXECUTOR_FUNCTIONAL_NAME
150 #define __EXECUTOR_FUNCTIONAL_NAME(ParamCount)    Executor##ParamCount##Params_static
151 #undef __EXECUTOR_FUNCTIONAL_FUNCTION_POINTER
152 #define __EXECUTOR_FUNCTIONAL_FUNCTION_POINTER    *functionPointer
153 #undef __EXECUTOR_FUNCTIONAL_FUNCTIONTYPE
154 #define __EXECUTOR_FUNCTIONAL_FUNCTIONTYPE       Executor<CallType, BaseClass>::FunctionStatic
155
156//#endif /* EXECUTOR_FUNCTIONAL_USE_STATIC */
157#else
158 #ifdef __EXECUTOR_FUNCTIONAL_PLAIN_INCLUDED
159  #define __EXECUTOR_FUNCTIONAL_NOT_INCLUDE_THIS
160 #else
161  #define __EXECUTOR_FUNCTIONAL_PLAIN_INCLUDED
162 #endif
163#endif
164
165#ifndef __EXECUTOR_FUNCTIONAL_NOT_INCLUDE_THIS
166
167
168
169
170///////////
171//// 0 ////
172///////////
173//! @brief ExecutorClass, that can execute Functions without any parameters.
174template<class T, typename CallType, template<typename> class Evaluater = ExecutorEvaluater, class BaseClass = BaseObject>
175class __EXECUTOR_FUNCTIONAL_NAME(0) :public Executor<CallType, BaseClass>
176{
177private:
178  /** @brief the FunctioPointer. */
179  void (__EXECUTOR_FUNCTIONAL_FUNCTION_POINTER)() __EXECUTOR_FUNCTIONAL_CONST;
180
181public:
182  /**
183   * @brief constructs the Executor.
184   * @param __EXECUTOR_FUNCTIONAL_FUNCTION_POINTER the FunctionPointer to the Calling Function.
185   */
186  __EXECUTOR_FUNCTIONAL_NAME(0) (void (__EXECUTOR_FUNCTIONAL_FUNCTION_POINTER)() __EXECUTOR_FUNCTIONAL_CONST )
187      : Executor<CallType, BaseClass>(false, __EXECUTOR_FUNCTIONAL_FUNCTIONTYPE)
188  {
189    this->functionPointer = functionPointer;
190  };
191
192  /**
193   * @brief executes the Functional
194   * @param object the Object the action should be executed on.
195   * @param sub the SubString to get the Parameters from.
196   */
197  virtual void operator()(BaseObject* object, CallType& sub = Evaluater<CallType>::defaultValue()) const
198  {
199    (__EXECUTOR_FUNCTIONAL_FUNCTION_EXEC)();
200  };
201
202  /**
203   * @brief copies the Executor
204   * @returns a new Executor that's a copy of this one.
205   */
206  virtual Executor<CallType, BaseClass>* clone() const
207  {
208    return new __EXECUTOR_FUNCTIONAL_NAME(0)<T, CallType>(this->functionPointer);
209  };
210};
211
212
213
214
215
216///////////
217//// 1 ////
218///////////
219//! @brief ExecutorClass, that can execute Functions with one parameter.
220template<class T, typename CallType, typename type0, template<typename> class Evaluater = ExecutorEvaluater, class BaseClass = BaseObject>
221class __EXECUTOR_FUNCTIONAL_NAME(1) : public Executor<CallType, BaseClass>
222{
223private:
224  /** @brief the FunctioPointer. */
225  void (__EXECUTOR_FUNCTIONAL_FUNCTION_POINTER)(type0) __EXECUTOR_FUNCTIONAL_CONST;
226
227public:
228  /**
229   * @brief constructs the Executor.
230   * @param __EXECUTOR_FUNCTIONAL_FUNCTION_POINTER the FunctionPointer to the Calling Function.
231   */
232  __EXECUTOR_FUNCTIONAL_NAME(1) (void (__EXECUTOR_FUNCTIONAL_FUNCTION_POINTER)(type0) __EXECUTOR_FUNCTIONAL_CONST)
233      : Executor<CallType, BaseClass>(false, ExecutorParamType<type0>(), __EXECUTOR_FUNCTIONAL_FUNCTIONTYPE)
234  {
235    this->functionPointer = functionPointer;
236  };
237
238  /**
239   * @brief executes the Functional
240   * @param object the Object the action should be executed on.
241   * @param sub the SubString to get the Parameters from.
242   */
243  virtual void operator()(BaseObject* object, CallType& sub = Evaluater<CallType>::defaultValue()) const
244  {
245    (__EXECUTOR_FUNCTIONAL_FUNCTION_EXEC)(
246      Evaluater<CallType>().template operator()<type0, 0>(sub, this->defaultValue));
247  };
248
249  /**
250   * @brief copies the Executor
251   * @returns a new Executor that's a copy of this one.
252   */
253  virtual Executor<CallType, BaseClass>* clone() const
254  {
255    return  new __EXECUTOR_FUNCTIONAL_NAME(1)<T, CallType, type0>(this->functionPointer);
256  };
257};
258
259
260
261
262
263///////////
264//// 2 ////
265///////////
266//! @brief ExecutorClass, that can execute Functions with two parameters.
267template<class T, typename CallType, typename type0, typename type1, template<typename> class Evaluater = ExecutorEvaluater, class BaseClass = BaseObject>
268class __EXECUTOR_FUNCTIONAL_NAME(2) : public Executor<CallType, BaseClass>
269{
270private:
271  /** @brief the FunctioPointer. */
272  void (__EXECUTOR_FUNCTIONAL_FUNCTION_POINTER)(type0, type1) __EXECUTOR_FUNCTIONAL_CONST;
273
274public:
275  /**
276   * @brief constructs the Executor.
277   * @param __EXECUTOR_FUNCTIONAL_FUNCTION_POINTER the FunctionPointer to the Calling Function.
278   */
279  __EXECUTOR_FUNCTIONAL_NAME(2) (void (__EXECUTOR_FUNCTIONAL_FUNCTION_POINTER)(type0, type1) __EXECUTOR_FUNCTIONAL_CONST)
280      : Executor<CallType, BaseClass>(false, ExecutorParamType<type0>(), ExecutorParamType<type1>(), __EXECUTOR_FUNCTIONAL_FUNCTIONTYPE)
281  {
282    this->functionPointer = functionPointer;
283  };
284
285  /**
286   * @brief executes the Functional
287   * @param object the Object the action should be executed on.
288   * @param sub the SubString to get the Parameters from.
289   */
290  virtual void operator()(BaseObject* object, CallType& sub = Evaluater<CallType>::defaultValue()) const
291  {
292    (__EXECUTOR_FUNCTIONAL_FUNCTION_EXEC)(
293      Evaluater<CallType>().template operator()<type0, 0>(sub, this->defaultValue),
294      Evaluater<CallType>().template operator()<type1, 1>(sub, this->defaultValue));
295  };
296
297  /**
298   * @brief copies the Executor
299   * @returns a new Executor that's a copy of this one.
300   */
301  virtual Executor<CallType, BaseClass>* clone() const
302  {
303    return new __EXECUTOR_FUNCTIONAL_NAME(2)<T, CallType, type0, type1>(this->functionPointer);
304  };
305};
306
307
308
309
310
311///////////
312//// 3 ////
313///////////
314//! @brief ExecutorClass, that can execute Functions with three parameters.
315template<class T, typename CallType, typename type0, typename type1, typename type2, template<typename> class Evaluater = ExecutorEvaluater, class BaseClass = BaseObject>
316class __EXECUTOR_FUNCTIONAL_NAME(3) : public Executor<CallType, BaseClass>
317{
318private:
319  /** @brief the FunctioPointer. */
320  void (__EXECUTOR_FUNCTIONAL_FUNCTION_POINTER)(type0, type1, type2) __EXECUTOR_FUNCTIONAL_CONST;
321
322public:
323  /**
324   * @brief constructs the Executor.
325   * @param __EXECUTOR_FUNCTIONAL_FUNCTION_POINTER the FunctionPointer to the Calling Function.
326   */
327  __EXECUTOR_FUNCTIONAL_NAME(3) (void (__EXECUTOR_FUNCTIONAL_FUNCTION_POINTER)(type0, type1, type2) __EXECUTOR_FUNCTIONAL_CONST)
328      : Executor<CallType, BaseClass>(false, ExecutorParamType<type0>(), ExecutorParamType<type1>(), ExecutorParamType<type2>(), __EXECUTOR_FUNCTIONAL_FUNCTIONTYPE)
329  {
330    this->functionPointer = functionPointer;
331  };
332
333  /**
334   * @brief executes the Functional
335   * @param object the Object the action should be executed on.
336   * @param sub the SubString to get the Parameters from.
337   */
338  virtual void operator()(BaseObject* object, CallType& sub = Evaluater<CallType>::defaultValue()) const
339  {
340    (__EXECUTOR_FUNCTIONAL_FUNCTION_EXEC)(
341      Evaluater<CallType>().template operator()<type0, 0>(sub, this->defaultValue),
342      Evaluater<CallType>().template operator()<type1, 1>(sub, this->defaultValue),
343      Evaluater<CallType>().template operator()<type2, 2>(sub, this->defaultValue));
344  };
345
346  /**
347   * @brief copies the Executor
348   * @returns a new Executor that's a copy of this one.
349   */
350  virtual Executor<CallType, BaseClass>* clone() const
351  {
352    return new __EXECUTOR_FUNCTIONAL_NAME(3)<T, CallType, type0, type1, type2>(this->functionPointer);
353  };
354};
355
356
357
358
359
360///////////
361//// 4 ////
362///////////
363//! @brief ExecutorClass, that can execute Functions with four parameters.
364template<class T, typename CallType, typename type0, typename type1, typename type2, typename type3, template<typename> class Evaluater = ExecutorEvaluater, class BaseClass = BaseObject>
365class __EXECUTOR_FUNCTIONAL_NAME(4) : public Executor<CallType, BaseClass>
366{
367private:
368  /** @brief the FunctioPointer. */
369  void (__EXECUTOR_FUNCTIONAL_FUNCTION_POINTER)(type0, type1, type2, type3) __EXECUTOR_FUNCTIONAL_CONST;
370
371public:
372  /**
373   * @brief constructs the Executor.
374   * @param __EXECUTOR_FUNCTIONAL_FUNCTION_POINTER the FunctionPointer to the Calling Function.
375   */
376  __EXECUTOR_FUNCTIONAL_NAME(4) (void (__EXECUTOR_FUNCTIONAL_FUNCTION_POINTER)(type0, type1, type2, type3) __EXECUTOR_FUNCTIONAL_CONST)
377      : Executor<CallType, BaseClass>(false, ExecutorParamType<type0>(), ExecutorParamType<type1>(), ExecutorParamType<type2>(), ExecutorParamType<type3>(), __EXECUTOR_FUNCTIONAL_FUNCTIONTYPE)
378  {
379    this->functionPointer = functionPointer;
380  };
381
382  /**
383  * @brief executes the Functional
384  * @param object the Object the action should be executed on.
385  * @param sub the SubString to get the Parameters from.
386   */
387  virtual void operator()(BaseObject* object, CallType& sub = Evaluater<CallType>::defaultValue()) const
388  {
389    (__EXECUTOR_FUNCTIONAL_FUNCTION_EXEC)(
390      Evaluater<CallType>().template operator()<type0, 0>(sub, this->defaultValue),
391      Evaluater<CallType>().template operator()<type1, 1>(sub, this->defaultValue),
392      Evaluater<CallType>().template operator()<type2, 2>(sub, this->defaultValue),
393      Evaluater<CallType>().template operator()<type3, 3>(sub, this->defaultValue));
394  };
395
396  /**
397   * @brief copies the Executor
398   * @returns a new Executor that's a copy of this one.
399   */
400  virtual Executor<CallType, BaseClass>* clone() const
401  {
402    return new __EXECUTOR_FUNCTIONAL_NAME(4)<T, CallType, type0, type1, type2, type3>(this->functionPointer);
403  };
404};
405
406
407
408
409
410
411///////////
412//// 5 ////
413///////////
414//! @brief ExecutorClass, that can execute Functions with five parameters.
415template<class T, typename CallType, typename type0, typename type1, typename type2, typename type3, typename type4, template<typename> class Evaluater = ExecutorEvaluater, class BaseClass = BaseObject>
416class __EXECUTOR_FUNCTIONAL_NAME(5) : public Executor<CallType, BaseClass>
417{
418private:
419  /** @brief the FunctioPointer. */
420  void (__EXECUTOR_FUNCTIONAL_FUNCTION_POINTER)(type0, type1, type2, type3, type4) __EXECUTOR_FUNCTIONAL_CONST;
421
422public:
423  /**
424   * @brief constructs the Executor.
425   * @param __EXECUTOR_FUNCTIONAL_FUNCTION_POINTER the FunctionPointer to the Calling Function.
426   */
427  __EXECUTOR_FUNCTIONAL_NAME(5) (void (__EXECUTOR_FUNCTIONAL_FUNCTION_POINTER)(type0, type1, type2, type3, type4) __EXECUTOR_FUNCTIONAL_CONST)
428      : Executor<CallType, BaseClass>(false, ExecutorParamType<type0>(), ExecutorParamType<type1>(), ExecutorParamType<type2>(), ExecutorParamType<type3>(), ExecutorParamType<type4>(), __EXECUTOR_FUNCTIONAL_FUNCTIONTYPE)
429  {
430    this->functionPointer = functionPointer;
431  };
432
433  /**
434  * @brief executes the Functional
435  * @param object the Object the action should be executed on.
436  * @param sub the SubString to get the Parameters from.
437   */
438  virtual void operator()(BaseObject* object, CallType& sub = Evaluater<CallType>::defaultValue()) const
439  {
440    (__EXECUTOR_FUNCTIONAL_FUNCTION_EXEC)(
441      Evaluater<CallType>().template operator()<type0, 0>(sub, this->defaultValue),
442      Evaluater<CallType>().template operator()<type1, 1>(sub, this->defaultValue),
443      Evaluater<CallType>().template operator()<type2, 2>(sub, this->defaultValue),
444      Evaluater<CallType>().template operator()<type3, 3>(sub, this->defaultValue),
445      Evaluater<CallType>().template operator()<type4, 4>(sub, this->defaultValue));
446  };
447
448  /**
449   * @brief copies the Executor
450   * @returns a new Executor that's a copy of this one.
451   */
452  virtual Executor<CallType, BaseClass>* clone() const
453  {
454    return new __EXECUTOR_FUNCTIONAL_NAME(5)<T, CallType, type0, type1, type2, type3, type4>(this->functionPointer);
455  };
456};
457
458
459
460
461
462
463
464
465
466// // // // // // // // // // // // //
467//// EXTENSION TO HIDE CONSTRUCT /////
468// // // // // // // // // // // // //
469/**
470 * @brief enables us to easily retrieve an Executor of Class T with modular Argument-count, (without thinking about args at all)
471 */
472#define EXECUTOR_FUNCTIONAL_CREATOR0() \
473template<class T> Executor<const SubString>* createExecutor(void (__EXECUTOR_FUNCTIONAL_FUNCTION_POINTER)() __EXECUTOR_FUNCTIONAL_CONST) \
474{ \
475  return new __EXECUTOR_FUNCTIONAL_NAME(0)<T, const SubString>(functionPointer); \
476}
477
478/**
479 * @brief enables us to easily retrieve an Executor of Class T with modular Argument-count, (without thinking about args at all)
480 * @param type0 for internal usage: the first Argument
481 */
482#define EXECUTOR_FUNCTIONAL_CREATOR1(type0) \
483template<class T> Executor<const SubString>* createExecutor(void (__EXECUTOR_FUNCTIONAL_FUNCTION_POINTER)(type0) __EXECUTOR_FUNCTIONAL_CONST) \
484{ \
485  return new __EXECUTOR_FUNCTIONAL_NAME(1)<T, const SubString, type0>(functionPointer); \
486}
487
488/**
489 * @brief enables us to easily retrieve an Executor of Class T with modular Argument-count, (without thinking about args at all)
490 * @param type0 for internal usage: the first Argument
491 * @param type1 for internal usage: the second Argument
492 */
493#define EXECUTOR_FUNCTIONAL_CREATOR2(type0, type1) \
494template<class T> Executor<const SubString>* createExecutor(void (__EXECUTOR_FUNCTIONAL_FUNCTION_POINTER)(type0, type1) __EXECUTOR_FUNCTIONAL_CONST) \
495{ \
496  return new __EXECUTOR_FUNCTIONAL_NAME(2)<T, const SubString, type0, type1>(functionPointer); \
497}
498
499/**
500 * @brief enables us to easily retrieve an Executor of Class T with modular Argument-count, (without thinking about args at all)
501 * @param type0 for internal usage: the first Argument
502 * @param type1 for internal usage: the second Argument
503 * @param type2 for internal usage: the third Argument
504 */
505#define EXECUTOR_FUNCTIONAL_CREATOR3(type0, type1, type2) \
506template<class T> Executor<const SubString>* createExecutor(void (__EXECUTOR_FUNCTIONAL_FUNCTION_POINTER)(type0, type1, type2) __EXECUTOR_FUNCTIONAL_CONST) \
507{ \
508  return new __EXECUTOR_FUNCTIONAL_NAME(3)<T, const SubString, type0, type1, type2>(functionPointer); \
509}
510
511/**
512 * @brief enables us to easily retrieve an Executor of Class T with modular Argument-count, (without thinking about args at all)
513 * @param type0 for internal usage: the first Argument
514 * @param type1 for internal usage: the second Argument
515 * @param type2 for internal usage: the third Argument
516 * @param type3 for internal usage: the fourth Argument
517 */
518#define EXECUTOR_FUNCTIONAL_CREATOR4(type0, type1, type2, type3) \
519template<class T> Executor<const SubString>* createExecutor(void (__EXECUTOR_FUNCTIONAL_FUNCTION_POINTER)(type0, type1, type2, type3) __EXECUTOR_FUNCTIONAL_CONST) \
520{ \
521  return new __EXECUTOR_FUNCTIONAL_NAME(4)<T, const SubString, type0, type1, type2, type3>(functionPointer); \
522}
523
524/**
525 * @brief enables us to easily retrieve an Executor of Class T with modular Argument-count, (without thinking about args at all)
526 * @param type0 for internal usage: the first Argument
527 * @param type1 for internal usage: the second Argument
528 * @param type2 for internal usage: the third Argument
529 * @param type3 for internal usage: the fourth Argument
530 * @param type4 for internal usage: the fifth Argument
531 */
532#define EXECUTOR_FUNCTIONAL_CREATOR5(type0, type1, type2, type3, type4) \
533template<class T> Executor<const SubString>* createExecutor(void (__EXECUTOR_FUNCTIONAL_FUNCTION_POINTER)(type0, type1, type2, type3, type4) __EXECUTOR_FUNCTIONAL_CONST) \
534{ \
535    return new __EXECUTOR_FUNCTIONAL_NAME(5)<T, const SubString, type0, type1, type2, type3, type4>(functionPointer); \
536}
537
538
539/**
540 * Creates the FunctionCallers
541 */
542#define FUNCTOR_LIST(x) EXECUTOR_FUNCTIONAL_CREATOR ## x
543#include "functor_list.h"
544#undef FUNCTOR_LIST
545
546
547
548#undef __EXECUTOR_FUNCTIONAL_CONST
549#undef __EXECUTOR_FUNCTIONAL_NAME
550#undef __EXECUTOR_FUNCTIONAL_FUNCTION_EXEC
551#undef __EXECUTOR_FUNCTIONAL_FUNCTION_POINTER
552#undef __EXECUTOR_FUNCTIONAL_FUNCTIONTYPE
553
554#ifdef EXECUTOR_FUNCTIONAL_USE_CONST
555 #undef EXECUTOR_FUNCTIONAL_USE_CONST
556#endif
557#ifdef EXECUTOR_FUNCTIONAL_USE_STATIC
558 #undef EXECUTOR_FUNCTIONAL_USE_STATIC
559#endif
560
561
562#endif /* __EXECUTOR_FUNCTIONAL_NOT_INCLUDE_THIS */
563#undef __EXECUTOR_FUNCTIONAL_NOT_INCLUDE_THIS
Note: See TracBrowser for help on using the repository browser.