1 ////////////////////////////////////////////////////////////////////////////////
3 // Copyright (c) 2001 by Andrei Alexandrescu
4 // This code accompanies the book:
5 // Alexandrescu, Andrei. "Modern C++ Design: Generic Programming and Design
6 // Patterns Applied". Copyright (c) 2001. Addison-Wesley.
7 // Permission to use, copy, modify, distribute and sell this software for any
8 // purpose is hereby granted without fee, provided that the above copyright
9 // notice appear in all copies and that both that copyright notice and this
10 // permission notice appear in supporting documentation.
11 // The author or Addison-Wesley Longman make no representations about the
12 // suitability of this software for any purpose. It is provided "as is"
13 // without express or implied warranty.
14 ////////////////////////////////////////////////////////////////////////////////
15 #ifndef LOKI_FUNCTOR_INC_
16 #define LOKI_FUNCTOR_INC_
18 // $Id: Functor.h 750 2006-10-17 19:50:02Z syntheticpp $
23 #include "EmptyType.h"
25 #include "TypeTraits.h"
29 /// \defgroup FunctorGroup Function objects
31 #ifndef LOKI_FUNCTOR_IS_NOT_A_SMALLOBJECT
32 //#define LOKI_FUNCTOR_IS_NOT_A_SMALLOBJECT
35 #ifndef LOKI_FUNCTORS_ARE_COMPARABLE
36 //#define LOKI_FUNCTORS_ARE_COMPARABLE
41 /// All classes of Loki are in the Loki namespace
44 ////////////////////////////////////////////////////////////////////////////////
45 // class template FunctorImpl (internal)
46 ////////////////////////////////////////////////////////////////////////////////
50 template <typename R, template <class, class> class ThreadingModel>
51 struct FunctorImplBase
52 #ifdef LOKI_FUNCTOR_IS_NOT_A_SMALLOBJECT
56 public SmallValueObject<ThreadingModel>
58 inline FunctorImplBase() :
59 SmallValueObject<ThreadingModel>() {}
60 inline FunctorImplBase(const FunctorImplBase &) :
61 SmallValueObject<ThreadingModel>() {}
65 typedef FunctorImplBase<R, ThreadingModel> FunctorImplBaseType;
67 typedef EmptyType Parm1;
68 typedef EmptyType Parm2;
69 typedef EmptyType Parm3;
70 typedef EmptyType Parm4;
71 typedef EmptyType Parm5;
72 typedef EmptyType Parm6;
73 typedef EmptyType Parm7;
74 typedef EmptyType Parm8;
75 typedef EmptyType Parm9;
76 typedef EmptyType Parm10;
77 typedef EmptyType Parm11;
78 typedef EmptyType Parm12;
79 typedef EmptyType Parm13;
80 typedef EmptyType Parm14;
81 typedef EmptyType Parm15;
84 virtual ~FunctorImplBase()
87 virtual FunctorImplBase *DoClone() const = 0;
90 static U *Clone(U *pObj)
93 U *pClone = static_cast<U *>(pObj->DoClone());
94 assert(typeid(*pClone) == typeid(*pObj));
99 #ifdef LOKI_FUNCTORS_ARE_COMPARABLE
101 virtual bool operator==(const FunctorImplBase &) const = 0;
108 ////////////////////////////////////////////////////////////////////////////////
109 // macro LOKI_DEFINE_CLONE_FUNCTORIMPL
110 // Implements the DoClone function for a functor implementation
111 ////////////////////////////////////////////////////////////////////////////////
113 #define LOKI_DEFINE_CLONE_FUNCTORIMPL(Cls) \
114 virtual Cls* DoClone() const { return new Cls(*this); }
116 ////////////////////////////////////////////////////////////////////////////////
117 // class template FunctorImpl
118 // The base class for a hierarchy of functors. The FunctorImpl class is not used
119 // directly; rather, the Functor class manages and forwards to a pointer to
121 // You may want to derive your own functors from FunctorImpl.
122 // Specializations of FunctorImpl for up to 15 parameters follow
123 ////////////////////////////////////////////////////////////////////////////////
125 template <typename R, class TList,
126 template <class, class> class ThreadingModel = LOKI_DEFAULT_THREADING_NO_OBJ_LEVEL>
129 ////////////////////////////////////////////////////////////////////////////////
130 // class template FunctorImpl
131 // Specialization for 0 (zero) parameters
132 ////////////////////////////////////////////////////////////////////////////////
134 template <typename R, template <class, class> class ThreadingModel>
135 class FunctorImpl<R, NullType, ThreadingModel>
136 : public Private::FunctorImplBase<R, ThreadingModel>
139 typedef R ResultType;
140 virtual R operator()() = 0;
143 ////////////////////////////////////////////////////////////////////////////////
144 // class template FunctorImpl
145 // Specialization for 1 parameter
146 ////////////////////////////////////////////////////////////////////////////////
148 template <typename R, typename P1, template <class, class> class ThreadingModel>
149 class FunctorImpl<R, Seq<P1>, ThreadingModel>
150 : public Private::FunctorImplBase<R, ThreadingModel>
153 typedef R ResultType;
154 typedef typename TypeTraits<P1>::ParameterType Parm1;
155 virtual R operator()(Parm1) = 0;
158 ////////////////////////////////////////////////////////////////////////////////
159 // class template FunctorImpl
160 // Specialization for 2 parameters
161 ////////////////////////////////////////////////////////////////////////////////
163 template <typename R, typename P1, typename P2,
164 template <class, class> class ThreadingModel>
165 class FunctorImpl<R, Seq<P1, P2>, ThreadingModel>
166 : public Private::FunctorImplBase<R, ThreadingModel>
169 typedef R ResultType;
170 typedef typename TypeTraits<P1>::ParameterType Parm1;
171 typedef typename TypeTraits<P2>::ParameterType Parm2;
172 virtual R operator()(Parm1, Parm2) = 0;
175 ////////////////////////////////////////////////////////////////////////////////
176 // class template FunctorImpl
177 // Specialization for 3 parameters
178 ////////////////////////////////////////////////////////////////////////////////
180 template <typename R, typename P1, typename P2, typename P3,
181 template <class, class> class ThreadingModel>
182 class FunctorImpl<R, Seq<P1, P2, P3>, ThreadingModel>
183 : public Private::FunctorImplBase<R, ThreadingModel>
186 typedef R ResultType;
187 typedef typename TypeTraits<P1>::ParameterType Parm1;
188 typedef typename TypeTraits<P2>::ParameterType Parm2;
189 typedef typename TypeTraits<P3>::ParameterType Parm3;
190 virtual R operator()(Parm1, Parm2, Parm3) = 0;
193 ////////////////////////////////////////////////////////////////////////////////
194 // class template FunctorImpl
195 // Specialization for 4 parameters
196 ////////////////////////////////////////////////////////////////////////////////
198 template <typename R, typename P1, typename P2, typename P3, typename P4,
199 template <class, class> class ThreadingModel>
200 class FunctorImpl<R, Seq<P1, P2, P3, P4>, ThreadingModel>
201 : public Private::FunctorImplBase<R, ThreadingModel>
204 typedef R ResultType;
205 typedef typename TypeTraits<P1>::ParameterType Parm1;
206 typedef typename TypeTraits<P2>::ParameterType Parm2;
207 typedef typename TypeTraits<P3>::ParameterType Parm3;
208 typedef typename TypeTraits<P4>::ParameterType Parm4;
209 virtual R operator()(Parm1, Parm2, Parm3, Parm4) = 0;
212 ////////////////////////////////////////////////////////////////////////////////
213 // class template FunctorImpl
214 // Specialization for 5 parameters
215 ////////////////////////////////////////////////////////////////////////////////
217 template <typename R, typename P1, typename P2, typename P3, typename P4,
219 template <class, class> class ThreadingModel>
220 class FunctorImpl<R, Seq<P1, P2, P3, P4, P5>, ThreadingModel>
221 : public Private::FunctorImplBase<R, ThreadingModel>
224 typedef R ResultType;
225 typedef typename TypeTraits<P1>::ParameterType Parm1;
226 typedef typename TypeTraits<P2>::ParameterType Parm2;
227 typedef typename TypeTraits<P3>::ParameterType Parm3;
228 typedef typename TypeTraits<P4>::ParameterType Parm4;
229 typedef typename TypeTraits<P5>::ParameterType Parm5;
230 virtual R operator()(Parm1, Parm2, Parm3, Parm4, Parm5) = 0;
233 ////////////////////////////////////////////////////////////////////////////////
234 // class template FunctorImpl
235 // Specialization for 6 parameters
236 ////////////////////////////////////////////////////////////////////////////////
238 template <typename R, typename P1, typename P2, typename P3, typename P4,
239 typename P5, typename P6,
240 template <class, class> class ThreadingModel>
241 class FunctorImpl<R, Seq<P1, P2, P3, P4, P5, P6>, ThreadingModel>
242 : public Private::FunctorImplBase<R, ThreadingModel>
245 typedef R ResultType;
246 typedef typename TypeTraits<P1>::ParameterType Parm1;
247 typedef typename TypeTraits<P2>::ParameterType Parm2;
248 typedef typename TypeTraits<P3>::ParameterType Parm3;
249 typedef typename TypeTraits<P4>::ParameterType Parm4;
250 typedef typename TypeTraits<P5>::ParameterType Parm5;
251 typedef typename TypeTraits<P6>::ParameterType Parm6;
252 virtual R operator()(Parm1, Parm2, Parm3, Parm4, Parm5, Parm6) = 0;
255 ////////////////////////////////////////////////////////////////////////////////
256 // class template FunctorImpl
257 // Specialization for 7 parameters
258 ////////////////////////////////////////////////////////////////////////////////
260 template <typename R, typename P1, typename P2, typename P3, typename P4,
261 typename P5, typename P6, typename P7,
262 template <class, class> class ThreadingModel>
263 class FunctorImpl<R, Seq<P1, P2, P3, P4, P5, P6, P7>, ThreadingModel>
264 : public Private::FunctorImplBase<R, ThreadingModel>
267 typedef R ResultType;
268 typedef typename TypeTraits<P1>::ParameterType Parm1;
269 typedef typename TypeTraits<P2>::ParameterType Parm2;
270 typedef typename TypeTraits<P3>::ParameterType Parm3;
271 typedef typename TypeTraits<P4>::ParameterType Parm4;
272 typedef typename TypeTraits<P5>::ParameterType Parm5;
273 typedef typename TypeTraits<P6>::ParameterType Parm6;
274 typedef typename TypeTraits<P7>::ParameterType Parm7;
275 virtual R operator()(Parm1, Parm2, Parm3, Parm4, Parm5, Parm6,
279 ////////////////////////////////////////////////////////////////////////////////
280 // class template FunctorImpl
281 // Specialization for 8 parameters
282 ////////////////////////////////////////////////////////////////////////////////
284 template <typename R, typename P1, typename P2, typename P3, typename P4,
285 typename P5, typename P6, typename P7, typename P8,
286 template <class, class> class ThreadingModel>
287 class FunctorImpl<R, Seq<P1, P2, P3, P4, P5, P6, P7, P8>,
289 : public Private::FunctorImplBase<R, ThreadingModel>
292 typedef R ResultType;
293 typedef typename TypeTraits<P1>::ParameterType Parm1;
294 typedef typename TypeTraits<P2>::ParameterType Parm2;
295 typedef typename TypeTraits<P3>::ParameterType Parm3;
296 typedef typename TypeTraits<P4>::ParameterType Parm4;
297 typedef typename TypeTraits<P5>::ParameterType Parm5;
298 typedef typename TypeTraits<P6>::ParameterType Parm6;
299 typedef typename TypeTraits<P7>::ParameterType Parm7;
300 typedef typename TypeTraits<P8>::ParameterType Parm8;
301 virtual R operator()(Parm1, Parm2, Parm3, Parm4, Parm5, Parm6,
305 ////////////////////////////////////////////////////////////////////////////////
306 // class template FunctorImpl
307 // Specialization for 9 parameters
308 ////////////////////////////////////////////////////////////////////////////////
310 template <typename R, typename P1, typename P2, typename P3, typename P4,
311 typename P5, typename P6, typename P7, typename P8, typename P9,
312 template <class, class> class ThreadingModel>
313 class FunctorImpl<R, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9>,
315 : public Private::FunctorImplBase<R, ThreadingModel>
318 typedef R ResultType;
319 typedef typename TypeTraits<P1>::ParameterType Parm1;
320 typedef typename TypeTraits<P2>::ParameterType Parm2;
321 typedef typename TypeTraits<P3>::ParameterType Parm3;
322 typedef typename TypeTraits<P4>::ParameterType Parm4;
323 typedef typename TypeTraits<P5>::ParameterType Parm5;
324 typedef typename TypeTraits<P6>::ParameterType Parm6;
325 typedef typename TypeTraits<P7>::ParameterType Parm7;
326 typedef typename TypeTraits<P8>::ParameterType Parm8;
327 typedef typename TypeTraits<P9>::ParameterType Parm9;
328 virtual R operator()(Parm1, Parm2, Parm3, Parm4, Parm5, Parm6,
329 Parm7, Parm8, Parm9) = 0;
332 ////////////////////////////////////////////////////////////////////////////////
333 // class template FunctorImpl
334 // Specialization for 10 parameters
335 ////////////////////////////////////////////////////////////////////////////////
337 template <typename R, typename P1, typename P2, typename P3, typename P4,
338 typename P5, typename P6, typename P7, typename P8, typename P9,
340 template <class, class> class ThreadingModel>
341 class FunctorImpl<R, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10>,
343 : public Private::FunctorImplBase<R, ThreadingModel>
346 typedef R ResultType;
347 typedef typename TypeTraits<P1>::ParameterType Parm1;
348 typedef typename TypeTraits<P2>::ParameterType Parm2;
349 typedef typename TypeTraits<P3>::ParameterType Parm3;
350 typedef typename TypeTraits<P4>::ParameterType Parm4;
351 typedef typename TypeTraits<P5>::ParameterType Parm5;
352 typedef typename TypeTraits<P6>::ParameterType Parm6;
353 typedef typename TypeTraits<P7>::ParameterType Parm7;
354 typedef typename TypeTraits<P8>::ParameterType Parm8;
355 typedef typename TypeTraits<P9>::ParameterType Parm9;
356 typedef typename TypeTraits<P10>::ParameterType Parm10;
357 virtual R operator()(Parm1, Parm2, Parm3, Parm4, Parm5, Parm6,
358 Parm7, Parm8, Parm9, Parm10) = 0;
361 ////////////////////////////////////////////////////////////////////////////////
362 // class template FunctorImpl
363 // Specialization for 11 parameters
364 ////////////////////////////////////////////////////////////////////////////////
366 template <typename R, typename P1, typename P2, typename P3, typename P4,
367 typename P5, typename P6, typename P7, typename P8, typename P9,
368 typename P10, typename P11,
369 template <class, class> class ThreadingModel>
371 Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11>,
373 : public Private::FunctorImplBase<R, ThreadingModel>
376 typedef R ResultType;
377 typedef typename TypeTraits<P1>::ParameterType Parm1;
378 typedef typename TypeTraits<P2>::ParameterType Parm2;
379 typedef typename TypeTraits<P3>::ParameterType Parm3;
380 typedef typename TypeTraits<P4>::ParameterType Parm4;
381 typedef typename TypeTraits<P5>::ParameterType Parm5;
382 typedef typename TypeTraits<P6>::ParameterType Parm6;
383 typedef typename TypeTraits<P7>::ParameterType Parm7;
384 typedef typename TypeTraits<P8>::ParameterType Parm8;
385 typedef typename TypeTraits<P9>::ParameterType Parm9;
386 typedef typename TypeTraits<P10>::ParameterType Parm10;
387 typedef typename TypeTraits<P11>::ParameterType Parm11;
388 virtual R operator()(Parm1, Parm2, Parm3, Parm4, Parm5, Parm6,
389 Parm7, Parm8, Parm9, Parm10, Parm11) = 0;
392 ////////////////////////////////////////////////////////////////////////////////
393 // class template FunctorImpl
394 // Specialization for 12 parameters
395 ////////////////////////////////////////////////////////////////////////////////
397 template <typename R, typename P1, typename P2, typename P3, typename P4,
398 typename P5, typename P6, typename P7, typename P8, typename P9,
399 typename P10, typename P11, typename P12,
400 template <class, class> class ThreadingModel>
402 Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12>,
404 : public Private::FunctorImplBase<R, ThreadingModel>
407 typedef R ResultType;
408 typedef typename TypeTraits<P1>::ParameterType Parm1;
409 typedef typename TypeTraits<P2>::ParameterType Parm2;
410 typedef typename TypeTraits<P3>::ParameterType Parm3;
411 typedef typename TypeTraits<P4>::ParameterType Parm4;
412 typedef typename TypeTraits<P5>::ParameterType Parm5;
413 typedef typename TypeTraits<P6>::ParameterType Parm6;
414 typedef typename TypeTraits<P7>::ParameterType Parm7;
415 typedef typename TypeTraits<P8>::ParameterType Parm8;
416 typedef typename TypeTraits<P9>::ParameterType Parm9;
417 typedef typename TypeTraits<P10>::ParameterType Parm10;
418 typedef typename TypeTraits<P11>::ParameterType Parm11;
419 typedef typename TypeTraits<P12>::ParameterType Parm12;
420 virtual R operator()(Parm1, Parm2, Parm3, Parm4, Parm5, Parm6,
421 Parm7, Parm8, Parm9, Parm10, Parm11, Parm12) = 0;
424 ////////////////////////////////////////////////////////////////////////////////
425 // class template FunctorImpl
426 // Specialization for 13 parameters
427 ////////////////////////////////////////////////////////////////////////////////
429 template <typename R, typename P1, typename P2, typename P3, typename P4,
430 typename P5, typename P6, typename P7, typename P8, typename P9,
431 typename P10, typename P11, typename P12, typename P13,
432 template <class, class> class ThreadingModel>
434 Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13>,
436 : public Private::FunctorImplBase<R, ThreadingModel>
439 typedef R ResultType;
440 typedef typename TypeTraits<P1>::ParameterType Parm1;
441 typedef typename TypeTraits<P2>::ParameterType Parm2;
442 typedef typename TypeTraits<P3>::ParameterType Parm3;
443 typedef typename TypeTraits<P4>::ParameterType Parm4;
444 typedef typename TypeTraits<P5>::ParameterType Parm5;
445 typedef typename TypeTraits<P6>::ParameterType Parm6;
446 typedef typename TypeTraits<P7>::ParameterType Parm7;
447 typedef typename TypeTraits<P8>::ParameterType Parm8;
448 typedef typename TypeTraits<P9>::ParameterType Parm9;
449 typedef typename TypeTraits<P10>::ParameterType Parm10;
450 typedef typename TypeTraits<P11>::ParameterType Parm11;
451 typedef typename TypeTraits<P12>::ParameterType Parm12;
452 typedef typename TypeTraits<P13>::ParameterType Parm13;
453 virtual R operator()(Parm1, Parm2, Parm3, Parm4, Parm5, Parm6,
454 Parm7, Parm8, Parm9, Parm10, Parm11, Parm12, Parm13) = 0;
457 ////////////////////////////////////////////////////////////////////////////////
458 // class template FunctorImpl
459 // Specialization for 14 parameters
460 ////////////////////////////////////////////////////////////////////////////////
462 template <typename R, typename P1, typename P2, typename P3, typename P4,
463 typename P5, typename P6, typename P7, typename P8, typename P9,
464 typename P10, typename P11, typename P12, typename P13, typename P14,
465 template <class, class> class ThreadingModel>
467 Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13,
470 : public Private::FunctorImplBase<R, ThreadingModel>
473 typedef R ResultType;
474 typedef typename TypeTraits<P1>::ParameterType Parm1;
475 typedef typename TypeTraits<P2>::ParameterType Parm2;
476 typedef typename TypeTraits<P3>::ParameterType Parm3;
477 typedef typename TypeTraits<P4>::ParameterType Parm4;
478 typedef typename TypeTraits<P5>::ParameterType Parm5;
479 typedef typename TypeTraits<P6>::ParameterType Parm6;
480 typedef typename TypeTraits<P7>::ParameterType Parm7;
481 typedef typename TypeTraits<P8>::ParameterType Parm8;
482 typedef typename TypeTraits<P9>::ParameterType Parm9;
483 typedef typename TypeTraits<P10>::ParameterType Parm10;
484 typedef typename TypeTraits<P11>::ParameterType Parm11;
485 typedef typename TypeTraits<P12>::ParameterType Parm12;
486 typedef typename TypeTraits<P13>::ParameterType Parm13;
487 typedef typename TypeTraits<P14>::ParameterType Parm14;
488 virtual R operator()(Parm1, Parm2, Parm3, Parm4, Parm5, Parm6,
489 Parm7, Parm8, Parm9, Parm10, Parm11, Parm12, Parm13, Parm14) = 0;
492 ////////////////////////////////////////////////////////////////////////////////
493 // class template FunctorImpl
494 // Specialization for 15 parameters
495 ////////////////////////////////////////////////////////////////////////////////
497 template <typename R, typename P1, typename P2, typename P3, typename P4,
498 typename P5, typename P6, typename P7, typename P8, typename P9,
499 typename P10, typename P11, typename P12, typename P13, typename P14,
500 typename P15, template <class, class> class ThreadingModel>
502 Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13,
505 : public Private::FunctorImplBase<R, ThreadingModel>
508 typedef R ResultType;
509 typedef typename TypeTraits<P1>::ParameterType Parm1;
510 typedef typename TypeTraits<P2>::ParameterType Parm2;
511 typedef typename TypeTraits<P3>::ParameterType Parm3;
512 typedef typename TypeTraits<P4>::ParameterType Parm4;
513 typedef typename TypeTraits<P5>::ParameterType Parm5;
514 typedef typename TypeTraits<P6>::ParameterType Parm6;
515 typedef typename TypeTraits<P7>::ParameterType Parm7;
516 typedef typename TypeTraits<P8>::ParameterType Parm8;
517 typedef typename TypeTraits<P9>::ParameterType Parm9;
518 typedef typename TypeTraits<P10>::ParameterType Parm10;
519 typedef typename TypeTraits<P11>::ParameterType Parm11;
520 typedef typename TypeTraits<P12>::ParameterType Parm12;
521 typedef typename TypeTraits<P13>::ParameterType Parm13;
522 typedef typename TypeTraits<P14>::ParameterType Parm14;
523 typedef typename TypeTraits<P15>::ParameterType Parm15;
524 virtual R operator()(Parm1, Parm2, Parm3, Parm4, Parm5, Parm6,
525 Parm7, Parm8, Parm9, Parm10, Parm11, Parm12, Parm13, Parm14,
529 #ifndef LOKI_DISABLE_TYPELIST_MACROS
531 ////////////////////////////////////////////////////////////////////////////////
532 // class template FunctorImpl
533 // Specialization for 1 parameter
534 ////////////////////////////////////////////////////////////////////////////////
536 template <typename R, typename P1, template <class, class> class ThreadingModel>
537 class FunctorImpl<R, LOKI_TYPELIST_1(P1), ThreadingModel>
538 : public Private::FunctorImplBase<R, ThreadingModel>
541 typedef R ResultType;
542 typedef typename TypeTraits<P1>::ParameterType Parm1;
543 virtual R operator()(Parm1) = 0;
546 ////////////////////////////////////////////////////////////////////////////////
547 // class template FunctorImpl
548 // Specialization for 2 parameters
549 ////////////////////////////////////////////////////////////////////////////////
551 template <typename R, typename P1, typename P2,
552 template <class, class> class ThreadingModel>
553 class FunctorImpl<R, LOKI_TYPELIST_2(P1, P2), ThreadingModel>
554 : public Private::FunctorImplBase<R, ThreadingModel>
557 typedef R ResultType;
558 typedef typename TypeTraits<P1>::ParameterType Parm1;
559 typedef typename TypeTraits<P2>::ParameterType Parm2;
560 virtual R operator()(Parm1, Parm2) = 0;
563 ////////////////////////////////////////////////////////////////////////////////
564 // class template FunctorImpl
565 // Specialization for 3 parameters
566 ////////////////////////////////////////////////////////////////////////////////
568 template <typename R, typename P1, typename P2, typename P3,
569 template <class, class> class ThreadingModel>
570 class FunctorImpl<R, LOKI_TYPELIST_3(P1, P2, P3), ThreadingModel>
571 : public Private::FunctorImplBase<R, ThreadingModel>
574 typedef R ResultType;
575 typedef typename TypeTraits<P1>::ParameterType Parm1;
576 typedef typename TypeTraits<P2>::ParameterType Parm2;
577 typedef typename TypeTraits<P3>::ParameterType Parm3;
578 virtual R operator()(Parm1, Parm2, Parm3) = 0;
581 ////////////////////////////////////////////////////////////////////////////////
582 // class template FunctorImpl
583 // Specialization for 4 parameters
584 ////////////////////////////////////////////////////////////////////////////////
586 template <typename R, typename P1, typename P2, typename P3, typename P4,
587 template <class, class> class ThreadingModel>
588 class FunctorImpl<R, LOKI_TYPELIST_4(P1, P2, P3, P4), ThreadingModel>
589 : public Private::FunctorImplBase<R, ThreadingModel>
592 typedef R ResultType;
593 typedef typename TypeTraits<P1>::ParameterType Parm1;
594 typedef typename TypeTraits<P2>::ParameterType Parm2;
595 typedef typename TypeTraits<P3>::ParameterType Parm3;
596 typedef typename TypeTraits<P4>::ParameterType Parm4;
597 virtual R operator()(Parm1, Parm2, Parm3, Parm4) = 0;
600 ////////////////////////////////////////////////////////////////////////////////
601 // class template FunctorImpl
602 // Specialization for 5 parameters
603 ////////////////////////////////////////////////////////////////////////////////
605 template <typename R, typename P1, typename P2, typename P3, typename P4,
607 template <class, class> class ThreadingModel>
608 class FunctorImpl<R, LOKI_TYPELIST_5(P1, P2, P3, P4, P5), ThreadingModel>
609 : public Private::FunctorImplBase<R, ThreadingModel>
612 typedef R ResultType;
613 typedef typename TypeTraits<P1>::ParameterType Parm1;
614 typedef typename TypeTraits<P2>::ParameterType Parm2;
615 typedef typename TypeTraits<P3>::ParameterType Parm3;
616 typedef typename TypeTraits<P4>::ParameterType Parm4;
617 typedef typename TypeTraits<P5>::ParameterType Parm5;
618 virtual R operator()(Parm1, Parm2, Parm3, Parm4, Parm5) = 0;
621 ////////////////////////////////////////////////////////////////////////////////
622 // class template FunctorImpl
623 // Specialization for 6 parameters
624 ////////////////////////////////////////////////////////////////////////////////
626 template <typename R, typename P1, typename P2, typename P3, typename P4,
627 typename P5, typename P6,
628 template <class, class> class ThreadingModel>
629 class FunctorImpl<R, LOKI_TYPELIST_6(P1, P2, P3, P4, P5, P6), ThreadingModel>
630 : public Private::FunctorImplBase<R, ThreadingModel>
633 typedef R ResultType;
634 typedef typename TypeTraits<P1>::ParameterType Parm1;
635 typedef typename TypeTraits<P2>::ParameterType Parm2;
636 typedef typename TypeTraits<P3>::ParameterType Parm3;
637 typedef typename TypeTraits<P4>::ParameterType Parm4;
638 typedef typename TypeTraits<P5>::ParameterType Parm5;
639 typedef typename TypeTraits<P6>::ParameterType Parm6;
640 virtual R operator()(Parm1, Parm2, Parm3, Parm4, Parm5, Parm6) = 0;
643 ////////////////////////////////////////////////////////////////////////////////
644 // class template FunctorImpl
645 // Specialization for 7 parameters
646 ////////////////////////////////////////////////////////////////////////////////
648 template <typename R, typename P1, typename P2, typename P3, typename P4,
649 typename P5, typename P6, typename P7,
650 template <class, class> class ThreadingModel>
651 class FunctorImpl<R, LOKI_TYPELIST_7(P1, P2, P3, P4, P5, P6, P7), ThreadingModel>
652 : public Private::FunctorImplBase<R, ThreadingModel>
655 typedef R ResultType;
656 typedef typename TypeTraits<P1>::ParameterType Parm1;
657 typedef typename TypeTraits<P2>::ParameterType Parm2;
658 typedef typename TypeTraits<P3>::ParameterType Parm3;
659 typedef typename TypeTraits<P4>::ParameterType Parm4;
660 typedef typename TypeTraits<P5>::ParameterType Parm5;
661 typedef typename TypeTraits<P6>::ParameterType Parm6;
662 typedef typename TypeTraits<P7>::ParameterType Parm7;
663 virtual R operator()(Parm1, Parm2, Parm3, Parm4, Parm5, Parm6,
667 ////////////////////////////////////////////////////////////////////////////////
668 // class template FunctorImpl
669 // Specialization for 8 parameters
670 ////////////////////////////////////////////////////////////////////////////////
672 template <typename R, typename P1, typename P2, typename P3, typename P4,
673 typename P5, typename P6, typename P7, typename P8,
674 template <class, class> class ThreadingModel>
675 class FunctorImpl<R, LOKI_TYPELIST_8(P1, P2, P3, P4, P5, P6, P7, P8),
677 : public Private::FunctorImplBase<R, ThreadingModel>
680 typedef R ResultType;
681 typedef typename TypeTraits<P1>::ParameterType Parm1;
682 typedef typename TypeTraits<P2>::ParameterType Parm2;
683 typedef typename TypeTraits<P3>::ParameterType Parm3;
684 typedef typename TypeTraits<P4>::ParameterType Parm4;
685 typedef typename TypeTraits<P5>::ParameterType Parm5;
686 typedef typename TypeTraits<P6>::ParameterType Parm6;
687 typedef typename TypeTraits<P7>::ParameterType Parm7;
688 typedef typename TypeTraits<P8>::ParameterType Parm8;
689 virtual R operator()(Parm1, Parm2, Parm3, Parm4, Parm5, Parm6,
693 ////////////////////////////////////////////////////////////////////////////////
694 // class template FunctorImpl
695 // Specialization for 9 parameters
696 ////////////////////////////////////////////////////////////////////////////////
698 template <typename R, typename P1, typename P2, typename P3, typename P4,
699 typename P5, typename P6, typename P7, typename P8, typename P9,
700 template <class, class> class ThreadingModel>
701 class FunctorImpl<R, LOKI_TYPELIST_9(P1, P2, P3, P4, P5, P6, P7, P8, P9),
703 : public Private::FunctorImplBase<R, ThreadingModel>
706 typedef R ResultType;
707 typedef typename TypeTraits<P1>::ParameterType Parm1;
708 typedef typename TypeTraits<P2>::ParameterType Parm2;
709 typedef typename TypeTraits<P3>::ParameterType Parm3;
710 typedef typename TypeTraits<P4>::ParameterType Parm4;
711 typedef typename TypeTraits<P5>::ParameterType Parm5;
712 typedef typename TypeTraits<P6>::ParameterType Parm6;
713 typedef typename TypeTraits<P7>::ParameterType Parm7;
714 typedef typename TypeTraits<P8>::ParameterType Parm8;
715 typedef typename TypeTraits<P9>::ParameterType Parm9;
716 virtual R operator()(Parm1, Parm2, Parm3, Parm4, Parm5, Parm6,
717 Parm7, Parm8, Parm9) = 0;
720 ////////////////////////////////////////////////////////////////////////////////
721 // class template FunctorImpl
722 // Specialization for 10 parameters
723 ////////////////////////////////////////////////////////////////////////////////
725 template <typename R, typename P1, typename P2, typename P3, typename P4,
726 typename P5, typename P6, typename P7, typename P8, typename P9,
728 template <class, class> class ThreadingModel>
729 class FunctorImpl<R, LOKI_TYPELIST_10(P1, P2, P3, P4, P5, P6, P7, P8, P9, P10),
731 : public Private::FunctorImplBase<R, ThreadingModel>
734 typedef R ResultType;
735 typedef typename TypeTraits<P1>::ParameterType Parm1;
736 typedef typename TypeTraits<P2>::ParameterType Parm2;
737 typedef typename TypeTraits<P3>::ParameterType Parm3;
738 typedef typename TypeTraits<P4>::ParameterType Parm4;
739 typedef typename TypeTraits<P5>::ParameterType Parm5;
740 typedef typename TypeTraits<P6>::ParameterType Parm6;
741 typedef typename TypeTraits<P7>::ParameterType Parm7;
742 typedef typename TypeTraits<P8>::ParameterType Parm8;
743 typedef typename TypeTraits<P9>::ParameterType Parm9;
744 typedef typename TypeTraits<P10>::ParameterType Parm10;
745 virtual R operator()(Parm1, Parm2, Parm3, Parm4, Parm5, Parm6,
746 Parm7, Parm8, Parm9, Parm10) = 0;
749 ////////////////////////////////////////////////////////////////////////////////
750 // class template FunctorImpl
751 // Specialization for 11 parameters
752 ////////////////////////////////////////////////////////////////////////////////
754 template <typename R, typename P1, typename P2, typename P3, typename P4,
755 typename P5, typename P6, typename P7, typename P8, typename P9,
756 typename P10, typename P11,
757 template <class, class> class ThreadingModel>
759 LOKI_TYPELIST_11(P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11),
761 : public Private::FunctorImplBase<R, ThreadingModel>
764 typedef R ResultType;
765 typedef typename TypeTraits<P1>::ParameterType Parm1;
766 typedef typename TypeTraits<P2>::ParameterType Parm2;
767 typedef typename TypeTraits<P3>::ParameterType Parm3;
768 typedef typename TypeTraits<P4>::ParameterType Parm4;
769 typedef typename TypeTraits<P5>::ParameterType Parm5;
770 typedef typename TypeTraits<P6>::ParameterType Parm6;
771 typedef typename TypeTraits<P7>::ParameterType Parm7;
772 typedef typename TypeTraits<P8>::ParameterType Parm8;
773 typedef typename TypeTraits<P9>::ParameterType Parm9;
774 typedef typename TypeTraits<P10>::ParameterType Parm10;
775 typedef typename TypeTraits<P11>::ParameterType Parm11;
776 virtual R operator()(Parm1, Parm2, Parm3, Parm4, Parm5, Parm6,
777 Parm7, Parm8, Parm9, Parm10, Parm11) = 0;
780 ////////////////////////////////////////////////////////////////////////////////
781 // class template FunctorImpl
782 // Specialization for 12 parameters
783 ////////////////////////////////////////////////////////////////////////////////
785 template <typename R, typename P1, typename P2, typename P3, typename P4,
786 typename P5, typename P6, typename P7, typename P8, typename P9,
787 typename P10, typename P11, typename P12,
788 template <class, class> class ThreadingModel>
790 LOKI_TYPELIST_12(P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12),
792 : public Private::FunctorImplBase<R, ThreadingModel>
795 typedef R ResultType;
796 typedef typename TypeTraits<P1>::ParameterType Parm1;
797 typedef typename TypeTraits<P2>::ParameterType Parm2;
798 typedef typename TypeTraits<P3>::ParameterType Parm3;
799 typedef typename TypeTraits<P4>::ParameterType Parm4;
800 typedef typename TypeTraits<P5>::ParameterType Parm5;
801 typedef typename TypeTraits<P6>::ParameterType Parm6;
802 typedef typename TypeTraits<P7>::ParameterType Parm7;
803 typedef typename TypeTraits<P8>::ParameterType Parm8;
804 typedef typename TypeTraits<P9>::ParameterType Parm9;
805 typedef typename TypeTraits<P10>::ParameterType Parm10;
806 typedef typename TypeTraits<P11>::ParameterType Parm11;
807 typedef typename TypeTraits<P12>::ParameterType Parm12;
808 virtual R operator()(Parm1, Parm2, Parm3, Parm4, Parm5, Parm6,
809 Parm7, Parm8, Parm9, Parm10, Parm11, Parm12) = 0;
812 ////////////////////////////////////////////////////////////////////////////////
813 // class template FunctorImpl
814 // Specialization for 13 parameters
815 ////////////////////////////////////////////////////////////////////////////////
817 template <typename R, typename P1, typename P2, typename P3, typename P4,
818 typename P5, typename P6, typename P7, typename P8, typename P9,
819 typename P10, typename P11, typename P12, typename P13,
820 template <class, class> class ThreadingModel>
822 LOKI_TYPELIST_13(P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13),
824 : public Private::FunctorImplBase<R, ThreadingModel>
827 typedef R ResultType;
828 typedef typename TypeTraits<P1>::ParameterType Parm1;
829 typedef typename TypeTraits<P2>::ParameterType Parm2;
830 typedef typename TypeTraits<P3>::ParameterType Parm3;
831 typedef typename TypeTraits<P4>::ParameterType Parm4;
832 typedef typename TypeTraits<P5>::ParameterType Parm5;
833 typedef typename TypeTraits<P6>::ParameterType Parm6;
834 typedef typename TypeTraits<P7>::ParameterType Parm7;
835 typedef typename TypeTraits<P8>::ParameterType Parm8;
836 typedef typename TypeTraits<P9>::ParameterType Parm9;
837 typedef typename TypeTraits<P10>::ParameterType Parm10;
838 typedef typename TypeTraits<P11>::ParameterType Parm11;
839 typedef typename TypeTraits<P12>::ParameterType Parm12;
840 typedef typename TypeTraits<P13>::ParameterType Parm13;
841 virtual R operator()(Parm1, Parm2, Parm3, Parm4, Parm5, Parm6,
842 Parm7, Parm8, Parm9, Parm10, Parm11, Parm12, Parm13) = 0;
845 ////////////////////////////////////////////////////////////////////////////////
846 // class template FunctorImpl
847 // Specialization for 14 parameters
848 ////////////////////////////////////////////////////////////////////////////////
850 template <typename R, typename P1, typename P2, typename P3, typename P4,
851 typename P5, typename P6, typename P7, typename P8, typename P9,
852 typename P10, typename P11, typename P12, typename P13, typename P14,
853 template <class, class> class ThreadingModel>
855 LOKI_TYPELIST_14(P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13,
858 : public Private::FunctorImplBase<R, ThreadingModel>
861 typedef R ResultType;
862 typedef typename TypeTraits<P1>::ParameterType Parm1;
863 typedef typename TypeTraits<P2>::ParameterType Parm2;
864 typedef typename TypeTraits<P3>::ParameterType Parm3;
865 typedef typename TypeTraits<P4>::ParameterType Parm4;
866 typedef typename TypeTraits<P5>::ParameterType Parm5;
867 typedef typename TypeTraits<P6>::ParameterType Parm6;
868 typedef typename TypeTraits<P7>::ParameterType Parm7;
869 typedef typename TypeTraits<P8>::ParameterType Parm8;
870 typedef typename TypeTraits<P9>::ParameterType Parm9;
871 typedef typename TypeTraits<P10>::ParameterType Parm10;
872 typedef typename TypeTraits<P11>::ParameterType Parm11;
873 typedef typename TypeTraits<P12>::ParameterType Parm12;
874 typedef typename TypeTraits<P13>::ParameterType Parm13;
875 typedef typename TypeTraits<P14>::ParameterType Parm14;
876 virtual R operator()(Parm1, Parm2, Parm3, Parm4, Parm5, Parm6,
877 Parm7, Parm8, Parm9, Parm10, Parm11, Parm12, Parm13, Parm14) = 0;
880 ////////////////////////////////////////////////////////////////////////////////
881 // class template FunctorImpl
882 // Specialization for 15 parameters
883 ////////////////////////////////////////////////////////////////////////////////
885 template <typename R, typename P1, typename P2, typename P3, typename P4,
886 typename P5, typename P6, typename P7, typename P8, typename P9,
887 typename P10, typename P11, typename P12, typename P13, typename P14,
888 typename P15, template <class, class> class ThreadingModel>
890 LOKI_TYPELIST_15(P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13,
893 : public Private::FunctorImplBase<R, ThreadingModel>
896 typedef R ResultType;
897 typedef typename TypeTraits<P1>::ParameterType Parm1;
898 typedef typename TypeTraits<P2>::ParameterType Parm2;
899 typedef typename TypeTraits<P3>::ParameterType Parm3;
900 typedef typename TypeTraits<P4>::ParameterType Parm4;
901 typedef typename TypeTraits<P5>::ParameterType Parm5;
902 typedef typename TypeTraits<P6>::ParameterType Parm6;
903 typedef typename TypeTraits<P7>::ParameterType Parm7;
904 typedef typename TypeTraits<P8>::ParameterType Parm8;
905 typedef typename TypeTraits<P9>::ParameterType Parm9;
906 typedef typename TypeTraits<P10>::ParameterType Parm10;
907 typedef typename TypeTraits<P11>::ParameterType Parm11;
908 typedef typename TypeTraits<P12>::ParameterType Parm12;
909 typedef typename TypeTraits<P13>::ParameterType Parm13;
910 typedef typename TypeTraits<P14>::ParameterType Parm14;
911 typedef typename TypeTraits<P15>::ParameterType Parm15;
912 virtual R operator()(Parm1, Parm2, Parm3, Parm4, Parm5, Parm6,
913 Parm7, Parm8, Parm9, Parm10, Parm11, Parm12, Parm13, Parm14,
917 #endif //LOKI_DISABLE_TYPELIST_MACROS
919 ////////////////////////////////////////////////////////////////////////////////
920 // class template FunctorHandler
921 // Wraps functors and pointers to functions
922 ////////////////////////////////////////////////////////////////////////////////
924 template <class ParentFunctor, typename Fun>
926 : public ParentFunctor::Impl
928 typedef typename ParentFunctor::Impl Base;
931 typedef typename Base::ResultType ResultType;
932 typedef typename Base::Parm1 Parm1;
933 typedef typename Base::Parm2 Parm2;
934 typedef typename Base::Parm3 Parm3;
935 typedef typename Base::Parm4 Parm4;
936 typedef typename Base::Parm5 Parm5;
937 typedef typename Base::Parm6 Parm6;
938 typedef typename Base::Parm7 Parm7;
939 typedef typename Base::Parm8 Parm8;
940 typedef typename Base::Parm9 Parm9;
941 typedef typename Base::Parm10 Parm10;
942 typedef typename Base::Parm11 Parm11;
943 typedef typename Base::Parm12 Parm12;
944 typedef typename Base::Parm13 Parm13;
945 typedef typename Base::Parm14 Parm14;
946 typedef typename Base::Parm15 Parm15;
948 FunctorHandler(const Fun &fun) : f_(fun) {}
950 LOKI_DEFINE_CLONE_FUNCTORIMPL(FunctorHandler)
953 #ifdef LOKI_FUNCTORS_ARE_COMPARABLE
956 bool operator==(const typename Base::FunctorImplBaseType &rhs) const
958 // there is no static information if Functor holds a member function
959 // or a free function; this is the main difference to tr1::function
960 if(typeid(*this) != typeid(rhs))
961 return false; // cannot be equal
963 const FunctorHandler &fh = static_cast<const FunctorHandler &>(rhs);
964 // if this line gives a compiler error, you are using a function object.
965 // you need to implement bool MyFnObj::operator == (const MyFnObj&) const;
969 // operator() implementations for up to 15 arguments
971 ResultType operator()()
976 ResultType operator()(Parm1 p1)
981 ResultType operator()(Parm1 p1, Parm2 p2)
986 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3)
988 return f_(p1, p2, p3);
991 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4)
993 return f_(p1, p2, p3, p4);
996 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5)
998 return f_(p1, p2, p3, p4, p5);
1001 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1004 return f_(p1, p2, p3, p4, p5, p6);
1007 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1010 return f_(p1, p2, p3, p4, p5, p6, p7);
1013 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1014 Parm6 p6, Parm7 p7, Parm8 p8)
1016 return f_(p1, p2, p3, p4, p5, p6, p7, p8);
1019 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1020 Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9)
1022 return f_(p1, p2, p3, p4, p5, p6, p7, p8, p9);
1025 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1026 Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10)
1028 return f_(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);
1031 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1032 Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10, Parm11 p11)
1034 return f_(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11);
1037 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1038 Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10, Parm11 p11,
1041 return f_(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12);
1044 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1045 Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10, Parm11 p11,
1046 Parm12 p12, Parm13 p13)
1048 return f_(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13);
1051 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1052 Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10, Parm11 p11,
1053 Parm12 p12, Parm13 p13, Parm14 p14)
1055 return f_(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13,
1059 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1060 Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10, Parm11 p11,
1061 Parm12 p12, Parm13 p13, Parm14 p14, Parm15 p15)
1063 return f_(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13,
1071 ////////////////////////////////////////////////////////////////////////////////
1072 // class template FunctorHandler
1073 // Wraps pointers to member functions
1074 ////////////////////////////////////////////////////////////////////////////////
1076 template <class ParentFunctor, typename PointerToObj,
1077 typename PointerToMemFn>
1078 class MemFunHandler : public ParentFunctor::Impl
1080 typedef typename ParentFunctor::Impl Base;
1083 typedef typename Base::ResultType ResultType;
1084 typedef typename Base::Parm1 Parm1;
1085 typedef typename Base::Parm2 Parm2;
1086 typedef typename Base::Parm3 Parm3;
1087 typedef typename Base::Parm4 Parm4;
1088 typedef typename Base::Parm5 Parm5;
1089 typedef typename Base::Parm6 Parm6;
1090 typedef typename Base::Parm7 Parm7;
1091 typedef typename Base::Parm8 Parm8;
1092 typedef typename Base::Parm9 Parm9;
1093 typedef typename Base::Parm10 Parm10;
1094 typedef typename Base::Parm11 Parm11;
1095 typedef typename Base::Parm12 Parm12;
1096 typedef typename Base::Parm13 Parm13;
1097 typedef typename Base::Parm14 Parm14;
1098 typedef typename Base::Parm15 Parm15;
1100 MemFunHandler(const PointerToObj &pObj, PointerToMemFn pMemFn)
1101 : pObj_(pObj), pMemFn_(pMemFn)
1104 LOKI_DEFINE_CLONE_FUNCTORIMPL(MemFunHandler)
1107 #ifdef LOKI_FUNCTORS_ARE_COMPARABLE
1109 bool operator==(const typename Base::FunctorImplBaseType &rhs) const
1111 if(typeid(*this) != typeid(rhs))
1112 return false; // cannot be equal
1114 const MemFunHandler &mfh = static_cast<const MemFunHandler &>(rhs);
1115 // if this line gives a compiler error, you are using a function object.
1116 // you need to implement bool MyFnObj::operator == (const MyFnObj&) const;
1117 return pObj_==mfh.pObj_ && pMemFn_==mfh.pMemFn_;
1121 ResultType operator()()
1123 return ((*pObj_).*pMemFn_)();
1126 ResultType operator()(Parm1 p1)
1128 return ((*pObj_).*pMemFn_)(p1);
1131 ResultType operator()(Parm1 p1, Parm2 p2)
1133 return ((*pObj_).*pMemFn_)(p1, p2);
1136 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3)
1138 return ((*pObj_).*pMemFn_)(p1, p2, p3);
1141 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4)
1143 return ((*pObj_).*pMemFn_)(p1, p2, p3, p4);
1146 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5)
1148 return ((*pObj_).*pMemFn_)(p1, p2, p3, p4, p5);
1151 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1154 return ((*pObj_).*pMemFn_)(p1, p2, p3, p4, p5, p6);
1157 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1160 return ((*pObj_).*pMemFn_)(p1, p2, p3, p4, p5, p6, p7);
1163 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1164 Parm6 p6, Parm7 p7, Parm8 p8)
1166 return ((*pObj_).*pMemFn_)(p1, p2, p3, p4, p5, p6, p7, p8);
1169 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1170 Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9)
1172 return ((*pObj_).*pMemFn_)(p1, p2, p3, p4, p5, p6, p7, p8, p9);
1175 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1176 Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10)
1178 return ((*pObj_).*pMemFn_)(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);
1181 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1182 Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10, Parm11 p11)
1184 return ((*pObj_).*pMemFn_)(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10,
1188 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1189 Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10, Parm11 p11,
1192 return ((*pObj_).*pMemFn_)(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10,
1196 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1197 Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10, Parm11 p11,
1198 Parm12 p12, Parm13 p13)
1200 return ((*pObj_).*pMemFn_)(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10,
1204 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1205 Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10, Parm11 p11,
1206 Parm12 p12, Parm13 p13, Parm14 p14)
1208 return ((*pObj_).*pMemFn_)(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10,
1209 p11, p12, p13, p14);
1212 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1213 Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10, Parm11 p11,
1214 Parm12 p12, Parm13 p13, Parm14 p14, Parm15 p15)
1216 return ((*pObj_).*pMemFn_)(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10,
1217 p11, p12, p13, p14, p15);
1222 PointerToMemFn pMemFn_;
1225 ////////////////////////////////////////////////////////////////////////////////
1227 //////////////////////////////////////////////////////////////////////////////////
1229 #ifdef LOKI_ENABLE_FUNCTION
1231 class bad_function_call : public std::runtime_error
1234 bad_function_call() : std::runtime_error("bad_function_call in Loki::Functor")
1238 #define LOKI_FUNCTION_THROW_BAD_FUNCTION_CALL if(empty()) throw bad_function_call();
1242 #define LOKI_FUNCTION_THROW_BAD_FUNCTION_CALL
1246 ////////////////////////////////////////////////////////////////////////////////
1249 /// \ingroup FunctorGroup
1250 /// A generalized functor implementation with value semantics
1252 /// \par Macro: LOKI_FUNCTOR_IS_NOT_A_SMALLOBJECT
1254 /// \code LOKI_FUNCTOR_IS_NOT_A_SMALLOBJECT \endcode
1255 /// to avoid static instantiation/delete
1257 /// It often helps against crashes when using static Functors and multi threading.
1258 /// Defining also removes problems when unloading Dlls which hosts
1259 /// static Functor objects.
1261 /// \par Macro: LOKI_FUNCTORS_ARE_COMPARABLE
1262 /// To enable the operator== define the macro
1263 /// \code LOKI_FUNCTORS_ARE_COMPARABLE \endcode
1264 /// The macro is disabled by default, because it breaks compiling functor
1265 /// objects which have no operator== implemented, keep in mind when you enable
1267 ////////////////////////////////////////////////////////////////////////////////
1268 template <typename R = void, class TList = NullType,
1269 template<class, class> class ThreadingModel = LOKI_DEFAULT_THREADING_NO_OBJ_LEVEL>
1273 // Handy type definitions for the body type
1274 typedef FunctorImpl<R, TList, ThreadingModel> Impl;
1275 typedef R ResultType;
1276 typedef TList ParmList;
1277 typedef typename Impl::Parm1 Parm1;
1278 typedef typename Impl::Parm2 Parm2;
1279 typedef typename Impl::Parm3 Parm3;
1280 typedef typename Impl::Parm4 Parm4;
1281 typedef typename Impl::Parm5 Parm5;
1282 typedef typename Impl::Parm6 Parm6;
1283 typedef typename Impl::Parm7 Parm7;
1284 typedef typename Impl::Parm8 Parm8;
1285 typedef typename Impl::Parm9 Parm9;
1286 typedef typename Impl::Parm10 Parm10;
1287 typedef typename Impl::Parm11 Parm11;
1288 typedef typename Impl::Parm12 Parm12;
1289 typedef typename Impl::Parm13 Parm13;
1290 typedef typename Impl::Parm14 Parm14;
1291 typedef typename Impl::Parm15 Parm15;
1295 Functor() : spImpl_(0)
1298 Functor(const Functor &rhs) : spImpl_(Impl::Clone(rhs.spImpl_.get()))
1301 Functor(std::auto_ptr<Impl> spImpl) : spImpl_(spImpl)
1304 template <typename Fun>
1306 : spImpl_(new FunctorHandler<Functor, Fun>(fun))
1309 template <class PtrObj, typename MemFn>
1310 Functor(const PtrObj &p, MemFn memFn)
1311 : spImpl_(new MemFunHandler<Functor, PtrObj, MemFn>(p, memFn))
1314 typedef Impl *(std::auto_ptr<Impl>::*unspecified_bool_type)() const;
1316 operator unspecified_bool_type() const
1318 return spImpl_.get() ? &std::auto_ptr<Impl>::get : 0;
1321 Functor &operator=(const Functor &rhs)
1324 // swap auto_ptrs by hand
1325 Impl *p = spImpl_.release();
1326 spImpl_.reset(copy.spImpl_.release());
1327 copy.spImpl_.reset(p);
1331 #ifdef LOKI_ENABLE_FUNCTION
1335 return spImpl_.get() == 0;
1344 #ifdef LOKI_FUNCTORS_ARE_COMPARABLE
1346 bool operator==(const Functor &rhs) const
1348 if(spImpl_.get()==0 && rhs.spImpl_.get()==0)
1350 if(spImpl_.get()!=0 && rhs.spImpl_.get()!=0)
1351 return *spImpl_.get() == *rhs.spImpl_.get();
1356 bool operator!=(const Functor &rhs) const
1358 return !(*this==rhs);
1362 // operator() implementations for up to 15 arguments
1364 ResultType operator()() const
1366 LOKI_FUNCTION_THROW_BAD_FUNCTION_CALL
1367 return (*spImpl_)();
1370 ResultType operator()(Parm1 p1) const
1372 LOKI_FUNCTION_THROW_BAD_FUNCTION_CALL
1373 return (*spImpl_)(p1);
1376 ResultType operator()(Parm1 p1, Parm2 p2) const
1378 LOKI_FUNCTION_THROW_BAD_FUNCTION_CALL
1379 return (*spImpl_)(p1, p2);
1382 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3) const
1384 LOKI_FUNCTION_THROW_BAD_FUNCTION_CALL
1385 return (*spImpl_)(p1, p2, p3);
1388 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4) const
1390 LOKI_FUNCTION_THROW_BAD_FUNCTION_CALL
1391 return (*spImpl_)(p1, p2, p3, p4);
1394 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5) const
1396 LOKI_FUNCTION_THROW_BAD_FUNCTION_CALL
1397 return (*spImpl_)(p1, p2, p3, p4, p5);
1400 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1403 LOKI_FUNCTION_THROW_BAD_FUNCTION_CALL
1404 return (*spImpl_)(p1, p2, p3, p4, p5, p6);
1407 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1408 Parm6 p6, Parm7 p7) const
1410 LOKI_FUNCTION_THROW_BAD_FUNCTION_CALL
1411 return (*spImpl_)(p1, p2, p3, p4, p5, p6, p7);
1414 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1415 Parm6 p6, Parm7 p7, Parm8 p8) const
1417 LOKI_FUNCTION_THROW_BAD_FUNCTION_CALL
1418 return (*spImpl_)(p1, p2, p3, p4, p5, p6, p7, p8);
1421 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1422 Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9) const
1424 LOKI_FUNCTION_THROW_BAD_FUNCTION_CALL
1425 return (*spImpl_)(p1, p2, p3, p4, p5, p6, p7, p8, p9);
1428 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1429 Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10) const
1431 LOKI_FUNCTION_THROW_BAD_FUNCTION_CALL
1432 return (*spImpl_)(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);
1435 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1436 Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10, Parm11 p11) const
1438 LOKI_FUNCTION_THROW_BAD_FUNCTION_CALL
1439 return (*spImpl_)(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11);
1442 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1443 Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10, Parm11 p11,
1446 LOKI_FUNCTION_THROW_BAD_FUNCTION_CALL
1447 return (*spImpl_)(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11,
1451 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1452 Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10, Parm11 p11,
1453 Parm12 p12, Parm13 p13) const
1455 LOKI_FUNCTION_THROW_BAD_FUNCTION_CALL
1456 return (*spImpl_)(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11,
1460 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1461 Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10, Parm11 p11,
1462 Parm12 p12, Parm13 p13, Parm14 p14) const
1464 LOKI_FUNCTION_THROW_BAD_FUNCTION_CALL
1465 return (*spImpl_)(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11,
1469 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1470 Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10, Parm11 p11,
1471 Parm12 p12, Parm13 p13, Parm14 p14, Parm15 p15) const
1473 LOKI_FUNCTION_THROW_BAD_FUNCTION_CALL
1474 return (*spImpl_)(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11,
1475 p12, p13, p14, p15);
1479 std::auto_ptr<Impl> spImpl_;
1483 ////////////////////////////////////////////////////////////////////////////////
1485 // BindersFirst and Chainer
1487 ////////////////////////////////////////////////////////////////////////////////
1491 template <class Fctor> struct BinderFirstTraits;
1493 template <typename R, class TList, template <class, class> class ThreadingModel>
1494 struct BinderFirstTraits< Functor<R, TList, ThreadingModel> >
1496 typedef Functor<R, TList, ThreadingModel> OriginalFunctor;
1498 typedef typename TL::Erase<TList,typename TL::TypeAt<TList, 0>::Result>
1502 typedef typename TL::TypeAt<TList, 0>::Result OriginalParm1;
1504 typedef Functor<R, ParmList, ThreadingModel> BoundFunctorType;
1506 typedef typename BoundFunctorType::Impl Impl;
1512 struct BinderFirstBoundTypeStorage;
1515 struct BinderFirstBoundTypeStorage
1517 typedef typename TypeTraits<T>::ParameterType RefOrValue;
1520 template <typename R, class TList, template <class, class> class ThreadingModel>
1521 struct BinderFirstBoundTypeStorage< Functor<R, TList, ThreadingModel> >
1523 typedef Functor<R, TList, ThreadingModel> OriginalFunctor;
1524 typedef const typename TypeTraits<OriginalFunctor>::ReferredType RefOrValue;
1528 } // namespace Private
1530 ////////////////////////////////////////////////////////////////////////////////
1531 /// \class BinderFirst
1533 /// \ingroup FunctorGroup
1534 /// Binds the first parameter of a Functor object to a specific value
1535 ////////////////////////////////////////////////////////////////////////////////
1537 template <class OriginalFunctor>
1539 : public Private::BinderFirstTraits<OriginalFunctor>::Impl
1541 typedef typename Private::BinderFirstTraits<OriginalFunctor>::Impl Base;
1542 typedef typename OriginalFunctor::ResultType ResultType;
1544 typedef typename OriginalFunctor::Parm1 BoundType;
1546 typedef typename Private::BinderFirstBoundTypeStorage<
1547 typename Private::BinderFirstTraits<OriginalFunctor>
1552 typedef typename OriginalFunctor::Parm2 Parm1;
1553 typedef typename OriginalFunctor::Parm3 Parm2;
1554 typedef typename OriginalFunctor::Parm4 Parm3;
1555 typedef typename OriginalFunctor::Parm5 Parm4;
1556 typedef typename OriginalFunctor::Parm6 Parm5;
1557 typedef typename OriginalFunctor::Parm7 Parm6;
1558 typedef typename OriginalFunctor::Parm8 Parm7;
1559 typedef typename OriginalFunctor::Parm9 Parm8;
1560 typedef typename OriginalFunctor::Parm10 Parm9;
1561 typedef typename OriginalFunctor::Parm11 Parm10;
1562 typedef typename OriginalFunctor::Parm12 Parm11;
1563 typedef typename OriginalFunctor::Parm13 Parm12;
1564 typedef typename OriginalFunctor::Parm14 Parm13;
1565 typedef typename OriginalFunctor::Parm15 Parm14;
1566 typedef EmptyType Parm15;
1570 BinderFirst(const OriginalFunctor &fun, BoundType bound)
1571 : f_(fun), b_(bound)
1574 LOKI_DEFINE_CLONE_FUNCTORIMPL(BinderFirst)
1576 #ifdef LOKI_FUNCTORS_ARE_COMPARABLE
1578 bool operator==(const typename Base::FunctorImplBaseType &rhs) const
1580 if(typeid(*this) != typeid(rhs))
1581 return false; // cannot be equal
1582 // if this line gives a compiler error, you are using a function object.
1583 // you need to implement bool MyFnObj::operator == (const MyFnObj&) const;
1584 return f_ == ((static_cast<const BinderFirst &> (rhs)).f_) &&
1585 b_ == ((static_cast<const BinderFirst &> (rhs)).b_);
1589 // operator() implementations for up to 15 arguments
1591 ResultType operator()()
1596 ResultType operator()(Parm1 p1)
1601 ResultType operator()(Parm1 p1, Parm2 p2)
1603 return f_(b_, p1, p2);
1606 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3)
1608 return f_(b_, p1, p2, p3);
1611 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4)
1613 return f_(b_, p1, p2, p3, p4);
1616 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5)
1618 return f_(b_, p1, p2, p3, p4, p5);
1621 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1624 return f_(b_, p1, p2, p3, p4, p5, p6);
1627 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1630 return f_(b_, p1, p2, p3, p4, p5, p6, p7);
1633 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1634 Parm6 p6, Parm7 p7, Parm8 p8)
1636 return f_(b_, p1, p2, p3, p4, p5, p6, p7, p8);
1639 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1640 Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9)
1642 return f_(b_, p1, p2, p3, p4, p5, p6, p7, p8, p9);
1645 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1646 Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10)
1648 return f_(b_, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);
1651 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1652 Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10, Parm11 p11)
1654 return f_(b_, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11);
1657 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1658 Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10, Parm11 p11,
1661 return f_(b_, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12);
1664 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1665 Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10, Parm11 p11,
1666 Parm12 p12, Parm13 p13)
1668 return f_(b_, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13);
1671 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1672 Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10, Parm11 p11,
1673 Parm12 p12, Parm13 p13, Parm14 p14)
1675 return f_(b_, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13,
1681 BoundTypeStorage b_;
1684 ////////////////////////////////////////////////////////////////////////////////
1685 /// Binds the first parameter of a Functor object to a specific value
1686 /// \ingroup FunctorGroup
1687 ////////////////////////////////////////////////////////////////////////////////
1689 template <class Fctor>
1690 typename Private::BinderFirstTraits<Fctor>::BoundFunctorType
1693 typename Fctor::Parm1 bound)
1695 typedef typename Private::BinderFirstTraits<Fctor>::BoundFunctorType
1698 return Outgoing(std::auto_ptr<typename Outgoing::Impl>(
1699 new BinderFirst<Fctor>(fun, bound)));
1702 ////////////////////////////////////////////////////////////////////////////////
1705 /// \ingroup FunctorGroup
1706 /// Chains two functor calls one after another
1707 ////////////////////////////////////////////////////////////////////////////////
1709 template <typename Fun1, typename Fun2>
1710 class Chainer : public Fun2::Impl
1715 typedef typename Base::ResultType ResultType;
1716 typedef typename Base::Parm1 Parm1;
1717 typedef typename Base::Parm2 Parm2;
1718 typedef typename Base::Parm3 Parm3;
1719 typedef typename Base::Parm4 Parm4;
1720 typedef typename Base::Parm5 Parm5;
1721 typedef typename Base::Parm6 Parm6;
1722 typedef typename Base::Parm7 Parm7;
1723 typedef typename Base::Parm8 Parm8;
1724 typedef typename Base::Parm9 Parm9;
1725 typedef typename Base::Parm10 Parm10;
1726 typedef typename Base::Parm11 Parm11;
1727 typedef typename Base::Parm12 Parm12;
1728 typedef typename Base::Parm13 Parm13;
1729 typedef typename Base::Parm14 Parm14;
1730 typedef typename Base::Parm15 Parm15;
1732 Chainer(const Fun1 &fun1, const Fun2 &fun2) : f1_(fun1), f2_(fun2) {}
1734 LOKI_DEFINE_CLONE_FUNCTORIMPL(Chainer)
1736 #ifdef LOKI_FUNCTORS_ARE_COMPARABLE
1738 bool operator==(const typename Base::Impl::FunctorImplBaseType &rhs) const
1740 if(typeid(*this) != typeid(rhs))
1741 return false; // cannot be equal
1742 // if this line gives a compiler error, you are using a function object.
1743 // you need to implement bool MyFnObj::operator == (const MyFnObj&) const;
1744 return f1_ == ((static_cast<const Chainer &> (rhs)).f2_) &&
1745 f2_ == ((static_cast<const Chainer &> (rhs)).f1_);
1749 // operator() implementations for up to 15 arguments
1751 ResultType operator()()
1753 return f1_(), f2_();
1756 ResultType operator()(Parm1 p1)
1758 return f1_(p1), f2_(p1);
1761 ResultType operator()(Parm1 p1, Parm2 p2)
1763 return f1_(p1, p2), f2_(p1, p2);
1766 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3)
1768 return f1_(p1, p2, p3), f2_(p1, p2, p3);
1771 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4)
1773 return f1_(p1, p2, p3, p4), f2_(p1, p2, p3, p4);
1776 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5)
1778 return f1_(p1, p2, p3, p4, p5), f2_(p1, p2, p3, p4, p5);
1781 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1784 return f1_(p1, p2, p3, p4, p5, p6), f2_(p1, p2, p3, p4, p5, p6);
1787 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1790 return f1_(p1, p2, p3, p4, p5, p6, p7),
1791 f2_(p1, p2, p3, p4, p5, p6, p7);
1794 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1795 Parm6 p6, Parm7 p7, Parm8 p8)
1797 return f1_(p1, p2, p3, p4, p5, p6, p7, p8),
1798 f2_(p1, p2, p3, p4, p5, p6, p7, p8);
1801 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1802 Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9)
1804 return f1_(p1, p2, p3, p4, p5, p6, p7, p8, p9),
1805 f2_(p1, p2, p3, p4, p5, p6, p7, p8, p9);
1808 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1809 Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10)
1811 return f1_(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10),
1812 f2_(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);
1815 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1816 Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10, Parm11 p11)
1818 return f1_(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11),
1819 f2_(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11);
1822 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1823 Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10, Parm11 p11,
1826 return f1_(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12),
1827 f2_(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12);
1830 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1831 Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10, Parm11 p11,
1832 Parm12 p12, Parm13 p13)
1834 return f1_(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13),
1835 f2_(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13);
1838 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1839 Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10, Parm11 p11,
1840 Parm12 p12, Parm13 p13, Parm14 p14)
1842 return f1_(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13,
1844 f2_(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13,
1848 ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
1849 Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10, Parm11 p11,
1850 Parm12 p12, Parm13 p13, Parm14 p14, Parm15 p15)
1852 return f1_(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13,
1854 f2_(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13,
1863 ////////////////////////////////////////////////////////////////////////////////
1864 /// Chains two functor calls one after another
1865 /// \ingroup FunctorGroup
1866 ////////////////////////////////////////////////////////////////////////////////
1869 template <class Fun1, class Fun2>
1874 return Fun2(std::auto_ptr<typename Fun2::Impl>(
1875 new Chainer<Fun1, Fun2>(fun1, fun2)));
1881 #endif // end file guardian