MEL
Microthread & Execution library
ParamAdderImpl.h
1 
2 namespace mel
3 {
4  namespace mpl
5  {
6  #if VARIABLE_NUM_ARGS == VARIABLE_MAX_ARGS
8 
9  template <class T,class TRet,class NewArg>
10  class ParamAdder_Base
11  {
12  public:
13  ParamAdder_Base( T&& functor ):mFunctor( std::forward<T>(functor) ){};
14  template <class F>
15  bool operator ==( const F& ob2 ) const
16  {
17  return equality( Int2Type< Conversion<F, ParamAdder_Base<T,TRet,NewArg> >::exists >(),ob2 );
18  }
19  private:
20  template <class F>
21  bool equality( Int2Type<false>,const F&) const
22  {
23  return false;
24  }
25  bool equality( Int2Type<true >,const ParamAdder_Base<T,TRet,NewArg>& me2) const
26  {
27 
28  return::mel::mpl::equal<true>( mFunctor,me2.mFunctor );
29  }
30 
31  protected:
32  T mFunctor;
33  };
35 
52  template <class T,class TRet,class NewArg,VARIABLE_ARGS>
53  class ParamAdder
55  : public ParamAdder_Base<T,TRet,NewArg>
57  {
58  public:
59  ParamAdder( T&& functor ):ParamAdder_Base<T,TRet,NewArg>(std::forward<T>(functor)){};
60 
61  TRet operator()( VARIABLE_ARGS_IMPL,NewArg newarg )
62  {
63  return ParamAdder_Base<T,TRet,NewArg>::mFunctor( VARIABLE_ARGS_USE );
64  };
65  };
67  //specialization for void arguments
68  template <class T, class TRet, class NewArg >
69  class ParamAdder<T,TRet,NewArg,void> : public ParamAdder_Base<T,TRet,NewArg>
70  {
71  public:
72  ParamAdder( T&& functor ): ParamAdder_Base<T,TRet,NewArg>( std::forward<T>(functor) ){};
73  TRet operator()( NewArg )
74  {
75  return ParamAdder_Base<T,TRet,NewArg>::mFunctor();
76  }
77  /*bool operator ==( const ParamAdder<T,TRet,NewArg,void>& ob2 ) const
78  {
79  return ParamAdder_Base<T,TRet,NewArg>::operator ==( ob2 );
80  }*/
81 
82  };
84  template <class TRet, class NewArg,VARIABLE_ARGS_NODEFAULT,class T> inline
85  ParamAdder<T,TRet,VARIABLE_ARGS_DECL, NewArg> addParam( T functor )
86  {
87  return ParamAdder<T,TRet,NewArg, VARIABLE_ARGS_DECL>( std::forward<T>(functor) );
88  }
89  #else
90  template <class T,class TRet,class NewArg,VARIABLE_ARGS>
91  class ParamAdder<T,TRet,NewArg,VARIABLE_ARGS_DECL,void> : public ParamAdder_Base<T,TRet,NewArg>
92  {
93  public:
94  ParamAdder( T&& functor ):ParamAdder_Base<T,TRet,NewArg>( std::forward<T>(functor) ){};
95 
96  TRet operator()( VARIABLE_ARGS_IMPL,NewArg )
97  {
98  return ParamAdder_Base<T,TRet,NewArg>::mFunctor( VARIABLE_ARGS_USE );
99  };
100  /*bool operator ==( const ParamAdder<T,TRet,NewArg,VARIABLE_ARGS_DECL,void>& ob2 ) const
101  {
102  return ParamAdder_Base<T,TRet,NewArg>::operator ==( ob2 );
103  }*/
104 
105  };
106 
107 
108  template <class TRet, class NewArg,VARIABLE_ARGS,class T> inline
109  ParamAdder<T,TRet,NewArg,VARIABLE_ARGS_DECL > addParam( T functor )
110  {
111  return ParamAdder<T,TRet,NewArg,VARIABLE_ARGS_DECL>( std::forward<T>(functor) );
112  }
113  #endif
114  }
115 
135  namespace mpl
136  {
137  #if VARIABLE_NUM_ARGS == VARIABLE_MAX_ARGS
139 
140  template <class T,class TRet,class NewArg>
141  class ParamAdder_prev_Base
142  {
143  public:
144  ParamAdder_prev_Base( T&& functor ):mFunctor( std::forward<T>(functor) ){};
145  template <class F>
146  bool operator ==( const F& ob2 ) const
147  {
148  return equality( Int2Type< Conversion<F, ParamAdder_prev_Base<T,TRet,NewArg> >::exists >(),ob2 );
149  }
150  private:
151  template <class F>
152  bool equality( Int2Type<false>,const F&) const
153  {
154  return false;
155  }
156  bool equality( Int2Type<true >,const ParamAdder_prev_Base<T,TRet,NewArg>& me2) const
157  {
158  return (mFunctor == me2.mFunctor);
159  }
160 
161  protected:
162  T mFunctor;
163  };
165  template <class T,class TRet,class NewArg,VARIABLE_ARGS>
166  class ParamAdder_prev : public ParamAdder_prev_Base<T,TRet,NewArg>
167  {
168  public:
169  ParamAdder_prev( const T& functor ):ParamAdder_prev_Base<T,TRet,NewArg>(functor){};
170 
171  TRet operator()( NewArg newarg,VARIABLE_ARGS_IMPL )
172  {
173  return ParamAdder_prev_Base<T,TRet,NewArg>::mFunctor( VARIABLE_ARGS_USE );
174  };
175  /*bool operator ==( const ParamAdder_prev& ob2 ) const
176  {
177  return ParamAdder_prev_Base<T,TRet,NewArg>::operator ==( ob2 );
178  }*/
179  };
181  //specialization for void arguments
182  template <class T, class TRet, class NewArg >
183  class ParamAdder_prev<T,TRet,NewArg,void> : public ParamAdder_prev_Base<T,TRet,NewArg>
184  {
185  public:
186  ParamAdder_prev( const T& functor ): ParamAdder_prev_Base<T,TRet,NewArg>( functor ){};
187  TRet operator()( NewArg )
188  {
189  return ParamAdder_prev_Base<T,TRet,NewArg>::mFunctor();
190  }
191  /*bool operator ==( const ParamAdder_prev<T,TRet,NewArg,void>& ob2 ) const
192  {
193  return ParamAdder_prev_Base<T,TRet,NewArg>::operator ==( ob2 );
194  }*/
195 
196  };
198  template <class TRet, class NewArg,VARIABLE_ARGS_NODEFAULT,class T> inline
199  ParamAdder_prev<T,TRet,VARIABLE_ARGS_DECL, NewArg> addParam_prev( T functor )
200  {
202  }
203  #else
204  template <class T,class TRet,class NewArg,VARIABLE_ARGS>
205  class ParamAdder_prev<T,TRet,NewArg,VARIABLE_ARGS_DECL,void> : public ParamAdder_prev_Base<T,TRet,NewArg>
206  {
207  public:
208  ParamAdder_prev( const T& functor ):ParamAdder_prev_Base<T,TRet,NewArg>( functor ){};
209 
210  TRet operator()( NewArg, VARIABLE_ARGS_IMPL)
211  {
212  return ParamAdder_prev_Base<T,TRet,NewArg>::mFunctor( VARIABLE_ARGS_USE );
213  };
214  /*bool operator ==( const ParamAdder_prev<T,TRet,NewArg,VARIABLE_ARGS_DECL,void>& ob2 ) const
215  {
216  return ParamAdder_prev_Base<T,TRet,NewArg>::operator ==( ob2 );
217  }*/
218  };
219 
220 
221  template <class TRet, class NewArg,VARIABLE_ARGS,class T> inline
222  ParamAdder_prev<T,TRet,NewArg,VARIABLE_ARGS_DECL > addParam_prev( T functor )
223  {
225  }
226  #endif
227  }
228 }
create new functor with new param for operator() BEFORE any other param usage: suppose we have a func...
Definition: ParamAdderImpl.h:167
create new functor with new param for operator() AFTER any other param usage: suppose we have a funct...
Definition: ParamAdderImpl.h:57
Small operator==(const AnyType &, const AnyType &)
Definition: Callback_Impl.h:11