42 using func::applyFirst;
43 using func::applyLast;
46 using func::BindToArgument;
47 using std::make_tuple;
72 template<u
int i, u
int ii>
82 template<u
int i, u
int ii, u
int iii>
89 val1.o_ += val2.o_ + val3.o_;
93 template<u
int i, u
int ii, u
int iii, u
int iv>
101 val1.o_ += val2.o_ + val3.o_ + val4.o_;
105 template<u
int i, u
int ii, u
int iii, u
int iv, u
int v>
114 val1.o_ += val2.o_ + val3.o_ + val4.o_ + val5.o_;
146 check_partialApplication ();
147 check_functionalComposition ();
148 check_bindToArbitraryParameter ();
156 CHECK (6 == (fun13<1,2,3> (_1_, _2_, _3_)).o_ );
159 CHECK ( 1 ==
fun2 (fun11<1> (_1_)) );
160 CHECK ( 3 ==
fun2 (fun12<1,2> (_1_, _2_)) );
161 CHECK ( 6 ==
fun2 (fun13<1,2,3> (_1_, _2_, _3_)) );
162 CHECK (10 ==
fun2 (fun14<1,2,3,4> (_1_, _2_, _3_, _4_)) );
163 CHECK (15 ==
fun2 (fun15<1,2,3,4,5> (_1_, _2_, _3_, _4_, _5_)) );
165 CHECK ( 9 ==
fun2 (fun13<2,3,4> (_2_, _3_, _4_)) );
166 CHECK (18 ==
fun2 (fun13<5,6,7> (_5_, _6_, _7_)) );
167 CHECK (24 ==
fun2 (fun13<9,8,7> (_9_, _8_, _7_)) );
172 check_partialApplication ()
181 typedef function<Sig23> F23;
183 Sig123& f =fun13<1,2,3>;
188 using PH1 = std::_Placeholder<1>;
189 using PH2 = std::_Placeholder<2>;
195 F23 fun_23 = std::bind (f, num18
201 res = fun_23 (_2_,_3_).o_;
209 PartialArg arg(num18, PH1(), PH2());
211 fun_23 = std::bind (f, get<0>(arg)
216 res = fun_23 (_2_,_3_).o_;
230 res = fun_23 (_2_,_3_).o_;
240 fun_23 = func::applyFirst (f,
Num<1>(18));
243 res = fun_23 (_2_,_3_).o_;
249 function<Sig123> func123 (f);
250 fun_23 = func::applyFirst (func123,
Num<1>(19));
251 res = fun_23 (_2_,_3_).o_;
255 F12 fun_12 = func::applyLast(f,
Num<3>(20));
256 res = fun_12 (_1_,_2_).o_;
259 fun_12 = func::applyLast(func123,
Num<3>(21));
260 res = fun_12 (_1_,_2_).o_;
264 fun_12 = func::applyLast( fP,
Num<3>(22));
265 res = fun_12 (_1_,_2_).o_;
269 CHECK (1 == (func::applyLast (fun11<1> , _1_ ) ( ) ).o_);
270 CHECK (1+3 == (func::applyLast (fun12<1,3> , _3_ ) (_1_) ).o_);
271 CHECK (1+3+5 == (func::applyLast (fun13<1,3,5> , _5_ ) (_1_,_3_) ).o_);
272 CHECK (1+3+5+7 == (func::applyLast (fun14<1,3,5,7> , _7_ ) (_1_,_3_,_5_) ).o_);
273 CHECK (1+3+5+7+9 == (func::applyLast (fun15<1,3,5,7,9>, _9_ ) (_1_,_3_,_5_,_7_)).o_);
275 CHECK (9+8+7+6+5 == (func::applyFirst(fun15<9,8,7,6,5>, _9_ ) (_8_,_7_,_6_,_5_)).o_);
276 CHECK ( 8+7+6+5 == (func::applyFirst( fun14<8,7,6,5>, _8_ ) (_7_,_6_,_5_)).o_);
277 CHECK ( 7+6+5 == (func::applyFirst( fun13<7,6,5>, _7_ ) (_6_,_5_)).o_);
278 CHECK ( 6+5 == (func::applyFirst( fun12<6,5>, _6_ ) (_5_)).o_);
279 CHECK ( 5 == (func::applyFirst( fun11<5>, _5_ ) ( )).o_);
291 make_tuple(_3_,_2_,_1_)
295 Num<5> resN5 = fun_54 (_5_,_4_);
296 CHECK (5+4+3+2+1 == resN5.o_);
303 check_functionalComposition ()
312 Sig2 & ff = fun2< Num<1> >;
313 Sig11& f1 = fun11<1>;
314 Sig12& f2 = fun12<1,2>;
315 Sig13& f3 = fun13<1,2,3>;
316 Sig14& f4 = fun14<1,2,3,4>;
317 Sig15& f5 = fun15<1,2,3,4,5>;
319 CHECK (1 == func::chained(f1, ff) (_1_) );
320 CHECK (1+2 == func::chained(f2, ff) (_1_,_2_) );
321 CHECK (1+2+3 == func::chained(f3, ff) (_1_,_2_,_3_) );
322 CHECK (1+2+3+4 == func::chained(f4, ff) (_1_,_2_,_3_,_4_) );
323 CHECK (1+2+3+4+5 == func::chained(f5, ff) (_1_,_2_,_3_,_4_,_5_) );
326 function<Sig15> f5_fun = f5;
327 function<Sig2> ff_fun = ff;
328 CHECK (1+2+3+4+5 == func::chained(f5_fun, ff ) (_1_,_2_,_3_,_4_,_5_) );
329 CHECK (1+2+3+4+5 == func::chained(f5, ff_fun) (_1_,_2_,_3_,_4_,_5_) );
330 CHECK (1+2+3+4+5 == func::chained(f5_fun, ff_fun) (_1_,_2_,_3_,_4_,_5_) );
336 check_bindToArbitraryParameter ()
348 Sig15& f = fun15<1,2,3,4,5>;
349 SigA5& f5 = fun11<5>;
358 CHECK (55+2+3+4+5 == f_bound_1 ( _2_,_3_,_4_,_5_) );
359 CHECK (1+55+3+4+5 == f_bound_2 (_1_, _3_,_4_,_5_) );
360 CHECK (1+2+55+4+5 == f_bound_3 (_1_,_2_, _4_,_5_) );
361 CHECK (1+2+3+55+5 == f_bound_4 (_1_,_2_,_3_, _5_) );
362 CHECK (1+2+3+4+55 == f_bound_5 (_1_,_2_,_3_,_4_ ) );
368 CHECK (1+2+3+4+5 == f_bound_X (_1_,_2_,_3_,_4_,_5_) );
375 f_bound_5 = bindLast (f, bind(f5,
Num<5>(99)));
376 CHECK (1+2+3+4+99 == f_bound_5 (_1_,_2_,_3_,_4_ ) );
378 f_bound_5 = bindLast (f, bind(&f5,
Num<5>(99)));
379 CHECK (1+2+3+4+99 == f_bound_5 (_1_,_2_,_3_,_4_ ) );
381 function<Sig15> asFunctor(f);
382 f_bound_5 = bindLast (asFunctor, bind(f5,
Num<5>(88)));
383 CHECK (1+2+3+4+88 == f_bound_5 (_1_,_2_,_3_,_4_ ) );
A template metaprogramming technique for manipulating collections of types.
typename BuildTupleType< TYPES >::Type Tuple
Build a std::tuple from types given as type sequence.
Partial function application and building a complete function closure.
Implementation namespace for support and library code.
Metaprogramming tools for transforming functor types.
Simple test class runner.
A collection of frequently used helper functions to support unit testing.
Support for writing metaprogramming unit-tests dealing with typelists and flags.