MEL
Microthread & Execution library
ReturnAdaptorImpl.h
1 
2 namespace mel
3 {
4  namespace mpl
5  {
6  #if VARIABLE_NUM_ARGS == VARIABLE_MAX_ARGS
8  template <class TRet, class T >
9  class ReturnAdaptor_Base
10  {
11  public:
12  //ReturnAdaptor_Base( const T& functor,typename TypeTraits<TRet>::ParameterType retorno ): mFunctor( functor ),mReturn( retorno )
13  ReturnAdaptor_Base( T&& functor,typename TypeTraits<TRet>::ParameterType retorno ): mFunctor( std::forward<T>(functor) ),mReturn( retorno )
14  {
15  }
16  ReturnAdaptor_Base( const ReturnAdaptor_Base<TRet,T>& ob2 ): mFunctor( ob2.mFunctor ),
17  mReturn( ob2.mReturn )
18  {
19  }
20  template <class F>
21  bool operator ==( const F& ob2 ) const
22  {
23  // return mFunctor == ob2.mFunctor && mReturn == ob2.mReturn;
24  return equality( Int2Type< Conversion<F, ReturnAdaptor_Base<TRet,T> >::exists >(),ob2 );
25  }
26  private:
27  template <class F>
28  bool equality( Int2Type<false>,const F&) const
29  {
30  return false;
31  }
32  bool equality( Int2Type<true >,const ReturnAdaptor_Base<TRet,T>& ob2) const
33  {
34  //return (mFunctor == ob2.mFunctor && mReturn == ob2.mReturn);
35  return::mel::mpl::equal<true>( mFunctor, ob2.mFunctor ) &&::mel::mpl::equal<true>( mReturn, ob2.mReturn );
36  }
37  protected:
38  T mFunctor;
39  TRet mReturn;
40  };
41  //specialization for void return
42  template <class T >
43  class ReturnAdaptor_Base<void,T>
44  {
45  public:
46  ReturnAdaptor_Base( const T& functor ): mFunctor( functor )
47  {
48  }
49  ReturnAdaptor_Base( const ReturnAdaptor_Base<void,T>& ob2 ): mFunctor( ob2.mFunctor )
50  {
51  }
52  template <class F>
53  bool operator ==( const F& ob2 ) const
54  {
55  return equality( Int2Type< Conversion<F, ReturnAdaptor_Base<void,T> >::exists >(),ob2 );
56  }
57  private:
58  template <class F>
59  bool equality( Int2Type<false>,const F&) const
60  {
61  return false;
62  }
63  bool equality( Int2Type<true >,const ReturnAdaptor_Base<void,T>& ob2) const
64  {
65  //return (mFunctor == ob2.mFunctor);
66  return::mel::mpl::equal<true>( mFunctor, ob2.mFunctor );
67  }
68 
69  protected:
70  T mFunctor;
71  };
72 
74 
86  template <class TRet, class T, VARIABLE_ARGS >
89  : public ReturnAdaptor_Base<TRet, T >
91  {
92  public:
93  ReturnAdaptor( const T& functor, typename TypeTraits<TRet>::ParameterType retorno ):ReturnAdaptor_Base<TRet, T >( functor, retorno ){};
94  ReturnAdaptor( const ReturnAdaptor& ob2 ): ReturnAdaptor_Base<TRet, T >( ob2 ){};
95 
96  TRet operator()( VARIABLE_ARGS_IMPL )
97  {
98  ReturnAdaptor_Base<TRet, T >::mFunctor( VARIABLE_ARGS_USE );
99  return ReturnAdaptor_Base<TRet, T >::mReturn;
100  }
101  /*bool operator ==( const ReturnAdaptor& ob2 ) const
102  {
103  // return mFunctor == ob2.mFunctor && mReturn == ob2.mReturn;
104  return ReturnAdaptor_Base<TRet, T >::operator ==( ob2 );
105  }*/
106 
107  };
109  //specialization for void return
110  template <class T, VARIABLE_ARGS_NODEFAULT >
111  class ReturnAdaptor<void,T,VARIABLE_ARGS_DECL> : public ReturnAdaptor_Base<void, T >
112  {
113  public:
114  ReturnAdaptor( const T& functor):ReturnAdaptor_Base<void, T >( functor ){};
115  ReturnAdaptor( const ReturnAdaptor& ob2 ): ReturnAdaptor_Base<void, T >( ob2 ){};
116 
117  void operator()( VARIABLE_ARGS_IMPL )
118  {
119  mFunctor( VARIABLE_ARGS_USE );
120  }
121  /*bool operator ==( const ReturnAdaptor<void,T,VARIABLE_ARGS_DECL>& ob2 ) const
122  {
123  // return mFunctor == ob2.mFunctor && mReturn == ob2.mReturn;
124  return ReturnAdaptor_Base<void, T >::operator ==( ob2 );
125  }*/
126 
127  };
128  //specialization for void return and void arg
129  template <class T >
130  class ReturnAdaptor<void,T,void> : public ReturnAdaptor_Base<void, T >
131  {
132  public:
133  //ReturnAdaptor( const T& functor):ReturnAdaptor_Base<void, T >( functor ){};
134  ReturnAdaptor( T&& functor):ReturnAdaptor_Base<void, T >( std::forward<T>(functor) ){};
135  ReturnAdaptor( const ReturnAdaptor& ob2 ): ReturnAdaptor_Base<void, T >( ob2 ){};
136 
137  void operator()( )
138  {
139  ReturnAdaptor_Base<void, T >::mFunctor( );
140  }
141  /*bool operator ==( const ReturnAdaptor<void,T,void>& ob2 ) const
142  {
143  // return mFunctor == ob2.mFunctor && mReturn == ob2.mReturn;
144  return ReturnAdaptor_Base<void, T >::operator ==( ob2 );
145  }*/
146 
147  };
148 
149  //specialization for void arguments
150  template <class TRet,class T>
151  class ReturnAdaptor<TRet,T,void> : public ReturnAdaptor_Base<TRet,T>
152  {
153  public:
154  ReturnAdaptor( T&& functor, typename TypeTraits<TRet>::ParameterType retorno ):ReturnAdaptor_Base<TRet,T>( std::forward<T>(functor), retorno ){};
155  ReturnAdaptor( const ReturnAdaptor& ob2 ): ReturnAdaptor_Base<TRet,T>( ob2 ){};
156  TRet operator()()
157  {
158  ReturnAdaptor_Base<TRet,T>::mFunctor();
159  return ReturnAdaptor_Base<TRet,T>::mReturn;
160  }
161  /*bool operator ==( const ReturnAdaptor<TRet,T,void>& ob2 ) const
162  {
163  // return mFunctor == ob2.mFunctor && mReturn == ob2.mReturn;
164  return ReturnAdaptor_Base<TRet,T>::operator ==( ob2 );
165  }*/
166  };
168  template < VARIABLE_ARGS_NODEFAULT,class T,class TRet > inline
169  ReturnAdaptor<TRet,T,VARIABLE_ARGS_DECL> returnAdaptor( T&& functor, TRet retorno )
170  {
171  return ReturnAdaptor<TRet,T,VARIABLE_ARGS_DECL>( std::forward<T>(functor), retorno );
172  }
173 
174  //TODO incompleto, tengo que hacerlo para parametros variables!!
175  template < class T> inline
176  ReturnAdaptor<void,T,void> returnAdaptorVoid( T&& functor )
177  {
178  return ReturnAdaptor<void,T,void>( std::forward<T>(functor));
179  }
180 
181  #else
182  template <class TRet, class T, VARIABLE_ARGS >
183  class ReturnAdaptor<TRet, T, VARIABLE_ARGS_DECL> : public ReturnAdaptor_Base<TRet, T >
184  {
185  public:
186  ReturnAdaptor( T functor, typename TypeTraits<TRet>::ParameterType retorno ):ReturnAdaptor_Base<TRet, T >( functor, retorno ){};
187  ReturnAdaptor( const ReturnAdaptor& ob2 ): ReturnAdaptor_Base<TRet, T >( ob2 ){};
188  TRet operator()( VARIABLE_ARGS_IMPL )
189  {
190  ReturnAdaptor_Base<TRet, T >::mFunctor( VARIABLE_ARGS_USE );
191  return ReturnAdaptor_Base<TRet, T >::mReturn;
192  }
193 
194  };
195 
196 
197  template < VARIABLE_ARGS,class T,class TRet > inline
198  ReturnAdaptor<TRet,T,VARIABLE_ARGS_DECL> returnAdaptor( T&& functor, TRet retorno )
199  {
200  return ReturnAdaptor<TRet,T,VARIABLE_ARGS_DECL>( std::forward<T>(functor), retorno );
201  }
202  template < VARIABLE_ARGS,class T> inline
203  ReturnAdaptor<void,T,VARIABLE_ARGS_DECL> returnAdaptorVoid( T&& functor )
204  {
205  return ReturnAdaptor<void,T,VARIABLE_ARGS_DECL>( std::forward<T>(functor) );
206  }
207 
208  #endif
209  }
210 }
Definition: BasicTypes.h:7
Definition: ReturnAdaptorImpl.h:91
Small operator==(const AnyType &, const AnyType &)
Definition: Callback_Impl.h:11