sustaining_gazes/lib/local/CamCom/comet/functor.h

1342 lines
71 KiB
C++

/** \file
* Functor implementation.
*
* functor.h is based on the functor library presented in Chapter 5 of
* <a href=http://cseng.aw.com/book/0,3828,0201704315,00.html>"Modern C++ Design"</a> by Andrei Alexandrescu.
*
*/
/*
* Copyright © 2001 Sofus Mortensen, Michael Geddes
*
* This material is provided "as is", with absolutely no warranty
* expressed or implied. Any use is at your own risk. Permission to
* use or copy this software for any purpose is hereby granted without
* fee, provided the above notices are retained on all copies.
* Permission to modify the code and to distribute modified code is
* granted, provided the above notices are retained, and a notice that
* the code was modified is included with the above copyright notice.
*
* This header is part of Comet version 2.
* https://github.com/alamaison/comet
*/
#ifndef COMET_FUNCTOR_H
#define COMET_FUNCTOR_H
#include <comet/config.h>
#include <comet/typelist.h>
#include <comet/type_traits.h>
#include <memory>
namespace comet {
/*! \addtogroup Misc
*/
//@{
#ifdef COMET_PARTIAL_SPECIALISATION
namespace detail {
template<bool, typename T> struct parameter_type_aux
{
typedef const T& result;
};
template<typename T> struct parameter_type_aux<true,T>
{
typedef T result;
};
};
/** \struct parameter_type functor.h comet/functor.h
* Gives us a reference to a type. If the type is already a reference, then
* just returns the type.
*/
template<typename T> struct parameter_type
{
enum { is_ref = type_traits::is_reference<T>::value };
/// A reference to \p T or \p T if it is already a reference.
typedef typename detail::parameter_type_aux< (is_ref!=0) ,T >::result result;
};
#else // COMET_PARTIAL_SPECIALISATION
namespace detail {
template<bool> struct parameter_type_aux
{
template<typename T> struct X
{
typedef const T& result;
};
};
template<> struct parameter_type_aux<true>
{
template<typename T> struct X
{
typedef T result;
};
};
};
template<typename T> struct parameter_type
{
enum { is_ref = type_traits::is_reference<T>::value };
typedef detail::parameter_type_aux< (is_ref!=0) >::X<T>::result result;
};
#endif // COMET_PARTIAL_SPECIALISATION
#ifndef COMET_PARTIAL_SPECIALISATION
#define COMET_PARTIAL_NAME( name ) X
#define COMET_PARTIAL_NS_1(A) >::X<A>
#define COMET_PARTIAL_NS_2(A,B) >::X<A,B>
#define COMET_PARTIAL_NS_3(A,B,C) >::X<A,B,C>
#define COMET_DEFINE_PARTIAL( X1, X2 , name) \
template < X1 > struct name\
{ \
template < X2 > class X
#define COMET_SPECIALISE_PARTIAL( SX1, X2 , name) \
template <> struct name<SX1>\
{ \
template < X2 > class X
#define COMET_DEFINE_PARTIAL2( X1, X2, X3 , name) \
template < X1 > struct name\
{ \
template < X2, X3 > class X
#define COMET_SPECIALISE_PARTIAL2( SX1, X2, X3 , name) \
template <> struct name<SX1>\
{ \
template < X2, X3 > class X
#define COMET_DEFINE_PARTIAL3( X1, X2, X3, X4 , name) \
template < X1 > struct name\
{ \
template < X2, X3, X4 > class X
#define COMET_SPECIALISE_PARTIAL3( SX1, X2, X3, X4 , name) \
template <> struct name<SX1>\
{ \
template < X2, X3, X4 > class X
#define COMET_CLOSE_PARTIAL() };
#else
#define COMET_PARTIAL_NAME( name ) name
#define COMET_PARTIAL_NS_1(A) ,A>
#define COMET_PARTIAL_NS_2(A,B) ,A,B>
#define COMET_PARTIAL_NS_3(A,B,C) ,A,B,C>
#define COMET_CLOSE_PARTIAL()
#define COMET_PARTIAL_CONSTRUCTOR( name ) name
#define COMET_DEFINE_PARTIAL(TN1, X1, TN2, X2 , name) \
template <TN1 X1, TN2 X2 > class name
#define COMET_SPECIALISE_PARTIAL( SX1, TN2,X2 , name) \
template < TN2 X2 > class name<SX1,X2>
#define COMET_DEFINE_PARTIAL2( TN1,X1,TN2,X2,TN3,X3 , name) \
template <TN1 X1, TN2 X2, TN3 X3 > class name
#define COMET_SPECIALISE_PARTIAL2( SX1, TN2,X2, TN3,X3 , name) \
template < TN2 X2, TN3 X3 > class name<SX1,X2,X3>
#define COMET_DEFINE_PARTIAL3(TN1,X1, TN2,X2, TN3,X3, TN4,X4 , name) \
template < TN1 X1, TN2 X2, TN3 X3,TN4 X4 > class name
#define COMET_SPECIALISE_PARTIAL3( SX1, TN2,X2, TN3,X3, TN4,X4 , name) \
template < TN2 X2, TN3 X3, TN4 X4 > class name<SX1,X2,X3,X4>
#endif
/** \struct parameter_types functor.h comet/functor.h
* Gives the parameter type of parameters 1 thru 16.
* This gaurantees the arguments pass by reference, without breaking if it is already a
* reference.
* \sa parameter_type
*/
template<typename LIST> struct parameter_types
{
typedef typename parameter_type< typename typelist::type_at<LIST, 0>::result >::result PARM_1;
typedef typename parameter_type< typename typelist::type_at<LIST, 1>::result >::result PARM_2;
typedef typename parameter_type< typename typelist::type_at<LIST, 2>::result >::result PARM_3;
typedef typename parameter_type< typename typelist::type_at<LIST, 3>::result >::result PARM_4;
typedef typename parameter_type< typename typelist::type_at<LIST, 4>::result >::result PARM_5;
typedef typename parameter_type< typename typelist::type_at<LIST, 5>::result >::result PARM_6;
typedef typename parameter_type< typename typelist::type_at<LIST, 6>::result >::result PARM_7;
typedef typename parameter_type< typename typelist::type_at<LIST, 7>::result >::result PARM_8;
typedef typename parameter_type< typename typelist::type_at<LIST, 8>::result >::result PARM_9;
typedef typename parameter_type< typename typelist::type_at<LIST, 9>::result >::result PARM_10;
typedef typename parameter_type< typename typelist::type_at<LIST, 10>::result >::result PARM_11;
typedef typename parameter_type< typename typelist::type_at<LIST, 11>::result >::result PARM_12;
typedef typename parameter_type< typename typelist::type_at<LIST, 12>::result >::result PARM_13;
typedef typename parameter_type< typename typelist::type_at<LIST, 13>::result >::result PARM_14;
typedef typename parameter_type< typename typelist::type_at<LIST, 14>::result >::result PARM_15;
typedef typename parameter_type< typename typelist::type_at<LIST, 15>::result >::result PARM_16;
};
template<typename R, typename LIST> class functor_impl;
/** \struct functor_impl_aux functor.h comet/functor.h
* Virtual interface for functor implementation.
* Provide partial specialisation of functor_impl to parameter type.
* \param L number of arguments.
* \param R Return type.
* \param LIST Argument list.
*/
COMET_DEFINE_PARTIAL2( int,L,typename,R,typename,LIST,functor_impl_aux) : public parameter_types<LIST>
{
/** Virtual override to call the function.
* \param arguments Whatever arguments provided by \a LIST
* \return Return type is \a R
*/
virtual R operator()( nil arguments ) = 0;
/** Clone the functor. (easiest way of managing memory - should only be
* a light implementation anyway).
*/
virtual functor_impl<R, LIST>* clone() const = 0;
/** Provide virtual destruction.
*/
virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {}
};
COMET_CLOSE_PARTIAL()
COMET_SPECIALISE_PARTIAL2( 0, typename,R, typename,LIST, functor_impl_aux) : public parameter_types<LIST>
{
public:
virtual R operator()( ) = 0;
virtual functor_impl<R, LIST>* clone() const = 0;
virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {}
};
COMET_CLOSE_PARTIAL()
COMET_SPECIALISE_PARTIAL2(1, typename,R, typename,LIST, functor_impl_aux) : public parameter_types<LIST>
{
public:
virtual R operator()( PARM_1 ) = 0;
virtual functor_impl<R, LIST>* clone() const = 0;
virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {}
};
COMET_CLOSE_PARTIAL()
COMET_SPECIALISE_PARTIAL2(2, typename,R, typename,LIST, functor_impl_aux) : public parameter_types<LIST>
{
public:
virtual R operator()( PARM_1, PARM_2 ) = 0;
virtual functor_impl<R, LIST>* clone() const = 0;
virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {}
};
COMET_CLOSE_PARTIAL()
COMET_SPECIALISE_PARTIAL2(3, typename,R, typename,LIST, functor_impl_aux) : public parameter_types<LIST>
{
public:
virtual R operator()( PARM_1, PARM_2, PARM_3 ) = 0;
virtual functor_impl<R, LIST>* clone() const = 0;
virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {}
};
COMET_CLOSE_PARTIAL()
COMET_SPECIALISE_PARTIAL2(4, typename,R, typename,LIST,functor_impl_aux) : public parameter_types<LIST>
{
public:
virtual R operator()( PARM_1, PARM_2, PARM_3, PARM_4 ) = 0;
virtual functor_impl<R, LIST>* clone() const = 0;
virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {}
};
COMET_CLOSE_PARTIAL()
COMET_SPECIALISE_PARTIAL2(5,typename,R, typename,LIST,functor_impl_aux) : public parameter_types<LIST>
{
public:
virtual R operator()( PARM_1, PARM_2, PARM_3, PARM_4, PARM_5 ) = 0;
virtual functor_impl<R, LIST>* clone() const = 0;
virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {}
};
COMET_CLOSE_PARTIAL()
COMET_SPECIALISE_PARTIAL2(6, typename,R, typename,LIST, functor_impl_aux) : public parameter_types<LIST>
{
public:
virtual R operator()( PARM_1, PARM_2, PARM_3, PARM_4, PARM_5, PARM_6 ) = 0;
virtual functor_impl<R, LIST>* clone() const = 0;
virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {}
};
COMET_CLOSE_PARTIAL()
COMET_SPECIALISE_PARTIAL2(7, typename,R, typename,LIST, functor_impl_aux) : public parameter_types<LIST>
{
public:
virtual R operator()( PARM_1, PARM_2, PARM_3, PARM_4, PARM_5, PARM_6, PARM_7 ) = 0;
virtual functor_impl<R, LIST>* clone() const = 0;
virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {}
};
COMET_CLOSE_PARTIAL()
COMET_SPECIALISE_PARTIAL2(8, typename,R, typename,LIST, functor_impl_aux) : public parameter_types<LIST>
{
public:
virtual R operator()( PARM_1, PARM_2, PARM_3, PARM_4, PARM_5, PARM_6, PARM_7, PARM_8 ) = 0;
virtual functor_impl<R, LIST>* clone() const = 0;
virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {}
};
COMET_CLOSE_PARTIAL()
COMET_SPECIALISE_PARTIAL2(9, typename,R, typename,LIST, functor_impl_aux) : public parameter_types<LIST>
{
public:
virtual R operator()( PARM_1, PARM_2, PARM_3, PARM_4, PARM_5, PARM_6, PARM_7, PARM_8, PARM_9 ) = 0;
virtual functor_impl<R, LIST>* clone() const = 0;
virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {}
};
COMET_CLOSE_PARTIAL()
COMET_SPECIALISE_PARTIAL2(10, typename,R, typename,LIST, functor_impl_aux) : public parameter_types<LIST>
{
public:
virtual R operator()( PARM_1, PARM_2, PARM_3, PARM_4, PARM_5, PARM_6, PARM_7, PARM_8, PARM_9, PARM_10 ) = 0;
virtual functor_impl<R, LIST>* clone() const = 0;
virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {}
};
COMET_CLOSE_PARTIAL()
COMET_SPECIALISE_PARTIAL2(11, typename,R, typename,LIST, functor_impl_aux) : public parameter_types<LIST>
{
public:
virtual R operator()( PARM_1, PARM_2, PARM_3, PARM_4, PARM_5, PARM_6, PARM_7, PARM_8, PARM_9, PARM_10, PARM_11 ) = 0;
virtual functor_impl<R, LIST>* clone() const = 0;
virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {}
};
COMET_CLOSE_PARTIAL()
COMET_SPECIALISE_PARTIAL2(12, typename,R, typename,LIST, functor_impl_aux) : public parameter_types<LIST>
{
public:
virtual R operator()( PARM_1, PARM_2, PARM_3, PARM_4, PARM_5, PARM_6, PARM_7, PARM_8, PARM_9, PARM_10, PARM_11, PARM_12 ) = 0;
virtual functor_impl<R, LIST>* clone() const = 0;
virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {}
};
COMET_CLOSE_PARTIAL()
COMET_SPECIALISE_PARTIAL2(13, typename,R, typename,LIST, functor_impl_aux) : public parameter_types<LIST>
{
public:
virtual R operator()( PARM_1, PARM_2, PARM_3, PARM_4, PARM_5, PARM_6, PARM_7, PARM_8, PARM_9, PARM_10, PARM_11, PARM_12, PARM_13 ) = 0;
virtual functor_impl<R, LIST>* clone() const = 0;
virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {}
};
COMET_CLOSE_PARTIAL()
COMET_SPECIALISE_PARTIAL2(14, typename,R, typename,LIST, functor_impl_aux) : public parameter_types<LIST>
{
public:
virtual R operator()( PARM_1, PARM_2, PARM_3, PARM_4, PARM_5, PARM_6, PARM_7, PARM_8, PARM_9, PARM_10, PARM_11, PARM_12, PARM_13, PARM_14 ) = 0;
virtual functor_impl<R, LIST>* clone() const = 0;
virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {}
};
COMET_CLOSE_PARTIAL()
COMET_SPECIALISE_PARTIAL2(15, typename,R, typename,LIST, functor_impl_aux) : public parameter_types<LIST>
{
public:
virtual R operator()( PARM_1, PARM_2, PARM_3, PARM_4, PARM_5, PARM_6, PARM_7, PARM_8, PARM_9, PARM_10, PARM_11, PARM_12, PARM_13, PARM_14, PARM_15 ) = 0;
virtual functor_impl<R, LIST>* clone() const = 0;
virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {}
};
COMET_CLOSE_PARTIAL()
COMET_SPECIALISE_PARTIAL2(16, typename,R, typename,LIST, functor_impl_aux) : public parameter_types<LIST>
{
public:
virtual R operator()( PARM_1, PARM_2, PARM_3, PARM_4, PARM_5, PARM_6, PARM_7, PARM_8, PARM_9, PARM_10, PARM_11, PARM_12, PARM_13, PARM_14, PARM_15, PARM_16 ) = 0;
virtual functor_impl<R, LIST>* clone() const = 0;
virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {}
};
COMET_CLOSE_PARTIAL()
/** \struct functor_handler functor.h comet/functor.h
* Provide implementation of functor_impl virtual type for functions.
* The implementation is effectively 'partially specialised' to return type.
*/
COMET_DEFINE_PARTIAL2(typename,RT, typename,PF, typename,FUN, functor_handler)
: public functor_impl< typename PF::result_type, typename PF::parm_list >
{
public:
typedef typename PF::result_type result_type;
COMET_PARTIAL_NAME(functor_handler)(const FUN& fun) : fun_(fun) {}
functor_impl< typename PF::result_type, typename PF::parm_list >* clone() const
{ return new COMET_PARTIAL_NAME(functor_handler)(*this); }
result_type operator()( )
{ return fun_( ); }
result_type operator()( typename PF::PARM_1 p1 )
{ return fun_( p1 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2 )
{ return fun_( p1, p2 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3 )
{ return fun_( p1, p2, p3 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4 )
{ return fun_( p1, p2, p3, p4 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5 )
{ return fun_( p1, p2, p3, p4, p5 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6 )
{ return fun_( p1, p2, p3, p4, p5, p6 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7 )
{ return fun_( p1, p2, p3, p4, p5, p6, p7 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8 )
{ return fun_( p1, p2, p3, p4, p5, p6, p7, p8 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8, typename PF::PARM_9 p9 )
{ return fun_( p1, p2, p3, p4, p5, p6, p7, p8, p9 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8, typename PF::PARM_9 p9, typename PF::PARM_10 p10 )
{ return fun_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8, typename PF::PARM_9 p9, typename PF::PARM_10 p10, typename PF::PARM_11 p11 )
{ return fun_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8, typename PF::PARM_9 p9, typename PF::PARM_10 p10, typename PF::PARM_11 p11, typename PF::PARM_12 p12 )
{ return fun_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8, typename PF::PARM_9 p9, typename PF::PARM_10 p10, typename PF::PARM_11 p11, typename PF::PARM_12 p12, typename PF::PARM_13 p13 )
{ return fun_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8, typename PF::PARM_9 p9, typename PF::PARM_10 p10, typename PF::PARM_11 p11, typename PF::PARM_12 p12, typename PF::PARM_13 p13, typename PF::PARM_14 p14 )
{ return fun_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8, typename PF::PARM_9 p9, typename PF::PARM_10 p10, typename PF::PARM_11 p11, typename PF::PARM_12 p12, typename PF::PARM_13 p13, typename PF::PARM_14 p14, typename PF::PARM_15 p15 )
{ return fun_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8, typename PF::PARM_9 p9, typename PF::PARM_10 p10, typename PF::PARM_11 p11, typename PF::PARM_12 p12, typename PF::PARM_13 p13, typename PF::PARM_14 p14, typename PF::PARM_15 p15, typename PF::PARM_16 p16 )
{ return fun_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16 ); }
private:
FUN fun_;
};
COMET_CLOSE_PARTIAL()
COMET_SPECIALISE_PARTIAL2( void, typename,PF, typename,FUN , functor_handler)
: public functor_impl< typename PF::result_type, typename PF::parm_list >
{
public:
typedef typename PF::result_type result_type;
COMET_PARTIAL_NAME(functor_handler)(const FUN& fun) : fun_(fun) {}
functor_impl< typename PF::result_type, typename PF::parm_list >* clone() const
{ return new COMET_PARTIAL_NAME(functor_handler)(*this); }
result_type operator()( )
{ fun_( ); }
result_type operator()( typename PF::PARM_1 p1 )
{ fun_( p1 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2 )
{ fun_( p1, p2 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3 )
{ fun_( p1, p2, p3 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4 )
{ fun_( p1, p2, p3, p4 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5 )
{ fun_( p1, p2, p3, p4, p5 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6 )
{ fun_( p1, p2, p3, p4, p5, p6 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7 )
{ fun_( p1, p2, p3, p4, p5, p6, p7 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8 )
{ fun_( p1, p2, p3, p4, p5, p6, p7, p8 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8, typename PF::PARM_9 p9 )
{ fun_( p1, p2, p3, p4, p5, p6, p7, p8, p9 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8, typename PF::PARM_9 p9, typename PF::PARM_10 p10 )
{ fun_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8, typename PF::PARM_9 p9, typename PF::PARM_10 p10, typename PF::PARM_11 p11 )
{ fun_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8, typename PF::PARM_9 p9, typename PF::PARM_10 p10, typename PF::PARM_11 p11, typename PF::PARM_12 p12 )
{ fun_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8, typename PF::PARM_9 p9, typename PF::PARM_10 p10, typename PF::PARM_11 p11, typename PF::PARM_12 p12, typename PF::PARM_13 p13 )
{ fun_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8, typename PF::PARM_9 p9, typename PF::PARM_10 p10, typename PF::PARM_11 p11, typename PF::PARM_12 p12, typename PF::PARM_13 p13, typename PF::PARM_14 p14 )
{ fun_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8, typename PF::PARM_9 p9, typename PF::PARM_10 p10, typename PF::PARM_11 p11, typename PF::PARM_12 p12, typename PF::PARM_13 p13, typename PF::PARM_14 p14, typename PF::PARM_15 p15 )
{ fun_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8, typename PF::PARM_9 p9, typename PF::PARM_10 p10, typename PF::PARM_11 p11, typename PF::PARM_12 p12, typename PF::PARM_13 p13, typename PF::PARM_14 p14, typename PF::PARM_15 p15, typename PF::PARM_16 p16 )
{ fun_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16 ); }
private:
FUN fun_;
};
COMET_CLOSE_PARTIAL()
/** \struct memfun_handler functor.h comet/functor.h
* Provide implementation of functor_impl virtual type for calling a member on
* an object.
* The implementation is effectively 'partially specialised' to return type.
* \param RT Return type
* \param PF Parameter types
* \param OBJ_PTR Object pointer type
* \param MEMFN_PTR Function pointer type
*/
COMET_DEFINE_PARTIAL3(typename,RT,typename,PF, typename,OBJ_PTR, typename,MEMFN_PTR , memfun_handler)
: public functor_impl<typename PF::result_type,typename PF::parm_list >
{
private:
OBJ_PTR obj_;
MEMFN_PTR memfn_;
public:
typedef typename PF::result_type result_type;
COMET_PARTIAL_NAME(memfun_handler)(const OBJ_PTR& obj, MEMFN_PTR memfn) : obj_(obj), memfn_(memfn) {}
functor_impl<typename PF::result_type,typename PF::parm_list >* clone() const
{ return new COMET_PARTIAL_NAME(memfun_handler)(*this); }
result_type operator()( )
{ return ((*obj_).*memfn_)( ); }
result_type operator()( typename PF::PARM_1 p1 )
{ return ((*obj_).*memfn_)( p1 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2 )
{ return ((*obj_).*memfn_)( p1, p2 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3 )
{ return ((*obj_).*memfn_)( p1, p2, p3 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4 )
{ return ((*obj_).*memfn_)( p1, p2, p3, p4 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5 )
{ return ((*obj_).*memfn_)( p1, p2, p3, p4, p5 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6 )
{ return ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7 )
{ return ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8 )
{ return ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8, typename PF::PARM_9 p9 )
{ return ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8, p9 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8, typename PF::PARM_9 p9, typename PF::PARM_10 p10 )
{ return ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8, typename PF::PARM_9 p9, typename PF::PARM_10 p10, typename PF::PARM_11 p11 )
{ return ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8, typename PF::PARM_9 p9, typename PF::PARM_10 p10, typename PF::PARM_11 p11, typename PF::PARM_12 p12 )
{ return ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8, typename PF::PARM_9 p9, typename PF::PARM_10 p10, typename PF::PARM_11 p11, typename PF::PARM_12 p12, typename PF::PARM_13 p13 )
{ return ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8, typename PF::PARM_9 p9, typename PF::PARM_10 p10, typename PF::PARM_11 p11, typename PF::PARM_12 p12, typename PF::PARM_13 p13, typename PF::PARM_14 p14 )
{ return ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8, typename PF::PARM_9 p9, typename PF::PARM_10 p10, typename PF::PARM_11 p11, typename PF::PARM_12 p12, typename PF::PARM_13 p13, typename PF::PARM_14 p14, typename PF::PARM_15 p15 )
{ return ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8, typename PF::PARM_9 p9, typename PF::PARM_10 p10, typename PF::PARM_11 p11, typename PF::PARM_12 p12, typename PF::PARM_13 p13, typename PF::PARM_14 p14, typename PF::PARM_15 p15, typename PF::PARM_16 p16 )
{ return ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16 ); }
};
COMET_CLOSE_PARTIAL()
COMET_SPECIALISE_PARTIAL3( void, typename,PF, typename,OBJ_PTR, typename,MEMFN_PTR , memfun_handler)
: public functor_impl<typename PF::result_type,typename PF::parm_list >
{
public:
typedef typename PF::result_type result_type;
COMET_PARTIAL_NAME(memfun_handler)(const OBJ_PTR& obj, MEMFN_PTR memfn) : obj_(obj), memfn_(memfn) {}
functor_impl<typename PF::result_type,typename PF::parm_list >* clone() const
{ return new COMET_PARTIAL_NAME(memfun_handler)(*this); }
result_type operator()( )
{ ((*obj_).*memfn_)( ); }
result_type operator()( typename PF::PARM_1 p1 )
{ ((*obj_).*memfn_)( p1 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2 )
{ ((*obj_).*memfn_)( p1, p2 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3 )
{ ((*obj_).*memfn_)( p1, p2, p3 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4 )
{ ((*obj_).*memfn_)( p1, p2, p3, p4 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5 )
{ ((*obj_).*memfn_)( p1, p2, p3, p4, p5 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6 )
{ ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7 )
{ ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8 )
{ ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8, typename PF::PARM_9 p9 )
{ ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8, p9 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8, typename PF::PARM_9 p9, typename PF::PARM_10 p10 )
{ ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8, typename PF::PARM_9 p9, typename PF::PARM_10 p10, typename PF::PARM_11 p11 )
{ ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8, typename PF::PARM_9 p9, typename PF::PARM_10 p10, typename PF::PARM_11 p11, typename PF::PARM_12 p12 )
{ ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8, typename PF::PARM_9 p9, typename PF::PARM_10 p10, typename PF::PARM_11 p11, typename PF::PARM_12 p12, typename PF::PARM_13 p13 )
{ ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8, typename PF::PARM_9 p9, typename PF::PARM_10 p10, typename PF::PARM_11 p11, typename PF::PARM_12 p12, typename PF::PARM_13 p13, typename PF::PARM_14 p14 )
{ ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8, typename PF::PARM_9 p9, typename PF::PARM_10 p10, typename PF::PARM_11 p11, typename PF::PARM_12 p12, typename PF::PARM_13 p13, typename PF::PARM_14 p14, typename PF::PARM_15 p15 )
{ ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15 ); }
result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4, typename PF::PARM_5 p5, typename PF::PARM_6 p6, typename PF::PARM_7 p7, typename PF::PARM_8 p8, typename PF::PARM_9 p9, typename PF::PARM_10 p10, typename PF::PARM_11 p11, typename PF::PARM_12 p12, typename PF::PARM_13 p13, typename PF::PARM_14 p14, typename PF::PARM_15 p15, typename PF::PARM_16 p16 )
{ ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16 ); }
private:
OBJ_PTR obj_;
MEMFN_PTR memfn_;
};
COMET_CLOSE_PARTIAL()
/** \class functor_impl functor.h comet/functor.h
* Implementation of a functor.
* \param R Return type.
* \param LIST List of argument types.
*/
template<typename R, typename LIST>
class ATL_NO_VTABLE functor_impl : public functor_impl_aux< typelist::length<LIST>::value COMET_PARTIAL_NS_2(R,LIST)
{};
template<typename R, typename LIST> class functor;
/** Provide various operator() versions to call the virtual functor.
* This is Effectively paritally specialised to return type (for void
* implementation).
* \param R Return type.
* \param LIST argument list.
*/
COMET_DEFINE_PARTIAL( typename,R,typename,LIST, functor_operators ) : public parameter_types<LIST>
{
typedef functor<R, LIST> BASE;
public:
R operator()( )
{ return (*(static_cast<BASE*>(this)->impl()))( ); }
R operator()( PARM_1 p1 )
{ return (*(static_cast<BASE*>(this)->impl()))( p1 ); }
R operator()( PARM_1 p1, PARM_2 p2 )
{ return (*(static_cast<BASE*>(this)->impl()))( p1, p2 ); }
R operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3 )
{ return (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3 ); }
R operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3, PARM_4 p4 )
{ return (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4 ); }
R operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3, PARM_4 p4, PARM_5 p5 )
{ return (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5 ); }
R operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3, PARM_4 p4, PARM_5 p5, PARM_6 p6 )
{ return (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6 ); }
R operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3, PARM_4 p4, PARM_5 p5, PARM_6 p6, PARM_7 p7 )
{ return (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7 ); }
R operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3, PARM_4 p4, PARM_5 p5, PARM_6 p6, PARM_7 p7, PARM_8 p8 )
{ return (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8 ); }
R operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3, PARM_4 p4, PARM_5 p5, PARM_6 p6, PARM_7 p7, PARM_8 p8, PARM_9 p9 )
{ return (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8, p9 ); }
R operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3, PARM_4 p4, PARM_5 p5, PARM_6 p6, PARM_7 p7, PARM_8 p8, PARM_9 p9, PARM_10 p10 )
{ return (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 ); }
R operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3, PARM_4 p4, PARM_5 p5, PARM_6 p6, PARM_7 p7, PARM_8 p8, PARM_9 p9, PARM_10 p10, PARM_11 p11 )
{ return (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11 ); }
R operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3, PARM_4 p4, PARM_5 p5, PARM_6 p6, PARM_7 p7, PARM_8 p8, PARM_9 p9, PARM_10 p10, PARM_11 p11, PARM_12 p12 )
{ return (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12 ); }
R operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3, PARM_4 p4, PARM_5 p5, PARM_6 p6, PARM_7 p7, PARM_8 p8, PARM_9 p9, PARM_10 p10, PARM_11 p11, PARM_12 p12, PARM_13 p13 )
{ return (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13 ); }
R operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3, PARM_4 p4, PARM_5 p5, PARM_6 p6, PARM_7 p7, PARM_8 p8, PARM_9 p9, PARM_10 p10, PARM_11 p11, PARM_12 p12, PARM_13 p13, PARM_14 p14 )
{ return (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14 ); }
R operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3, PARM_4 p4, PARM_5 p5, PARM_6 p6, PARM_7 p7, PARM_8 p8, PARM_9 p9, PARM_10 p10, PARM_11 p11, PARM_12 p12, PARM_13 p13, PARM_14 p14, PARM_15 p15 )
{ return (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15 ); }
R operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3, PARM_4 p4, PARM_5 p5, PARM_6 p6, PARM_7 p7, PARM_8 p8, PARM_9 p9, PARM_10 p10, PARM_11 p11, PARM_12 p12, PARM_13 p13, PARM_14 p14, PARM_15 p15, PARM_16 p16 )
{ return (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16 ); }
};
COMET_CLOSE_PARTIAL()
COMET_SPECIALISE_PARTIAL( void,typename,LIST , functor_operators)
: public parameter_types<LIST>
{
typedef functor<void, LIST> BASE;
public:
void operator()( )
{ (*(static_cast<BASE*>(this)->impl()))( ); }
void operator()( PARM_1 p1 )
{ (*(static_cast<BASE*>(this)->impl()))( p1 ); }
void operator()( PARM_1 p1, PARM_2 p2 )
{ (*(static_cast<BASE*>(this)->impl()))( p1, p2 ); }
void operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3 )
{ (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3 ); }
void operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3, PARM_4 p4 )
{ (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4 ); }
void operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3, PARM_4 p4, PARM_5 p5 )
{ (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5 ); }
void operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3, PARM_4 p4, PARM_5 p5, PARM_6 p6 )
{ (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6 ); }
void operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3, PARM_4 p4, PARM_5 p5, PARM_6 p6, PARM_7 p7 )
{ (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7 ); }
void operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3, PARM_4 p4, PARM_5 p5, PARM_6 p6, PARM_7 p7, PARM_8 p8 )
{ (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8 ); }
void operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3, PARM_4 p4, PARM_5 p5, PARM_6 p6, PARM_7 p7, PARM_8 p8, PARM_9 p9 )
{ (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8, p9 ); }
void operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3, PARM_4 p4, PARM_5 p5, PARM_6 p6, PARM_7 p7, PARM_8 p8, PARM_9 p9, PARM_10 p10 )
{ (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 ); }
void operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3, PARM_4 p4, PARM_5 p5, PARM_6 p6, PARM_7 p7, PARM_8 p8, PARM_9 p9, PARM_10 p10, PARM_11 p11 )
{ (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11 ); }
void operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3, PARM_4 p4, PARM_5 p5, PARM_6 p6, PARM_7 p7, PARM_8 p8, PARM_9 p9, PARM_10 p10, PARM_11 p11, PARM_12 p12 )
{ (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12 ); }
void operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3, PARM_4 p4, PARM_5 p5, PARM_6 p6, PARM_7 p7, PARM_8 p8, PARM_9 p9, PARM_10 p10, PARM_11 p11, PARM_12 p12, PARM_13 p13 )
{ (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13 ); }
void operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3, PARM_4 p4, PARM_5 p5, PARM_6 p6, PARM_7 p7, PARM_8 p8, PARM_9 p9, PARM_10 p10, PARM_11 p11, PARM_12 p12, PARM_13 p13, PARM_14 p14 )
{ (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14 ); }
void operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3, PARM_4 p4, PARM_5 p5, PARM_6 p6, PARM_7 p7, PARM_8 p8, PARM_9 p9, PARM_10 p10, PARM_11 p11, PARM_12 p12, PARM_13 p13, PARM_14 p14, PARM_15 p15 )
{ (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15 ); }
void operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3, PARM_4 p4, PARM_5 p5, PARM_6 p6, PARM_7 p7, PARM_8 p8, PARM_9 p9, PARM_10 p10, PARM_11 p11, PARM_12 p12, PARM_13 p13, PARM_14 p14, PARM_15 p15, PARM_16 p16 )
{ (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16 ); }
};
COMET_CLOSE_PARTIAL()
/** \class functor functor.h comet/functor.h
* Functor pointer class and implementation factory. This provides the interface to the functor library.
* \param R Return type
* \param LIST List of types using \link make_list comet::make_list \endlink
*/
template<typename R, typename LIST = nil> class functor : public functor_operators<R COMET_PARTIAL_NS_1(LIST)
{
public:
typedef functor_impl<R, LIST> IMPL;
typedef R result_type;
typedef LIST parm_list;
functor() {};
functor(const functor<R, LIST>& f) : impl_((f.impl_.get()== NULL) ? NULL: f.impl_->clone()) {}
explicit functor(std::auto_ptr< IMPL > impl) : impl_(impl) {}
template<typename FUN> explicit functor(int, FUN fun) : impl_(new functor_handler<R COMET_PARTIAL_NS_2((functor<R, LIST>), FUN)(fun))
{}
template<typename OBJ_PTR, typename MEMFN_PTR> functor(int, const OBJ_PTR& obj, MEMFN_PTR memfn)
: impl_(new memfun_handler<R>COMET_PARTIAL_NS<functor<R, LIST>, OBJ_PTR, MEMFN_PTR>(obj, memfn))
{}
functor& operator=(const functor& rhs)
{
std::auto_ptr<IMPL> tmp((rhs.impl_.get() == NULL)? NULL: rhs.impl_->clone());
impl_ = tmp;
return *this;
}
std::auto_ptr<IMPL> &impl(){return impl_;}
bool is_null() const { return impl_.get() == NULL; }
protected:
std::auto_ptr<IMPL> impl_;
};
/** \class chainer functor.h comet/functor.h
* Implements a functor that chains one functor to another functor.
* \param R Return type
* \param LIST Typelist of arguments
* \sa chain
*/
COMET_DEFINE_PARTIAL(typename,R, typename,LIST, chainer) : public functor_impl<R, LIST>
{
private:
typedef functor<R, LIST> FUN;
FUN fun1_;
FUN fun2_;
public:
COMET_PARTIAL_NAME(chainer)(const FUN& fun1, const FUN& fun2) : fun1_(fun1), fun2_(fun2)
{}
COMET_PARTIAL_NAME(chainer)(const COMET_PARTIAL_NAME(chainer)& x) : fun1_(x.fun1_), fun2_(x.fun2_)
{}
functor_impl<R, LIST>* clone() const
{ return new COMET_PARTIAL_NAME(chainer)(*this); }
R operator()( )
{
fun1_( );
return fun2_( );
}
R operator()( typename FUN::PARM_1 p1 )
{
fun1_( p1 );
return fun2_( p1 );
}
R operator()( typename FUN::PARM_1 p1, typename FUN::PARM_2 p2 )
{
fun1_( p1, p2 );
return fun2_( p1, p2 );
}
R operator()( typename FUN::PARM_1 p1, typename FUN::PARM_2 p2, typename FUN::PARM_3 p3 )
{
fun1_( p1, p2, p3 );
return fun2_( p1, p2, p3 );
}
R operator()( typename FUN::PARM_1 p1, typename FUN::PARM_2 p2, typename FUN::PARM_3 p3, typename FUN::PARM_4 p4 )
{
fun1_( p1, p2, p3, p4 );
return fun2_( p1, p2, p3, p4 );
}
R operator()( typename FUN::PARM_1 p1, typename FUN::PARM_2 p2, typename FUN::PARM_3 p3, typename FUN::PARM_4 p4, typename FUN::PARM_5 p5 )
{
fun1_( p1, p2, p3, p4, p5 );
return fun2_( p1, p2, p3, p4, p5 );
}
R operator()( typename FUN::PARM_1 p1, typename FUN::PARM_2 p2, typename FUN::PARM_3 p3, typename FUN::PARM_4 p4, typename FUN::PARM_5 p5, typename FUN::PARM_6 p6 )
{
fun1_( p1, p2, p3, p4, p5, p6 );
return fun2_( p1, p2, p3, p4, p5, p6 );
}
R operator()( typename FUN::PARM_1 p1, typename FUN::PARM_2 p2, typename FUN::PARM_3 p3, typename FUN::PARM_4 p4, typename FUN::PARM_5 p5, typename FUN::PARM_6 p6, typename FUN::PARM_7 p7 )
{
fun1_( p1, p2, p3, p4, p5, p6, p7 );
return fun2_( p1, p2, p3, p4, p5, p6, p7 );
}
R operator()( typename FUN::PARM_1 p1, typename FUN::PARM_2 p2, typename FUN::PARM_3 p3, typename FUN::PARM_4 p4, typename FUN::PARM_5 p5, typename FUN::PARM_6 p6, typename FUN::PARM_7 p7, typename FUN::PARM_8 p8 )
{
fun1_( p1, p2, p3, p4, p5, p6, p7, p8 );
return fun2_( p1, p2, p3, p4, p5, p6, p7, p8 );
}
R operator()( typename FUN::PARM_1 p1, typename FUN::PARM_2 p2, typename FUN::PARM_3 p3, typename FUN::PARM_4 p4, typename FUN::PARM_5 p5, typename FUN::PARM_6 p6, typename FUN::PARM_7 p7, typename FUN::PARM_8 p8, typename FUN::PARM_9 p9 )
{
fun1_( p1, p2, p3, p4, p5, p6, p7, p8, p9 );
return fun2_( p1, p2, p3, p4, p5, p6, p7, p8, p9 );
}
R operator()( typename FUN::PARM_1 p1, typename FUN::PARM_2 p2, typename FUN::PARM_3 p3, typename FUN::PARM_4 p4, typename FUN::PARM_5 p5, typename FUN::PARM_6 p6, typename FUN::PARM_7 p7, typename FUN::PARM_8 p8, typename FUN::PARM_9 p9, typename FUN::PARM_10 p10 )
{
fun1_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 );
return fun2_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 );
}
R operator()( typename FUN::PARM_1 p1, typename FUN::PARM_2 p2, typename FUN::PARM_3 p3, typename FUN::PARM_4 p4, typename FUN::PARM_5 p5, typename FUN::PARM_6 p6, typename FUN::PARM_7 p7, typename FUN::PARM_8 p8, typename FUN::PARM_9 p9, typename FUN::PARM_10 p10, typename FUN::PARM_11 p11 )
{
fun1_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11 );
return fun2_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11 );
}
R operator()( typename FUN::PARM_1 p1, typename FUN::PARM_2 p2, typename FUN::PARM_3 p3, typename FUN::PARM_4 p4, typename FUN::PARM_5 p5, typename FUN::PARM_6 p6, typename FUN::PARM_7 p7, typename FUN::PARM_8 p8, typename FUN::PARM_9 p9, typename FUN::PARM_10 p10, typename FUN::PARM_11 p11, typename FUN::PARM_12 p12 )
{
fun1_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12 );
return fun2_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12 );
}
R operator()( typename FUN::PARM_1 p1, typename FUN::PARM_2 p2, typename FUN::PARM_3 p3, typename FUN::PARM_4 p4, typename FUN::PARM_5 p5, typename FUN::PARM_6 p6, typename FUN::PARM_7 p7, typename FUN::PARM_8 p8, typename FUN::PARM_9 p9, typename FUN::PARM_10 p10, typename FUN::PARM_11 p11, typename FUN::PARM_12 p12, typename FUN::PARM_13 p13 )
{
fun1_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13 );
return fun2_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13 );
}
R operator()( typename FUN::PARM_1 p1, typename FUN::PARM_2 p2, typename FUN::PARM_3 p3, typename FUN::PARM_4 p4, typename FUN::PARM_5 p5, typename FUN::PARM_6 p6, typename FUN::PARM_7 p7, typename FUN::PARM_8 p8, typename FUN::PARM_9 p9, typename FUN::PARM_10 p10, typename FUN::PARM_11 p11, typename FUN::PARM_12 p12, typename FUN::PARM_13 p13, typename FUN::PARM_14 p14 )
{
fun1_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14 );
return fun2_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14 );
}
R operator()( typename FUN::PARM_1 p1, typename FUN::PARM_2 p2, typename FUN::PARM_3 p3, typename FUN::PARM_4 p4, typename FUN::PARM_5 p5, typename FUN::PARM_6 p6, typename FUN::PARM_7 p7, typename FUN::PARM_8 p8, typename FUN::PARM_9 p9, typename FUN::PARM_10 p10, typename FUN::PARM_11 p11, typename FUN::PARM_12 p12, typename FUN::PARM_13 p13, typename FUN::PARM_14 p14, typename FUN::PARM_15 p15 )
{
fun1_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15 );
return fun2_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15 );
}
R operator()( typename FUN::PARM_1 p1, typename FUN::PARM_2 p2, typename FUN::PARM_3 p3, typename FUN::PARM_4 p4, typename FUN::PARM_5 p5, typename FUN::PARM_6 p6, typename FUN::PARM_7 p7, typename FUN::PARM_8 p8, typename FUN::PARM_9 p9, typename FUN::PARM_10 p10, typename FUN::PARM_11 p11, typename FUN::PARM_12 p12, typename FUN::PARM_13 p13, typename FUN::PARM_14 p14, typename FUN::PARM_15 p15, typename FUN::PARM_16 p16 )
{
fun1_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16 );
return fun2_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16 );
}
};
COMET_CLOSE_PARTIAL()
/** Specialisation for void.
*/
COMET_SPECIALISE_PARTIAL( void, typename,LIST , chainer )
: public functor_impl<void, LIST>
{
private:
typedef functor<void, LIST> FUN;
FUN fun1_;
FUN fun2_;
public:
COMET_PARTIAL_NAME(chainer)(const FUN& fun1, const FUN& fun2) : fun1_(fun1), fun2_(fun2)
{}
COMET_PARTIAL_NAME(chainer)(const COMET_PARTIAL_NAME(chainer)& x) : fun1_(x.fun1_), fun2_(x.fun2_)
{}
functor_impl<void, LIST>* clone() const
{ return new COMET_PARTIAL_NAME(chainer)(*this); }
void operator()( )
{
fun1_( );
fun2_( );
}
void operator()( typename FUN::PARM_1 p1 )
{
fun1_( p1 );
fun2_( p1 );
}
void operator()( typename FUN::PARM_1 p1, typename FUN::PARM_2 p2 )
{
fun1_( p1, p2 );
fun2_( p1, p2 );
}
void operator()( typename FUN::PARM_1 p1, typename FUN::PARM_2 p2, typename FUN::PARM_3 p3 )
{
fun1_( p1, p2, p3 );
fun2_( p1, p2, p3 );
}
void operator()( typename FUN::PARM_1 p1, typename FUN::PARM_2 p2, typename FUN::PARM_3 p3, typename FUN::PARM_4 p4 )
{
fun1_( p1, p2, p3, p4 );
fun2_( p1, p2, p3, p4 );
}
void operator()( typename FUN::PARM_1 p1, typename FUN::PARM_2 p2, typename FUN::PARM_3 p3, typename FUN::PARM_4 p4, typename FUN::PARM_5 p5 )
{
fun1_( p1, p2, p3, p4, p5 );
fun2_( p1, p2, p3, p4, p5 );
}
void operator()( typename FUN::PARM_1 p1, typename FUN::PARM_2 p2, typename FUN::PARM_3 p3, typename FUN::PARM_4 p4, typename FUN::PARM_5 p5, typename FUN::PARM_6 p6 )
{
fun1_( p1, p2, p3, p4, p5, p6 );
fun2_( p1, p2, p3, p4, p5, p6 );
}
void operator()( typename FUN::PARM_1 p1, typename FUN::PARM_2 p2, typename FUN::PARM_3 p3, typename FUN::PARM_4 p4, typename FUN::PARM_5 p5, typename FUN::PARM_6 p6, typename FUN::PARM_7 p7 )
{
fun1_( p1, p2, p3, p4, p5, p6, p7 );
fun2_( p1, p2, p3, p4, p5, p6, p7 );
}
void operator()( typename FUN::PARM_1 p1, typename FUN::PARM_2 p2, typename FUN::PARM_3 p3, typename FUN::PARM_4 p4, typename FUN::PARM_5 p5, typename FUN::PARM_6 p6, typename FUN::PARM_7 p7, typename FUN::PARM_8 p8 )
{
fun1_( p1, p2, p3, p4, p5, p6, p7, p8 );
fun2_( p1, p2, p3, p4, p5, p6, p7, p8 );
}
void operator()( typename FUN::PARM_1 p1, typename FUN::PARM_2 p2, typename FUN::PARM_3 p3, typename FUN::PARM_4 p4, typename FUN::PARM_5 p5, typename FUN::PARM_6 p6, typename FUN::PARM_7 p7, typename FUN::PARM_8 p8, typename FUN::PARM_9 p9 )
{
fun1_( p1, p2, p3, p4, p5, p6, p7, p8, p9 );
fun2_( p1, p2, p3, p4, p5, p6, p7, p8, p9 );
}
void operator()( typename FUN::PARM_1 p1, typename FUN::PARM_2 p2, typename FUN::PARM_3 p3, typename FUN::PARM_4 p4, typename FUN::PARM_5 p5, typename FUN::PARM_6 p6, typename FUN::PARM_7 p7, typename FUN::PARM_8 p8, typename FUN::PARM_9 p9, typename FUN::PARM_10 p10 )
{
fun1_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 );
fun2_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 );
}
void operator()( typename FUN::PARM_1 p1, typename FUN::PARM_2 p2, typename FUN::PARM_3 p3, typename FUN::PARM_4 p4, typename FUN::PARM_5 p5, typename FUN::PARM_6 p6, typename FUN::PARM_7 p7, typename FUN::PARM_8 p8, typename FUN::PARM_9 p9, typename FUN::PARM_10 p10, typename FUN::PARM_11 p11 )
{
fun1_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11 );
fun2_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11 );
}
void operator()( typename FUN::PARM_1 p1, typename FUN::PARM_2 p2, typename FUN::PARM_3 p3, typename FUN::PARM_4 p4, typename FUN::PARM_5 p5, typename FUN::PARM_6 p6, typename FUN::PARM_7 p7, typename FUN::PARM_8 p8, typename FUN::PARM_9 p9, typename FUN::PARM_10 p10, typename FUN::PARM_11 p11, typename FUN::PARM_12 p12 )
{
fun1_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12 );
fun2_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12 );
}
void operator()( typename FUN::PARM_1 p1, typename FUN::PARM_2 p2, typename FUN::PARM_3 p3, typename FUN::PARM_4 p4, typename FUN::PARM_5 p5, typename FUN::PARM_6 p6, typename FUN::PARM_7 p7, typename FUN::PARM_8 p8, typename FUN::PARM_9 p9, typename FUN::PARM_10 p10, typename FUN::PARM_11 p11, typename FUN::PARM_12 p12, typename FUN::PARM_13 p13 )
{
fun1_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13 );
fun2_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13 );
}
void operator()( typename FUN::PARM_1 p1, typename FUN::PARM_2 p2, typename FUN::PARM_3 p3, typename FUN::PARM_4 p4, typename FUN::PARM_5 p5, typename FUN::PARM_6 p6, typename FUN::PARM_7 p7, typename FUN::PARM_8 p8, typename FUN::PARM_9 p9, typename FUN::PARM_10 p10, typename FUN::PARM_11 p11, typename FUN::PARM_12 p12, typename FUN::PARM_13 p13, typename FUN::PARM_14 p14 )
{
fun1_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14 );
fun2_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14 );
}
void operator()( typename FUN::PARM_1 p1, typename FUN::PARM_2 p2, typename FUN::PARM_3 p3, typename FUN::PARM_4 p4, typename FUN::PARM_5 p5, typename FUN::PARM_6 p6, typename FUN::PARM_7 p7, typename FUN::PARM_8 p8, typename FUN::PARM_9 p9, typename FUN::PARM_10 p10, typename FUN::PARM_11 p11, typename FUN::PARM_12 p12, typename FUN::PARM_13 p13, typename FUN::PARM_14 p14, typename FUN::PARM_15 p15 )
{
fun1_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15 );
fun2_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15 );
}
void operator()( typename FUN::PARM_1 p1, typename FUN::PARM_2 p2, typename FUN::PARM_3 p3, typename FUN::PARM_4 p4, typename FUN::PARM_5 p5, typename FUN::PARM_6 p6, typename FUN::PARM_7 p7, typename FUN::PARM_8 p8, typename FUN::PARM_9 p9, typename FUN::PARM_10 p10, typename FUN::PARM_11 p11, typename FUN::PARM_12 p12, typename FUN::PARM_13 p13, typename FUN::PARM_14 p14, typename FUN::PARM_15 p15, typename FUN::PARM_16 p16 )
{
fun1_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16 );
fun2_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16 );
}
};
COMET_CLOSE_PARTIAL()
/** \class binder_first functor.h comet/functor.h
* Implements a functor that calls the first parameter bound to a specified
* type. The functor type implemented is effectively functor<R, LIST::tail>.
* \sa bind_first
*/
COMET_DEFINE_PARTIAL( typename,R, typename,LIST, binder_first)
: public functor_impl<R, typename LIST::tail>
{
public:
typedef functor<R, typename LIST::tail> outgoing_type;
typedef typename functor<R, LIST>::PARM_1 bound_type;
typedef R result_type;
private:
functor<R, LIST> fun_;
bound_type bound_;
public:
COMET_PARTIAL_NAME(binder_first)(const functor<R, LIST>& fun, bound_type bound) : bound_(bound)
{
fun_ = fun;
}
COMET_PARTIAL_NAME(binder_first)(const COMET_PARTIAL_NAME(binder_first)& x) : bound_(x.bound_)
{
fun_ = x.fun_;
}
functor_impl<R, typename LIST::tail>* clone() const
{ return new COMET_PARTIAL_NAME(binder_first)(*this); }
result_type operator()()
{
return fun_(bound_ );
}
result_type operator()( typename outgoing_type::PARM_1 p1)
{
return fun_(bound_, p1);
}
result_type operator()( typename outgoing_type::PARM_1 p1, typename outgoing_type::PARM_2 p2)
{
return fun_(bound_, p1, p2);
}
result_type operator()( typename outgoing_type::PARM_1 p1, typename outgoing_type::PARM_2 p2, typename outgoing_type::PARM_3 p3)
{
return fun_(bound_, p1, p2, p3);
}
result_type operator()( typename outgoing_type::PARM_1 p1, typename outgoing_type::PARM_2 p2, typename outgoing_type::PARM_3 p3, typename outgoing_type::PARM_4 p4)
{
return fun_(bound_, p1, p2, p3, p4);
}
result_type operator()( typename outgoing_type::PARM_1 p1, typename outgoing_type::PARM_2 p2, typename outgoing_type::PARM_3 p3, typename outgoing_type::PARM_4 p4, typename outgoing_type::PARM_5 p5)
{
return fun_(bound_, p1, p2, p3, p4, p5);
}
result_type operator()( typename outgoing_type::PARM_1 p1, typename outgoing_type::PARM_2 p2, typename outgoing_type::PARM_3 p3, typename outgoing_type::PARM_4 p4, typename outgoing_type::PARM_5 p5, typename outgoing_type::PARM_6 p6)
{
return fun_(bound_, p1, p2, p3, p4, p5, p6);
}
result_type operator()( typename outgoing_type::PARM_1 p1, typename outgoing_type::PARM_2 p2, typename outgoing_type::PARM_3 p3, typename outgoing_type::PARM_4 p4, typename outgoing_type::PARM_5 p5, typename outgoing_type::PARM_6 p6, typename outgoing_type::PARM_7 p7)
{
return fun_(bound_, p1, p2, p3, p4, p5, p6, p7);
}
result_type operator()( typename outgoing_type::PARM_1 p1, typename outgoing_type::PARM_2 p2, typename outgoing_type::PARM_3 p3, typename outgoing_type::PARM_4 p4, typename outgoing_type::PARM_5 p5, typename outgoing_type::PARM_6 p6, typename outgoing_type::PARM_7 p7, typename outgoing_type::PARM_8 p8)
{
return fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8);
}
result_type operator()( typename outgoing_type::PARM_1 p1, typename outgoing_type::PARM_2 p2, typename outgoing_type::PARM_3 p3, typename outgoing_type::PARM_4 p4, typename outgoing_type::PARM_5 p5, typename outgoing_type::PARM_6 p6, typename outgoing_type::PARM_7 p7, typename outgoing_type::PARM_8 p8, typename outgoing_type::PARM_9 p9)
{
return fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8, p9);
}
result_type operator()( typename outgoing_type::PARM_1 p1, typename outgoing_type::PARM_2 p2, typename outgoing_type::PARM_3 p3, typename outgoing_type::PARM_4 p4, typename outgoing_type::PARM_5 p5, typename outgoing_type::PARM_6 p6, typename outgoing_type::PARM_7 p7, typename outgoing_type::PARM_8 p8, typename outgoing_type::PARM_9 p9, typename outgoing_type::PARM_10 p10)
{
return fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);
}
result_type operator()( typename outgoing_type::PARM_1 p1, typename outgoing_type::PARM_2 p2, typename outgoing_type::PARM_3 p3, typename outgoing_type::PARM_4 p4, typename outgoing_type::PARM_5 p5, typename outgoing_type::PARM_6 p6, typename outgoing_type::PARM_7 p7, typename outgoing_type::PARM_8 p8, typename outgoing_type::PARM_9 p9, typename outgoing_type::PARM_10 p10, typename outgoing_type::PARM_11 p11)
{
return fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11);
}
result_type operator()( typename outgoing_type::PARM_1 p1, typename outgoing_type::PARM_2 p2, typename outgoing_type::PARM_3 p3, typename outgoing_type::PARM_4 p4, typename outgoing_type::PARM_5 p5, typename outgoing_type::PARM_6 p6, typename outgoing_type::PARM_7 p7, typename outgoing_type::PARM_8 p8, typename outgoing_type::PARM_9 p9, typename outgoing_type::PARM_10 p10, typename outgoing_type::PARM_11 p11, typename outgoing_type::PARM_12 p12)
{
return fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12);
}
result_type operator()( typename outgoing_type::PARM_1 p1, typename outgoing_type::PARM_2 p2, typename outgoing_type::PARM_3 p3, typename outgoing_type::PARM_4 p4, typename outgoing_type::PARM_5 p5, typename outgoing_type::PARM_6 p6, typename outgoing_type::PARM_7 p7, typename outgoing_type::PARM_8 p8, typename outgoing_type::PARM_9 p9, typename outgoing_type::PARM_10 p10, typename outgoing_type::PARM_11 p11, typename outgoing_type::PARM_12 p12, typename outgoing_type::PARM_13 p13)
{
return fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13);
}
result_type operator()( typename outgoing_type::PARM_1 p1, typename outgoing_type::PARM_2 p2, typename outgoing_type::PARM_3 p3, typename outgoing_type::PARM_4 p4, typename outgoing_type::PARM_5 p5, typename outgoing_type::PARM_6 p6, typename outgoing_type::PARM_7 p7, typename outgoing_type::PARM_8 p8, typename outgoing_type::PARM_9 p9, typename outgoing_type::PARM_10 p10, typename outgoing_type::PARM_11 p11, typename outgoing_type::PARM_12 p12, typename outgoing_type::PARM_13 p13, typename outgoing_type::PARM_14 p14)
{
return fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14);
}
result_type operator()( typename outgoing_type::PARM_1 p1, typename outgoing_type::PARM_2 p2, typename outgoing_type::PARM_3 p3, typename outgoing_type::PARM_4 p4, typename outgoing_type::PARM_5 p5, typename outgoing_type::PARM_6 p6, typename outgoing_type::PARM_7 p7, typename outgoing_type::PARM_8 p8, typename outgoing_type::PARM_9 p9, typename outgoing_type::PARM_10 p10, typename outgoing_type::PARM_11 p11, typename outgoing_type::PARM_12 p12, typename outgoing_type::PARM_13 p13, typename outgoing_type::PARM_14 p14, typename outgoing_type::PARM_15 p15)
{
return fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15);
}
result_type operator()( typename outgoing_type::PARM_1 p1, typename outgoing_type::PARM_2 p2, typename outgoing_type::PARM_3 p3, typename outgoing_type::PARM_4 p4, typename outgoing_type::PARM_5 p5, typename outgoing_type::PARM_6 p6, typename outgoing_type::PARM_7 p7, typename outgoing_type::PARM_8 p8, typename outgoing_type::PARM_9 p9, typename outgoing_type::PARM_10 p10, typename outgoing_type::PARM_11 p11, typename outgoing_type::PARM_12 p12, typename outgoing_type::PARM_13 p13, typename outgoing_type::PARM_14 p14, typename outgoing_type::PARM_15 p15, typename outgoing_type::PARM_16 p16)
{
return fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16);
}
};
COMET_CLOSE_PARTIAL()
COMET_SPECIALISE_PARTIAL( void, typename,LIST , binder_first)
: public functor_impl<void, typename LIST::tail>
{
public:
typedef functor<void, typename LIST::tail> outgoing_type;
typedef typename functor<void, LIST>::PARM_1 bound_type;
typedef void result_type;
private:
functor<void, LIST> fun_;
bound_type bound_;
public:
COMET_PARTIAL_NAME(binder_first)(const functor<void, LIST>& fun, bound_type bound) : bound_(bound)
{
fun_ = fun;
}
COMET_PARTIAL_NAME(binder_first)(const COMET_PARTIAL_NAME(binder_first)& x) : bound_(x.bound_)
{
fun_ = x.fun_;
}
functor_impl<void, typename LIST::tail>* clone() const
{ return new COMET_PARTIAL_NAME(binder_first)(*this); }
result_type operator()()
{
fun_(bound_ );
}
result_type operator()( typename outgoing_type::PARM_1 p1)
{
fun_(bound_, p1);
}
result_type operator()( typename outgoing_type::PARM_1 p1, typename outgoing_type::PARM_2 p2)
{
fun_(bound_, p1, p2);
}
result_type operator()( typename outgoing_type::PARM_1 p1, typename outgoing_type::PARM_2 p2, typename outgoing_type::PARM_3 p3)
{
fun_(bound_, p1, p2, p3);
}
result_type operator()( typename outgoing_type::PARM_1 p1, typename outgoing_type::PARM_2 p2, typename outgoing_type::PARM_3 p3, typename outgoing_type::PARM_4 p4)
{
fun_(bound_, p1, p2, p3, p4);
}
result_type operator()( typename outgoing_type::PARM_1 p1, typename outgoing_type::PARM_2 p2, typename outgoing_type::PARM_3 p3, typename outgoing_type::PARM_4 p4, typename outgoing_type::PARM_5 p5)
{
fun_(bound_, p1, p2, p3, p4, p5);
}
result_type operator()( typename outgoing_type::PARM_1 p1, typename outgoing_type::PARM_2 p2, typename outgoing_type::PARM_3 p3, typename outgoing_type::PARM_4 p4, typename outgoing_type::PARM_5 p5, typename outgoing_type::PARM_6 p6)
{
fun_(bound_, p1, p2, p3, p4, p5, p6);
}
result_type operator()( typename outgoing_type::PARM_1 p1, typename outgoing_type::PARM_2 p2, typename outgoing_type::PARM_3 p3, typename outgoing_type::PARM_4 p4, typename outgoing_type::PARM_5 p5, typename outgoing_type::PARM_6 p6, typename outgoing_type::PARM_7 p7)
{
fun_(bound_, p1, p2, p3, p4, p5, p6, p7);
}
result_type operator()( typename outgoing_type::PARM_1 p1, typename outgoing_type::PARM_2 p2, typename outgoing_type::PARM_3 p3, typename outgoing_type::PARM_4 p4, typename outgoing_type::PARM_5 p5, typename outgoing_type::PARM_6 p6, typename outgoing_type::PARM_7 p7, typename outgoing_type::PARM_8 p8)
{
fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8);
}
result_type operator()( typename outgoing_type::PARM_1 p1, typename outgoing_type::PARM_2 p2, typename outgoing_type::PARM_3 p3, typename outgoing_type::PARM_4 p4, typename outgoing_type::PARM_5 p5, typename outgoing_type::PARM_6 p6, typename outgoing_type::PARM_7 p7, typename outgoing_type::PARM_8 p8, typename outgoing_type::PARM_9 p9)
{
fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8, p9);
}
result_type operator()( typename outgoing_type::PARM_1 p1, typename outgoing_type::PARM_2 p2, typename outgoing_type::PARM_3 p3, typename outgoing_type::PARM_4 p4, typename outgoing_type::PARM_5 p5, typename outgoing_type::PARM_6 p6, typename outgoing_type::PARM_7 p7, typename outgoing_type::PARM_8 p8, typename outgoing_type::PARM_9 p9, typename outgoing_type::PARM_10 p10)
{
fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);
}
result_type operator()( typename outgoing_type::PARM_1 p1, typename outgoing_type::PARM_2 p2, typename outgoing_type::PARM_3 p3, typename outgoing_type::PARM_4 p4, typename outgoing_type::PARM_5 p5, typename outgoing_type::PARM_6 p6, typename outgoing_type::PARM_7 p7, typename outgoing_type::PARM_8 p8, typename outgoing_type::PARM_9 p9, typename outgoing_type::PARM_10 p10, typename outgoing_type::PARM_11 p11)
{
fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11);
}
result_type operator()( typename outgoing_type::PARM_1 p1, typename outgoing_type::PARM_2 p2, typename outgoing_type::PARM_3 p3, typename outgoing_type::PARM_4 p4, typename outgoing_type::PARM_5 p5, typename outgoing_type::PARM_6 p6, typename outgoing_type::PARM_7 p7, typename outgoing_type::PARM_8 p8, typename outgoing_type::PARM_9 p9, typename outgoing_type::PARM_10 p10, typename outgoing_type::PARM_11 p11, typename outgoing_type::PARM_12 p12)
{
fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12);
}
result_type operator()( typename outgoing_type::PARM_1 p1, typename outgoing_type::PARM_2 p2, typename outgoing_type::PARM_3 p3, typename outgoing_type::PARM_4 p4, typename outgoing_type::PARM_5 p5, typename outgoing_type::PARM_6 p6, typename outgoing_type::PARM_7 p7, typename outgoing_type::PARM_8 p8, typename outgoing_type::PARM_9 p9, typename outgoing_type::PARM_10 p10, typename outgoing_type::PARM_11 p11, typename outgoing_type::PARM_12 p12, typename outgoing_type::PARM_13 p13)
{
fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13);
}
result_type operator()( typename outgoing_type::PARM_1 p1, typename outgoing_type::PARM_2 p2, typename outgoing_type::PARM_3 p3, typename outgoing_type::PARM_4 p4, typename outgoing_type::PARM_5 p5, typename outgoing_type::PARM_6 p6, typename outgoing_type::PARM_7 p7, typename outgoing_type::PARM_8 p8, typename outgoing_type::PARM_9 p9, typename outgoing_type::PARM_10 p10, typename outgoing_type::PARM_11 p11, typename outgoing_type::PARM_12 p12, typename outgoing_type::PARM_13 p13, typename outgoing_type::PARM_14 p14)
{
fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14);
}
result_type operator()( typename outgoing_type::PARM_1 p1, typename outgoing_type::PARM_2 p2, typename outgoing_type::PARM_3 p3, typename outgoing_type::PARM_4 p4, typename outgoing_type::PARM_5 p5, typename outgoing_type::PARM_6 p6, typename outgoing_type::PARM_7 p7, typename outgoing_type::PARM_8 p8, typename outgoing_type::PARM_9 p9, typename outgoing_type::PARM_10 p10, typename outgoing_type::PARM_11 p11, typename outgoing_type::PARM_12 p12, typename outgoing_type::PARM_13 p13, typename outgoing_type::PARM_14 p14, typename outgoing_type::PARM_15 p15)
{
fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15);
}
result_type operator()( typename outgoing_type::PARM_1 p1, typename outgoing_type::PARM_2 p2, typename outgoing_type::PARM_3 p3, typename outgoing_type::PARM_4 p4, typename outgoing_type::PARM_5 p5, typename outgoing_type::PARM_6 p6, typename outgoing_type::PARM_7 p7, typename outgoing_type::PARM_8 p8, typename outgoing_type::PARM_9 p9, typename outgoing_type::PARM_10 p10, typename outgoing_type::PARM_11 p11, typename outgoing_type::PARM_12 p12, typename outgoing_type::PARM_13 p13, typename outgoing_type::PARM_14 p14, typename outgoing_type::PARM_15 p15, typename outgoing_type::PARM_16 p16)
{
fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16);
}
};
COMET_CLOSE_PARTIAL()
/** Constructs a functor that calls a function with an extra parameter (at the
* beginning) of type \p T. This gets called with the value \p bound.
* \relates binder
*/
template<typename R, typename LIST, typename T>
functor<R, typename LIST::tail> bind_first( const functor<R, LIST>& fun, const T& bound)
{
return functor<R, COMET_STRICT_TYPENAME LIST::tail>(std::auto_ptr< functor<R, COMET_STRICT_TYPENAME LIST::tail>::IMPL >(new binder_first<R>COMET_PARTIAL_NS<LIST>(fun, bound)));
}
/** Chains \p fun1 to \p fun2.
* \return functor chaining \p fun1 to \p fun2
* \relates chainer
*/
template<typename R, typename LIST>
functor<R, LIST> chain( const functor<R, LIST>& fun1, const functor<R, LIST>& fun2)
{
return functor<R,LIST>(std::auto_ptr< functor<R, LIST>::IMPL >(new chainer<R COMET_PARTIAL_NS_1(LIST)(fun1, fun2)));
}
//@}
}
#endif