functor.h

Go to the documentation of this file.
00001 00009 /* 00010 * Copyright © 2001 Sofus Mortensen, Michael Geddes 00011 * 00012 * This material is provided "as is", with absolutely no warranty 00013 * expressed or implied. Any use is at your own risk. Permission to 00014 * use or copy this software for any purpose is hereby granted without 00015 * fee, provided the above notices are retained on all copies. 00016 * Permission to modify the code and to distribute modified code is 00017 * granted, provided the above notices are retained, and a notice that 00018 * the code was modified is included with the above copyright notice. 00019 * 00020 * This header is part of comet. 00021 * http://www.lambdasoft.dk/comet 00022 */ 00023 00024 #ifndef COMET_FUNCTOR_H 00025 #define COMET_FUNCTOR_H 00026 00027 #include <comet/config.h> 00028 #include <comet/typelist.h> 00029 #include <comet/type_traits.h> 00030 #include <memory> 00031 00032 namespace comet { 00036 00037 #ifdef COMET_PARTIAL_SPECIALISATION 00038 00039 namespace detail { 00040 00041 template<bool, typename T> struct parameter_type_aux 00042 { 00043 typedef const T& result; 00044 }; 00045 00046 template<typename T> struct parameter_type_aux<true,T> 00047 { 00048 typedef T result; 00049 }; 00050 00051 }; 00052 00057 template<typename T> struct parameter_type 00058 { 00059 enum { is_ref = type_traits::is_reference<T>::value }; 00061 typedef detail::parameter_type_aux< (is_ref!=0) ,T >::result result; 00062 }; 00063 #else // COMET_PARTIAL_SPECIALISATION 00064 namespace detail { 00065 00066 template<bool> struct parameter_type_aux 00067 { 00068 template<typename T> struct X 00069 { 00070 typedef const T& result; 00071 }; 00072 }; 00073 00074 template<> struct parameter_type_aux<true> 00075 { 00076 template<typename T> struct X 00077 { 00078 typedef T result; 00079 }; 00080 }; 00081 00082 }; 00083 00084 template<typename T> struct parameter_type 00085 { 00086 enum { is_ref = type_traits::is_reference<T>::value }; 00087 typedef detail::parameter_type_aux< (is_ref!=0) >::X<T>::result result; 00088 }; 00089 #endif // COMET_PARTIAL_SPECIALISATION 00090 00091 #ifndef COMET_PARTIAL_SPECIALISATION 00092 00093 #define COMET_PARTIAL_NAME( name ) X 00094 #define COMET_PARTIAL_NS ::X 00095 00096 #define COMET_DEFINE_PARTIAL( X1, X2 , name) \ 00097 template < X1 > struct name\ 00098 { \ 00099 template < X2 > class X 00100 00101 #define COMET_SPECIALISE_PARTIAL( SX1, X2 , name) \ 00102 template <> struct name<SX1>\ 00103 { \ 00104 template < X2 > class X 00105 00106 #define COMET_DEFINE_PARTIAL2( X1, X2, X3 , name) \ 00107 template < X1 > struct name\ 00108 { \ 00109 template < X2, X3 > class X 00110 00111 #define COMET_SPECIALISE_PARTIAL2( SX1, X2, X3 , name) \ 00112 template <> struct name<SX1>\ 00113 { \ 00114 template < X2, X3 > class X 00115 00116 #define COMET_DEFINE_PARTIAL3( X1, X2, X3, X4 , name) \ 00117 template < X1 > struct name\ 00118 { \ 00119 template < X2, X3, X4 > class X 00120 00121 #define COMET_SPECIALISE_PARTIAL3( SX1, X2, X3, X4 , name) \ 00122 template <> struct name<SX1>\ 00123 { \ 00124 template < X2, X3, X4 > class X 00125 00126 00127 #define COMET_CLOSE_PARTIAL() }; 00128 00129 #else 00130 00131 #define COMET_PARTIAL_NAME( name ) name 00132 #define COMET_PARTIAL_NS 00133 00134 #define COMET_CLOSE_PARTIAL() 00135 00136 #define COMET_PARTIAL_CONSTRUCTOR( name ) name 00137 00138 #define COMET_DEFINE_PARTIAL( X1, X2 , name) \ 00139 template < X1, X2 > class name 00140 00141 #define COMET_SPECIALISE_PARTIAL( SX1, X2 , name) \ 00142 template < X2 > class name<SX1> 00143 00144 #define COMET_DEFINE_PARTIAL2( X1, X2, X3 , name) \ 00145 template < X1, X2, X3 > class name 00146 00147 #define COMET_SPECIALISE_PARTIAL2( SX1, X2, X3 , name) \ 00148 template < X2, X3 > class name<SX1> 00149 00150 #define COMET_DEFINE_PARTIAL3( X1, X2, X3, X4 , name) \ 00151 template < X1, X2, X3 > class name 00152 00153 #define COMET_SPECIALISE_PARTIAL3( SX1, X2, X3, X4 , name) \ 00154 template < X2, X3, X4 > class name<SX1> 00155 00156 #endif 00157 00164 template<typename LIST> struct parameter_types 00165 { 00166 typedef parameter_type< typelist::type_at<LIST, 0>::result >::result PARM_1; 00167 typedef parameter_type< typelist::type_at<LIST, 1>::result >::result PARM_2; 00168 typedef parameter_type< typelist::type_at<LIST, 2>::result >::result PARM_3; 00169 typedef parameter_type< typelist::type_at<LIST, 3>::result >::result PARM_4; 00170 typedef parameter_type< typelist::type_at<LIST, 4>::result >::result PARM_5; 00171 typedef parameter_type< typelist::type_at<LIST, 5>::result >::result PARM_6; 00172 typedef parameter_type< typelist::type_at<LIST, 6>::result >::result PARM_7; 00173 typedef parameter_type< typelist::type_at<LIST, 7>::result >::result PARM_8; 00174 typedef parameter_type< typelist::type_at<LIST, 8>::result >::result PARM_9; 00175 typedef parameter_type< typelist::type_at<LIST, 9>::result >::result PARM_10; 00176 typedef parameter_type< typelist::type_at<LIST, 10>::result >::result PARM_11; 00177 typedef parameter_type< typelist::type_at<LIST, 11>::result >::result PARM_12; 00178 typedef parameter_type< typelist::type_at<LIST, 12>::result >::result PARM_13; 00179 typedef parameter_type< typelist::type_at<LIST, 13>::result >::result PARM_14; 00180 typedef parameter_type< typelist::type_at<LIST, 14>::result >::result PARM_15; 00181 typedef parameter_type< typelist::type_at<LIST, 15>::result >::result PARM_16; 00182 }; 00183 00184 template<typename R, typename LIST> class functor_impl; 00185 00186 00194 COMET_DEFINE_PARTIAL2( int L, typename R, typename LIST, functor_impl_aux) : public parameter_types<LIST> 00195 { 00200 virtual R operator()( nil arguments ) = 0; 00201 00205 virtual functor_impl<R, LIST>* clone() const = 0; 00208 virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {} 00209 }; 00210 COMET_CLOSE_PARTIAL() 00211 00212 COMET_SPECIALISE_PARTIAL2( 0, typename R, typename LIST, functor_impl_aux) : public parameter_types<LIST> 00213 { 00214 public: 00215 virtual R operator()( ) = 0; 00216 virtual functor_impl<R, LIST>* clone() const = 0; 00217 virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {} 00218 }; 00219 COMET_CLOSE_PARTIAL() 00220 00221 COMET_SPECIALISE_PARTIAL2(1, typename R, typename LIST, functor_impl_aux) : public parameter_types<LIST> 00222 { 00223 public: 00224 virtual R operator()( PARM_1 ) = 0; 00225 virtual functor_impl<R, LIST>* clone() const = 0; 00226 virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {} 00227 }; 00228 COMET_CLOSE_PARTIAL() 00229 00230 COMET_SPECIALISE_PARTIAL2(2, typename R, typename LIST, functor_impl_aux) : public parameter_types<LIST> 00231 { 00232 public: 00233 virtual R operator()( PARM_1, PARM_2 ) = 0; 00234 virtual functor_impl<R, LIST>* clone() const = 0; 00235 virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {} 00236 }; 00237 COMET_CLOSE_PARTIAL() 00238 00239 COMET_SPECIALISE_PARTIAL2(3, typename R, typename LIST, functor_impl_aux) : public parameter_types<LIST> 00240 { 00241 public: 00242 virtual R operator()( PARM_1, PARM_2, PARM_3 ) = 0; 00243 virtual functor_impl<R, LIST>* clone() const = 0; 00244 virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {} 00245 }; 00246 COMET_CLOSE_PARTIAL() 00247 00248 COMET_SPECIALISE_PARTIAL2(4, typename R, typename LIST, functor_impl_aux) : public parameter_types<LIST> 00249 { 00250 public: 00251 virtual R operator()( PARM_1, PARM_2, PARM_3, PARM_4 ) = 0; 00252 virtual functor_impl<R, LIST>* clone() const = 0; 00253 virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {} 00254 }; 00255 COMET_CLOSE_PARTIAL() 00256 00257 COMET_SPECIALISE_PARTIAL2(5, typename R, typename LIST, functor_impl_aux) : public parameter_types<LIST> 00258 { 00259 public: 00260 virtual R operator()( PARM_1, PARM_2, PARM_3, PARM_4, PARM_5 ) = 0; 00261 virtual functor_impl<R, LIST>* clone() const = 0; 00262 virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {} 00263 }; 00264 COMET_CLOSE_PARTIAL() 00265 00266 COMET_SPECIALISE_PARTIAL2(6, typename R, typename LIST, functor_impl_aux) : public parameter_types<LIST> 00267 { 00268 public: 00269 virtual R operator()( PARM_1, PARM_2, PARM_3, PARM_4, PARM_5, PARM_6 ) = 0; 00270 virtual functor_impl<R, LIST>* clone() const = 0; 00271 virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {} 00272 }; 00273 COMET_CLOSE_PARTIAL() 00274 00275 COMET_SPECIALISE_PARTIAL2(7, typename R, typename LIST, functor_impl_aux) : public parameter_types<LIST> 00276 { 00277 public: 00278 virtual R operator()( PARM_1, PARM_2, PARM_3, PARM_4, PARM_5, PARM_6, PARM_7 ) = 0; 00279 virtual functor_impl<R, LIST>* clone() const = 0; 00280 virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {} 00281 }; 00282 COMET_CLOSE_PARTIAL() 00283 00284 COMET_SPECIALISE_PARTIAL2(8, typename R, typename LIST, functor_impl_aux) : public parameter_types<LIST> 00285 { 00286 public: 00287 virtual R operator()( PARM_1, PARM_2, PARM_3, PARM_4, PARM_5, PARM_6, PARM_7, PARM_8 ) = 0; 00288 virtual functor_impl<R, LIST>* clone() const = 0; 00289 virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {} 00290 }; 00291 COMET_CLOSE_PARTIAL() 00292 00293 COMET_SPECIALISE_PARTIAL2(9, typename R, typename LIST, functor_impl_aux) : public parameter_types<LIST> 00294 { 00295 public: 00296 virtual R operator()( PARM_1, PARM_2, PARM_3, PARM_4, PARM_5, PARM_6, PARM_7, PARM_8, PARM_9 ) = 0; 00297 virtual functor_impl<R, LIST>* clone() const = 0; 00298 virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {} 00299 }; 00300 COMET_CLOSE_PARTIAL() 00301 00302 COMET_SPECIALISE_PARTIAL2(10, typename R, typename LIST, functor_impl_aux) : public parameter_types<LIST> 00303 { 00304 public: 00305 virtual R operator()( PARM_1, PARM_2, PARM_3, PARM_4, PARM_5, PARM_6, PARM_7, PARM_8, PARM_9, PARM_10 ) = 0; 00306 virtual functor_impl<R, LIST>* clone() const = 0; 00307 virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {} 00308 }; 00309 COMET_CLOSE_PARTIAL() 00310 00311 COMET_SPECIALISE_PARTIAL2(11, typename R, typename LIST, functor_impl_aux) : public parameter_types<LIST> 00312 { 00313 public: 00314 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; 00315 virtual functor_impl<R, LIST>* clone() const = 0; 00316 virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {} 00317 }; 00318 COMET_CLOSE_PARTIAL() 00319 00320 COMET_SPECIALISE_PARTIAL2(12, typename R, typename LIST, functor_impl_aux) : public parameter_types<LIST> 00321 { 00322 public: 00323 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; 00324 virtual functor_impl<R, LIST>* clone() const = 0; 00325 virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {} 00326 }; 00327 COMET_CLOSE_PARTIAL() 00328 00329 COMET_SPECIALISE_PARTIAL2(13, typename R, typename LIST, functor_impl_aux) : public parameter_types<LIST> 00330 { 00331 public: 00332 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; 00333 virtual functor_impl<R, LIST>* clone() const = 0; 00334 virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {} 00335 }; 00336 COMET_CLOSE_PARTIAL() 00337 00338 COMET_SPECIALISE_PARTIAL2(14, typename R, typename LIST, functor_impl_aux) : public parameter_types<LIST> 00339 { 00340 public: 00341 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; 00342 virtual functor_impl<R, LIST>* clone() const = 0; 00343 virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {} 00344 }; 00345 COMET_CLOSE_PARTIAL() 00346 00347 COMET_SPECIALISE_PARTIAL2(15, typename R, typename LIST, functor_impl_aux) : public parameter_types<LIST> 00348 { 00349 public: 00350 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; 00351 virtual functor_impl<R, LIST>* clone() const = 0; 00352 virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {} 00353 }; 00354 COMET_CLOSE_PARTIAL() 00355 00356 COMET_SPECIALISE_PARTIAL2(16, typename R, typename LIST, functor_impl_aux) : public parameter_types<LIST> 00357 { 00358 public: 00359 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; 00360 virtual functor_impl<R, LIST>* clone() const = 0; 00361 virtual ~COMET_PARTIAL_NAME(functor_impl_aux)() {} 00362 }; 00363 COMET_CLOSE_PARTIAL() 00364 00365 00366 00370 COMET_DEFINE_PARTIAL2(typename RT, typename PF, typename FUN, functor_handler) 00371 : public functor_impl< typename PF::result_type, typename PF::parm_list > 00372 { 00373 public: 00374 typedef typename PF::result_type result_type; 00375 00376 COMET_PARTIAL_NAME(functor_handler)(const FUN& fun) : fun_(fun) {} 00377 functor_impl< typename PF::result_type, typename PF::parm_list >* clone() const 00378 { return new COMET_PARTIAL_NAME(functor_handler)(*this); } 00379 00380 result_type operator()( ) 00381 { return fun_( ); } 00382 00383 result_type operator()( typename PF::PARM_1 p1 ) 00384 { return fun_( p1 ); } 00385 00386 result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2 ) 00387 { return fun_( p1, p2 ); } 00388 00389 result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3 ) 00390 { return fun_( p1, p2, p3 ); } 00391 00392 result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4 ) 00393 { return fun_( p1, p2, p3, p4 ); } 00394 00395 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 ) 00396 { return fun_( p1, p2, p3, p4, p5 ); } 00397 00398 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 ) 00399 { return fun_( p1, p2, p3, p4, p5, p6 ); } 00400 00401 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 ) 00402 { return fun_( p1, p2, p3, p4, p5, p6, p7 ); } 00403 00404 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 ) 00405 { return fun_( p1, p2, p3, p4, p5, p6, p7, p8 ); } 00406 00407 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 ) 00408 { return fun_( p1, p2, p3, p4, p5, p6, p7, p8, p9 ); } 00409 00410 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 ) 00411 { return fun_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 ); } 00412 00413 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 ) 00414 { return fun_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11 ); } 00415 00416 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 ) 00417 { return fun_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12 ); } 00418 00419 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 ) 00420 { return fun_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13 ); } 00421 00422 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 ) 00423 { return fun_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14 ); } 00424 00425 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 ) 00426 { return fun_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15 ); } 00427 00428 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 ) 00429 { return fun_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16 ); } 00430 00431 private: 00432 FUN fun_; 00433 00434 }; 00435 COMET_CLOSE_PARTIAL() 00436 00437 COMET_SPECIALISE_PARTIAL2( void, typename PF, typename FUN , functor_handler) 00438 : public functor_impl< typename PF::result_type, typename PF::parm_list > 00439 { 00440 public: 00441 typedef typename PF::result_type result_type; 00442 00443 COMET_PARTIAL_NAME(functor_handler)(const FUN& fun) : fun_(fun) {} 00444 00445 functor_impl< typename PF::result_type, typename PF::parm_list >* clone() const 00446 { return new COMET_PARTIAL_NAME(functor_handler)(*this); } 00447 result_type operator()( ) 00448 { fun_( ); } 00449 00450 result_type operator()( typename PF::PARM_1 p1 ) 00451 { fun_( p1 ); } 00452 00453 result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2 ) 00454 { fun_( p1, p2 ); } 00455 00456 result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3 ) 00457 { fun_( p1, p2, p3 ); } 00458 00459 result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4 ) 00460 { fun_( p1, p2, p3, p4 ); } 00461 00462 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 ) 00463 { fun_( p1, p2, p3, p4, p5 ); } 00464 00465 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 ) 00466 { fun_( p1, p2, p3, p4, p5, p6 ); } 00467 00468 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 ) 00469 { fun_( p1, p2, p3, p4, p5, p6, p7 ); } 00470 00471 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 ) 00472 { fun_( p1, p2, p3, p4, p5, p6, p7, p8 ); } 00473 00474 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 ) 00475 { fun_( p1, p2, p3, p4, p5, p6, p7, p8, p9 ); } 00476 00477 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 ) 00478 { fun_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 ); } 00479 00480 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 ) 00481 { fun_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11 ); } 00482 00483 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 ) 00484 { fun_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12 ); } 00485 00486 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 ) 00487 { fun_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13 ); } 00488 00489 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 ) 00490 { fun_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14 ); } 00491 00492 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 ) 00493 { fun_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15 ); } 00494 00495 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 ) 00496 { fun_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16 ); } 00497 00498 00499 private: 00500 FUN fun_; 00501 00502 }; 00503 COMET_CLOSE_PARTIAL() 00504 00505 00514 COMET_DEFINE_PARTIAL3(typename RT,typename PF, typename OBJ_PTR, typename MEMFN_PTR , memfun_handler) 00515 : public functor_impl<typename PF::result_type,typename PF::parm_list > 00516 { 00517 private: 00518 OBJ_PTR obj_; 00519 MEMFN_PTR memfn_; 00520 00521 public: 00522 typedef typename PF::result_type result_type; 00523 00524 COMET_PARTIAL_NAME(memfun_handler)(const OBJ_PTR& obj, MEMFN_PTR memfn) : obj_(obj), memfn_(memfn) {} 00525 00526 functor_impl<typename PF::result_type,typename PF::parm_list >* clone() const 00527 { return new COMET_PARTIAL_NAME(memfun_handler)(*this); } 00528 00529 result_type operator()( ) 00530 { return ((*obj_).*memfn_)( ); } 00531 00532 result_type operator()( typename PF::PARM_1 p1 ) 00533 { return ((*obj_).*memfn_)( p1 ); } 00534 00535 result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2 ) 00536 { return ((*obj_).*memfn_)( p1, p2 ); } 00537 00538 result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3 ) 00539 { return ((*obj_).*memfn_)( p1, p2, p3 ); } 00540 00541 result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4 ) 00542 { return ((*obj_).*memfn_)( p1, p2, p3, p4 ); } 00543 00544 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 ) 00545 { return ((*obj_).*memfn_)( p1, p2, p3, p4, p5 ); } 00546 00547 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 ) 00548 { return ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6 ); } 00549 00550 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 ) 00551 { return ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7 ); } 00552 00553 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 ) 00554 { return ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8 ); } 00555 00556 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 ) 00557 { return ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8, p9 ); } 00558 00559 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 ) 00560 { return ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 ); } 00561 00562 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 ) 00563 { return ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11 ); } 00564 00565 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 ) 00566 { return ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12 ); } 00567 00568 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 ) 00569 { return ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13 ); } 00570 00571 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 ) 00572 { return ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14 ); } 00573 00574 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 ) 00575 { return ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15 ); } 00576 00577 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 ) 00578 { return ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16 ); } 00579 00580 }; 00581 COMET_CLOSE_PARTIAL() 00582 00583 COMET_SPECIALISE_PARTIAL3( void, typename PF, typename OBJ_PTR, typename MEMFN_PTR , memfun_handler) 00584 : public functor_impl<typename PF::result_type,typename PF::parm_list > 00585 { 00586 public: 00587 typedef typename PF::result_type result_type; 00588 00589 COMET_PARTIAL_NAME(memfun_handler)(const OBJ_PTR& obj, MEMFN_PTR memfn) : obj_(obj), memfn_(memfn) {} 00590 00591 functor_impl<typename PF::result_type,typename PF::parm_list >* clone() const 00592 { return new COMET_PARTIAL_NAME(memfun_handler)(*this); } 00593 00594 result_type operator()( ) 00595 { ((*obj_).*memfn_)( ); } 00596 00597 result_type operator()( typename PF::PARM_1 p1 ) 00598 { ((*obj_).*memfn_)( p1 ); } 00599 00600 result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2 ) 00601 { ((*obj_).*memfn_)( p1, p2 ); } 00602 00603 result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3 ) 00604 { ((*obj_).*memfn_)( p1, p2, p3 ); } 00605 00606 result_type operator()( typename PF::PARM_1 p1, typename PF::PARM_2 p2, typename PF::PARM_3 p3, typename PF::PARM_4 p4 ) 00607 { ((*obj_).*memfn_)( p1, p2, p3, p4 ); } 00608 00609 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 ) 00610 { ((*obj_).*memfn_)( p1, p2, p3, p4, p5 ); } 00611 00612 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 ) 00613 { ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6 ); } 00614 00615 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 ) 00616 { ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7 ); } 00617 00618 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 ) 00619 { ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8 ); } 00620 00621 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 ) 00622 { ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8, p9 ); } 00623 00624 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 ) 00625 { ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 ); } 00626 00627 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 ) 00628 { ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11 ); } 00629 00630 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 ) 00631 { ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12 ); } 00632 00633 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 ) 00634 { ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13 ); } 00635 00636 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 ) 00637 { ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14 ); } 00638 00639 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 ) 00640 { ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15 ); } 00641 00642 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 ) 00643 { ((*obj_).*memfn_)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16 ); } 00644 00645 private: 00646 OBJ_PTR obj_; 00647 MEMFN_PTR memfn_; 00648 }; 00649 COMET_CLOSE_PARTIAL() 00650 00651 00656 template<typename R, typename LIST> 00657 class ATL_NO_VTABLE functor_impl : public functor_impl_aux< typelist::length<LIST>::value >COMET_PARTIAL_NS<R,LIST> 00658 {}; 00659 00660 template<typename R, typename LIST> class functor; 00661 00668 COMET_DEFINE_PARTIAL( typename R,typename LIST, functor_operators ) : public parameter_types<LIST> 00669 { 00670 typedef functor<R, LIST> BASE; 00671 public: 00672 R operator()( ) 00673 { return (*(static_cast<BASE*>(this)->impl()))( ); } 00674 00675 R operator()( PARM_1 p1 ) 00676 { return (*(static_cast<BASE*>(this)->impl()))( p1 ); } 00677 00678 R operator()( PARM_1 p1, PARM_2 p2 ) 00679 { return (*(static_cast<BASE*>(this)->impl()))( p1, p2 ); } 00680 00681 R operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3 ) 00682 { return (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3 ); } 00683 00684 R operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3, PARM_4 p4 ) 00685 { return (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4 ); } 00686 00687 R operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3, PARM_4 p4, PARM_5 p5 ) 00688 { return (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5 ); } 00689 00690 R operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3, PARM_4 p4, PARM_5 p5, PARM_6 p6 ) 00691 { return (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6 ); } 00692 00693 R operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3, PARM_4 p4, PARM_5 p5, PARM_6 p6, PARM_7 p7 ) 00694 { return (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7 ); } 00695 00696 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 ) 00697 { return (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8 ); } 00698 00699 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 ) 00700 { return (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8, p9 ); } 00701 00702 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 ) 00703 { return (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 ); } 00704 00705 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 ) 00706 { return (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11 ); } 00707 00708 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 ) 00709 { return (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12 ); } 00710 00711 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 ) 00712 { return (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13 ); } 00713 00714 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 ) 00715 { return (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14 ); } 00716 00717 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 ) 00718 { return (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15 ); } 00719 00720 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 ) 00721 { return (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16 ); } 00722 00723 }; 00724 COMET_CLOSE_PARTIAL() 00725 00726 COMET_SPECIALISE_PARTIAL( void, typename LIST , functor_operators) 00727 : public parameter_types<LIST> 00728 { 00729 typedef functor<void, LIST> BASE; 00730 public: 00731 00732 void operator()( ) 00733 { (*(static_cast<BASE*>(this)->impl()))( ); } 00734 00735 void operator()( PARM_1 p1 ) 00736 { (*(static_cast<BASE*>(this)->impl()))( p1 ); } 00737 00738 void operator()( PARM_1 p1, PARM_2 p2 ) 00739 { (*(static_cast<BASE*>(this)->impl()))( p1, p2 ); } 00740 00741 void operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3 ) 00742 { (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3 ); } 00743 00744 void operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3, PARM_4 p4 ) 00745 { (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4 ); } 00746 00747 void operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3, PARM_4 p4, PARM_5 p5 ) 00748 { (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5 ); } 00749 00750 void operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3, PARM_4 p4, PARM_5 p5, PARM_6 p6 ) 00751 { (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6 ); } 00752 00753 void operator()( PARM_1 p1, PARM_2 p2, PARM_3 p3, PARM_4 p4, PARM_5 p5, PARM_6 p6, PARM_7 p7 ) 00754 { (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7 ); } 00755 00756 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 ) 00757 { (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8 ); } 00758 00759 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 ) 00760 { (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8, p9 ); } 00761 00762 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 ) 00763 { (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 ); } 00764 00765 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 ) 00766 { (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11 ); } 00767 00768 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 ) 00769 { (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12 ); } 00770 00771 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 ) 00772 { (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13 ); } 00773 00774 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 ) 00775 { (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14 ); } 00776 00777 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 ) 00778 { (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15 ); } 00779 00780 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 ) 00781 { (*(static_cast<BASE*>(this)->impl()))( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16 ); } 00782 00783 }; 00784 COMET_CLOSE_PARTIAL() 00785 00786 00791 template<typename R, typename LIST = nil> class functor : public functor_operators<R>COMET_PARTIAL_NS<LIST> 00792 { 00793 public: 00794 typedef functor_impl<R, LIST> IMPL; 00795 00796 typedef R result_type; 00797 typedef LIST parm_list; 00798 00799 functor() {}; 00800 functor(const functor<R, LIST>& f) : impl_((f.impl_.get()== NULL) ? NULL: f.impl_->clone()) {} 00801 explicit functor(std::auto_ptr< IMPL > impl) : impl_(impl) {} 00802 00803 template<typename FUN> explicit functor(int, FUN fun) : impl_(new functor_handler<R>COMET_PARTIAL_NS<functor<R, LIST>, FUN>(fun)) 00804 {} 00805 00806 template<typename OBJ_PTR, typename MEMFN_PTR> functor(int, const OBJ_PTR& obj, MEMFN_PTR memfn) 00807 : impl_(new memfun_handler<R>COMET_PARTIAL_NS<functor<R, LIST>, OBJ_PTR, MEMFN_PTR>(obj, memfn)) 00808 {} 00809 00810 functor& operator=(const functor& rhs) 00811 { 00812 std::auto_ptr<IMPL> tmp((rhs.impl_.get() == NULL)? NULL: rhs.impl_->clone()); 00813 impl_ = tmp; 00814 return *this; 00815 } 00816 00817 std::auto_ptr<IMPL> &impl(){return impl_;} 00818 00819 bool is_null() const { return impl_.get() == NULL; } 00820 protected: 00821 std::auto_ptr<IMPL> impl_; 00822 }; 00823 00830 COMET_DEFINE_PARTIAL(typename R, typename LIST, chainer) : public functor_impl<R, LIST> 00831 { 00832 private: 00833 typedef functor<R, LIST> FUN; 00834 00835 FUN fun1_; 00836 FUN fun2_; 00837 00838 00839 public: 00840 COMET_PARTIAL_NAME(chainer)(const FUN& fun1, const FUN& fun2) : fun1_(fun1), fun2_(fun2) 00841 {} 00842 00843 COMET_PARTIAL_NAME(chainer)(const COMET_PARTIAL_NAME(chainer)& x) : fun1_(x.fun1_), fun2_(x.fun2_) 00844 {} 00845 00846 functor_impl<R, LIST>* clone() const 00847 { return new COMET_PARTIAL_NAME(chainer)(*this); } 00848 00849 R operator()( ) 00850 { 00851 fun1_( ); 00852 return fun2_( ); 00853 } 00854 00855 R operator()( FUN::PARM_1 p1 ) 00856 { 00857 fun1_( p1 ); 00858 return fun2_( p1 ); 00859 } 00860 00861 R operator()( FUN::PARM_1 p1, FUN::PARM_2 p2 ) 00862 { 00863 fun1_( p1, p2 ); 00864 return fun2_( p1, p2 ); 00865 } 00866 00867 R operator()( FUN::PARM_1 p1, FUN::PARM_2 p2, FUN::PARM_3 p3 ) 00868 { 00869 fun1_( p1, p2, p3 ); 00870 return fun2_( p1, p2, p3 ); 00871 } 00872 00873 R operator()( FUN::PARM_1 p1, FUN::PARM_2 p2, FUN::PARM_3 p3, FUN::PARM_4 p4 ) 00874 { 00875 fun1_( p1, p2, p3, p4 ); 00876 return fun2_( p1, p2, p3, p4 ); 00877 } 00878 00879 R operator()( FUN::PARM_1 p1, FUN::PARM_2 p2, FUN::PARM_3 p3, FUN::PARM_4 p4, FUN::PARM_5 p5 ) 00880 { 00881 fun1_( p1, p2, p3, p4, p5 ); 00882 return fun2_( p1, p2, p3, p4, p5 ); 00883 } 00884 00885 R operator()( FUN::PARM_1 p1, FUN::PARM_2 p2, FUN::PARM_3 p3, FUN::PARM_4 p4, FUN::PARM_5 p5, FUN::PARM_6 p6 ) 00886 { 00887 fun1_( p1, p2, p3, p4, p5, p6 ); 00888 return fun2_( p1, p2, p3, p4, p5, p6 ); 00889 } 00890 00891 R operator()( FUN::PARM_1 p1, FUN::PARM_2 p2, FUN::PARM_3 p3, FUN::PARM_4 p4, FUN::PARM_5 p5, FUN::PARM_6 p6, FUN::PARM_7 p7 ) 00892 { 00893 fun1_( p1, p2, p3, p4, p5, p6, p7 ); 00894 return fun2_( p1, p2, p3, p4, p5, p6, p7 ); 00895 } 00896 00897 R operator()( FUN::PARM_1 p1, FUN::PARM_2 p2, FUN::PARM_3 p3, FUN::PARM_4 p4, FUN::PARM_5 p5, FUN::PARM_6 p6, FUN::PARM_7 p7, FUN::PARM_8 p8 ) 00898 { 00899 fun1_( p1, p2, p3, p4, p5, p6, p7, p8 ); 00900 return fun2_( p1, p2, p3, p4, p5, p6, p7, p8 ); 00901 } 00902 00903 R operator()( FUN::PARM_1 p1, FUN::PARM_2 p2, FUN::PARM_3 p3, FUN::PARM_4 p4, FUN::PARM_5 p5, FUN::PARM_6 p6, FUN::PARM_7 p7, FUN::PARM_8 p8, FUN::PARM_9 p9 ) 00904 { 00905 fun1_( p1, p2, p3, p4, p5, p6, p7, p8, p9 ); 00906 return fun2_( p1, p2, p3, p4, p5, p6, p7, p8, p9 ); 00907 } 00908 00909 R operator()( FUN::PARM_1 p1, FUN::PARM_2 p2, FUN::PARM_3 p3, FUN::PARM_4 p4, FUN::PARM_5 p5, FUN::PARM_6 p6, FUN::PARM_7 p7, FUN::PARM_8 p8, FUN::PARM_9 p9, FUN::PARM_10 p10 ) 00910 { 00911 fun1_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 ); 00912 return fun2_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 ); 00913 } 00914 00915 R operator()( FUN::PARM_1 p1, FUN::PARM_2 p2, FUN::PARM_3 p3, FUN::PARM_4 p4, FUN::PARM_5 p5, FUN::PARM_6 p6, FUN::PARM_7 p7, FUN::PARM_8 p8, FUN::PARM_9 p9, FUN::PARM_10 p10, FUN::PARM_11 p11 ) 00916 { 00917 fun1_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11 ); 00918 return fun2_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11 ); 00919 } 00920 00921 R operator()( FUN::PARM_1 p1, FUN::PARM_2 p2, FUN::PARM_3 p3, FUN::PARM_4 p4, FUN::PARM_5 p5, FUN::PARM_6 p6, FUN::PARM_7 p7, FUN::PARM_8 p8, FUN::PARM_9 p9, FUN::PARM_10 p10, FUN::PARM_11 p11, FUN::PARM_12 p12 ) 00922 { 00923 fun1_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12 ); 00924 return fun2_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12 ); 00925 } 00926 00927 R operator()( FUN::PARM_1 p1, FUN::PARM_2 p2, FUN::PARM_3 p3, FUN::PARM_4 p4, FUN::PARM_5 p5, FUN::PARM_6 p6, FUN::PARM_7 p7, FUN::PARM_8 p8, FUN::PARM_9 p9, FUN::PARM_10 p10, FUN::PARM_11 p11, FUN::PARM_12 p12, FUN::PARM_13 p13 ) 00928 { 00929 fun1_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13 ); 00930 return fun2_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13 ); 00931 } 00932 00933 R operator()( FUN::PARM_1 p1, FUN::PARM_2 p2, FUN::PARM_3 p3, FUN::PARM_4 p4, FUN::PARM_5 p5, FUN::PARM_6 p6, FUN::PARM_7 p7, FUN::PARM_8 p8, FUN::PARM_9 p9, FUN::PARM_10 p10, FUN::PARM_11 p11, FUN::PARM_12 p12, FUN::PARM_13 p13, FUN::PARM_14 p14 ) 00934 { 00935 fun1_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14 ); 00936 return fun2_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14 ); 00937 } 00938 00939 R operator()( FUN::PARM_1 p1, FUN::PARM_2 p2, FUN::PARM_3 p3, FUN::PARM_4 p4, FUN::PARM_5 p5, FUN::PARM_6 p6, FUN::PARM_7 p7, FUN::PARM_8 p8, FUN::PARM_9 p9, FUN::PARM_10 p10, FUN::PARM_11 p11, FUN::PARM_12 p12, FUN::PARM_13 p13, FUN::PARM_14 p14, FUN::PARM_15 p15 ) 00940 { 00941 fun1_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15 ); 00942 return fun2_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15 ); 00943 } 00944 00945 R operator()( FUN::PARM_1 p1, FUN::PARM_2 p2, FUN::PARM_3 p3, FUN::PARM_4 p4, FUN::PARM_5 p5, FUN::PARM_6 p6, FUN::PARM_7 p7, FUN::PARM_8 p8, FUN::PARM_9 p9, FUN::PARM_10 p10, FUN::PARM_11 p11, FUN::PARM_12 p12, FUN::PARM_13 p13, FUN::PARM_14 p14, FUN::PARM_15 p15, FUN::PARM_16 p16 ) 00946 { 00947 fun1_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16 ); 00948 return fun2_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16 ); 00949 } 00950 00951 00952 }; 00953 COMET_CLOSE_PARTIAL() 00954 00955 00957 COMET_SPECIALISE_PARTIAL( void, typename LIST , chainer ) 00958 : public functor_impl<void, LIST> 00959 { 00960 private: 00961 typedef functor<void, LIST> FUN; 00962 00963 FUN fun1_; 00964 FUN fun2_; 00965 00966 00967 public: 00968 COMET_PARTIAL_NAME(chainer)(const FUN& fun1, const FUN& fun2) : fun1_(fun1), fun2_(fun2) 00969 {} 00970 00971 COMET_PARTIAL_NAME(chainer)(const COMET_PARTIAL_NAME(chainer)& x) : fun1_(x.fun1_), fun2_(x.fun2_) 00972 {} 00973 00974 functor_impl<void, LIST>* clone() const 00975 { return new COMET_PARTIAL_NAME(chainer)(*this); } 00976 00977 void operator()( ) 00978 { 00979 fun1_( ); 00980 fun2_( ); 00981 } 00982 00983 void operator()( FUN::PARM_1 p1 ) 00984 { 00985 fun1_( p1 ); 00986 fun2_( p1 ); 00987 } 00988 00989 void operator()( FUN::PARM_1 p1, FUN::PARM_2 p2 ) 00990 { 00991 fun1_( p1, p2 ); 00992 fun2_( p1, p2 ); 00993 } 00994 00995 void operator()( FUN::PARM_1 p1, FUN::PARM_2 p2, FUN::PARM_3 p3 ) 00996 { 00997 fun1_( p1, p2, p3 ); 00998 fun2_( p1, p2, p3 ); 00999 } 01000 01001 void operator()( FUN::PARM_1 p1, FUN::PARM_2 p2, FUN::PARM_3 p3, FUN::PARM_4 p4 ) 01002 { 01003 fun1_( p1, p2, p3, p4 ); 01004 fun2_( p1, p2, p3, p4 ); 01005 } 01006 01007 void operator()( FUN::PARM_1 p1, FUN::PARM_2 p2, FUN::PARM_3 p3, FUN::PARM_4 p4, FUN::PARM_5 p5 ) 01008 { 01009 fun1_( p1, p2, p3, p4, p5 ); 01010 fun2_( p1, p2, p3, p4, p5 ); 01011 } 01012 01013 void operator()( FUN::PARM_1 p1, FUN::PARM_2 p2, FUN::PARM_3 p3, FUN::PARM_4 p4, FUN::PARM_5 p5, FUN::PARM_6 p6 ) 01014 { 01015 fun1_( p1, p2, p3, p4, p5, p6 ); 01016 fun2_( p1, p2, p3, p4, p5, p6 ); 01017 } 01018 01019 void operator()( FUN::PARM_1 p1, FUN::PARM_2 p2, FUN::PARM_3 p3, FUN::PARM_4 p4, FUN::PARM_5 p5, FUN::PARM_6 p6, FUN::PARM_7 p7 ) 01020 { 01021 fun1_( p1, p2, p3, p4, p5, p6, p7 ); 01022 fun2_( p1, p2, p3, p4, p5, p6, p7 ); 01023 } 01024 01025 void operator()( FUN::PARM_1 p1, FUN::PARM_2 p2, FUN::PARM_3 p3, FUN::PARM_4 p4, FUN::PARM_5 p5, FUN::PARM_6 p6, FUN::PARM_7 p7, FUN::PARM_8 p8 ) 01026 { 01027 fun1_( p1, p2, p3, p4, p5, p6, p7, p8 ); 01028 fun2_( p1, p2, p3, p4, p5, p6, p7, p8 ); 01029 } 01030 01031 void operator()( FUN::PARM_1 p1, FUN::PARM_2 p2, FUN::PARM_3 p3, FUN::PARM_4 p4, FUN::PARM_5 p5, FUN::PARM_6 p6, FUN::PARM_7 p7, FUN::PARM_8 p8, FUN::PARM_9 p9 ) 01032 { 01033 fun1_( p1, p2, p3, p4, p5, p6, p7, p8, p9 ); 01034 fun2_( p1, p2, p3, p4, p5, p6, p7, p8, p9 ); 01035 } 01036 01037 void operator()( FUN::PARM_1 p1, FUN::PARM_2 p2, FUN::PARM_3 p3, FUN::PARM_4 p4, FUN::PARM_5 p5, FUN::PARM_6 p6, FUN::PARM_7 p7, FUN::PARM_8 p8, FUN::PARM_9 p9, FUN::PARM_10 p10 ) 01038 { 01039 fun1_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 ); 01040 fun2_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 ); 01041 } 01042 01043 void operator()( FUN::PARM_1 p1, FUN::PARM_2 p2, FUN::PARM_3 p3, FUN::PARM_4 p4, FUN::PARM_5 p5, FUN::PARM_6 p6, FUN::PARM_7 p7, FUN::PARM_8 p8, FUN::PARM_9 p9, FUN::PARM_10 p10, FUN::PARM_11 p11 ) 01044 { 01045 fun1_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11 ); 01046 fun2_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11 ); 01047 } 01048 01049 void operator()( FUN::PARM_1 p1, FUN::PARM_2 p2, FUN::PARM_3 p3, FUN::PARM_4 p4, FUN::PARM_5 p5, FUN::PARM_6 p6, FUN::PARM_7 p7, FUN::PARM_8 p8, FUN::PARM_9 p9, FUN::PARM_10 p10, FUN::PARM_11 p11, FUN::PARM_12 p12 ) 01050 { 01051 fun1_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12 ); 01052 fun2_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12 ); 01053 } 01054 01055 void operator()( FUN::PARM_1 p1, FUN::PARM_2 p2, FUN::PARM_3 p3, FUN::PARM_4 p4, FUN::PARM_5 p5, FUN::PARM_6 p6, FUN::PARM_7 p7, FUN::PARM_8 p8, FUN::PARM_9 p9, FUN::PARM_10 p10, FUN::PARM_11 p11, FUN::PARM_12 p12, FUN::PARM_13 p13 ) 01056 { 01057 fun1_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13 ); 01058 fun2_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13 ); 01059 } 01060 01061 void operator()( FUN::PARM_1 p1, FUN::PARM_2 p2, FUN::PARM_3 p3, FUN::PARM_4 p4, FUN::PARM_5 p5, FUN::PARM_6 p6, FUN::PARM_7 p7, FUN::PARM_8 p8, FUN::PARM_9 p9, FUN::PARM_10 p10, FUN::PARM_11 p11, FUN::PARM_12 p12, FUN::PARM_13 p13, FUN::PARM_14 p14 ) 01062 { 01063 fun1_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14 ); 01064 fun2_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14 ); 01065 } 01066 01067 void operator()( FUN::PARM_1 p1, FUN::PARM_2 p2, FUN::PARM_3 p3, FUN::PARM_4 p4, FUN::PARM_5 p5, FUN::PARM_6 p6, FUN::PARM_7 p7, FUN::PARM_8 p8, FUN::PARM_9 p9, FUN::PARM_10 p10, FUN::PARM_11 p11, FUN::PARM_12 p12, FUN::PARM_13 p13, FUN::PARM_14 p14, FUN::PARM_15 p15 ) 01068 { 01069 fun1_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15 ); 01070 fun2_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15 ); 01071 } 01072 01073 void operator()( FUN::PARM_1 p1, FUN::PARM_2 p2, FUN::PARM_3 p3, FUN::PARM_4 p4, FUN::PARM_5 p5, FUN::PARM_6 p6, FUN::PARM_7 p7, FUN::PARM_8 p8, FUN::PARM_9 p9, FUN::PARM_10 p10, FUN::PARM_11 p11, FUN::PARM_12 p12, FUN::PARM_13 p13, FUN::PARM_14 p14, FUN::PARM_15 p15, FUN::PARM_16 p16 ) 01074 { 01075 fun1_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16 ); 01076 fun2_( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16 ); 01077 } 01078 01079 }; 01080 COMET_CLOSE_PARTIAL() 01081 01082 01087 COMET_DEFINE_PARTIAL( typename R, typename LIST, binder_first) 01088 : public functor_impl<R, typename LIST::tail> 01089 { 01090 public: 01091 typedef functor<R, typename LIST::tail> outgoing_type; 01092 typedef typename functor<R, LIST>::PARM_1 bound_type; 01093 typedef R result_type; 01094 01095 private: 01096 functor<R, LIST> fun_; 01097 bound_type bound_; 01098 public: 01099 COMET_PARTIAL_NAME(binder_first)(const functor<R, LIST>& fun, bound_type bound) : bound_(bound) 01100 { 01101 fun_ = fun; 01102 } 01103 01104 COMET_PARTIAL_NAME(binder_first)(const COMET_PARTIAL_NAME(binder_first)& x) : bound_(x.bound_) 01105 { 01106 fun_ = x.fun_; 01107 } 01108 01109 functor_impl<R, typename LIST::tail>* clone() const 01110 { return new COMET_PARTIAL_NAME(binder_first)(*this); } 01111 01112 result_type operator()() 01113 { 01114 return fun_(bound_ ); 01115 } 01116 01117 result_type operator()( typename outgoing_type::PARM_1 p1) 01118 { 01119 return fun_(bound_, p1); 01120 } 01121 01122 result_type operator()( typename outgoing_type::PARM_1 p1, typename outgoing_type::PARM_2 p2) 01123 { 01124 return fun_(bound_, p1, p2); 01125 } 01126 01127 result_type operator()( typename outgoing_type::PARM_1 p1, typename outgoing_type::PARM_2 p2, typename outgoing_type::PARM_3 p3) 01128 { 01129 return fun_(bound_, p1, p2, p3); 01130 } 01131 01132 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) 01133 { 01134 return fun_(bound_, p1, p2, p3, p4); 01135 } 01136 01137 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) 01138 { 01139 return fun_(bound_, p1, p2, p3, p4, p5); 01140 } 01141 01142 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) 01143 { 01144 return fun_(bound_, p1, p2, p3, p4, p5, p6); 01145 } 01146 01147 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) 01148 { 01149 return fun_(bound_, p1, p2, p3, p4, p5, p6, p7); 01150 } 01151 01152 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) 01153 { 01154 return fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8); 01155 } 01156 01157 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) 01158 { 01159 return fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8, p9); 01160 } 01161 01162 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) 01163 { 01164 return fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); 01165 } 01166 01167 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) 01168 { 01169 return fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); 01170 } 01171 01172 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) 01173 { 01174 return fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); 01175 } 01176 01177 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) 01178 { 01179 return fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13); 01180 } 01181 01182 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) 01183 { 01184 return fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14); 01185 } 01186 01187 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) 01188 { 01189 return fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15); 01190 } 01191 01192 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) 01193 { 01194 return fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16); 01195 } 01196 01197 01198 }; 01199 COMET_CLOSE_PARTIAL() 01200 01201 COMET_SPECIALISE_PARTIAL( void, typename LIST , binder_first) 01202 : public functor_impl<void, typename LIST::tail> 01203 { 01204 public: 01205 typedef functor<void, typename LIST::tail> outgoing_type; 01206 typedef typename functor<void, LIST>::PARM_1 bound_type; 01207 typedef void result_type; 01208 01209 private: 01210 functor<void, LIST> fun_; 01211 bound_type bound_; 01212 public: 01213 COMET_PARTIAL_NAME(binder_first)(const functor<void, LIST>& fun, bound_type bound) : bound_(bound) 01214 { 01215 fun_ = fun; 01216 } 01217 01218 COMET_PARTIAL_NAME(binder_first)(const COMET_PARTIAL_NAME(binder_first)& x) : bound_(x.bound_) 01219 { 01220 fun_ = x.fun_; 01221 } 01222 01223 functor_impl<void, typename LIST::tail>* clone() const 01224 { return new COMET_PARTIAL_NAME(binder_first)(*this); } 01225 01226 result_type operator()() 01227 { 01228 fun_(bound_ ); 01229 } 01230 01231 result_type operator()( typename outgoing_type::PARM_1 p1) 01232 { 01233 fun_(bound_, p1); 01234 } 01235 01236 result_type operator()( typename outgoing_type::PARM_1 p1, typename outgoing_type::PARM_2 p2) 01237 { 01238 fun_(bound_, p1, p2); 01239 } 01240 01241 result_type operator()( typename outgoing_type::PARM_1 p1, typename outgoing_type::PARM_2 p2, typename outgoing_type::PARM_3 p3) 01242 { 01243 fun_(bound_, p1, p2, p3); 01244 } 01245 01246 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) 01247 { 01248 fun_(bound_, p1, p2, p3, p4); 01249 } 01250 01251 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) 01252 { 01253 fun_(bound_, p1, p2, p3, p4, p5); 01254 } 01255 01256 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) 01257 { 01258 fun_(bound_, p1, p2, p3, p4, p5, p6); 01259 } 01260 01261 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) 01262 { 01263 fun_(bound_, p1, p2, p3, p4, p5, p6, p7); 01264 } 01265 01266 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) 01267 { 01268 fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8); 01269 } 01270 01271 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) 01272 { 01273 fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8, p9); 01274 } 01275 01276 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) 01277 { 01278 fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); 01279 } 01280 01281 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) 01282 { 01283 fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); 01284 } 01285 01286 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) 01287 { 01288 fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); 01289 } 01290 01291 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) 01292 { 01293 fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13); 01294 } 01295 01296 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) 01297 { 01298 fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14); 01299 } 01300 01301 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) 01302 { 01303 fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15); 01304 } 01305 01306 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) 01307 { 01308 fun_(bound_, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16); 01309 } 01310 01311 }; 01312 COMET_CLOSE_PARTIAL() 01313 01314 01318 template<typename R, typename LIST, typename T> 01319 functor<R, typename LIST::tail> bind_first( const functor<R, LIST>& fun, const T& bound) 01320 { 01321 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))); 01322 } 01323 01328 template<typename R, typename LIST> 01329 functor<R, LIST> chain( const functor<R, LIST>& fun1, const functor<R, LIST>& fun2) 01330 { 01331 return functor<R,LIST>(std::auto_ptr< functor<R, LIST>::IMPL >(new chainer<R>COMET_PARTIAL_NS<LIST>(fun1, fun2))); 01332 } 01334 } 01335 01336 #endif