for_all.h

Go to the documentation of this file.
00001 /*****************************************************************************
00002 * Copyright (c) 2001 - 2008 Marcus Boerger.  All rights reserved.
00003 *
00004 * This library is free software; you can redistribute it and/or
00005 * modify it under the terms of the GNU Lesser General Public
00006 * License as published by the Free Software Foundation; either
00007 * version 2.1 of the License, or (at your option) any later version.
00008 *
00009 * This library is distributed in the hope that it will be useful,
00010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012 * Lesser General Public License for more details.
00013 *
00014 * You should have received a copy of the GNU Lesser General Public
00015 * License along with this library; if not, write to the Free Software
00016 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
00017 * ========================================================================= */
00018 
00019 /* ------------------------------------------------------------------------ */
00020 /* Name:      for_all.h
00021  *
00022  * Requires:  
00023  * - Mbo.h
00024  */
00035 /* ------------------------------------------------------------------------ */
00036 
00037 #pragma once
00038 
00039 #ifndef _FOR_ALL_H_
00040 #define _FOR_ALL_H_
00041 
00042 #include <algorithm>
00043 #include <functional>
00044 #include <map>
00045 #include "arg_info.h"
00046 
00047 namespace mbo
00048 {
00049 
00050 /****************************************************************************/
00056 template<typename _Tret
00057        , typename _Ty
00058        , typename _Targ1 = void
00059        , typename _Targ2 = void
00060        , typename _Targ3 = void
00061        , typename _Targ4 = void
00062        , typename _Targ5 = void
00063        , typename _Targ6 = void
00064        , typename _Targ7 = void
00065        , typename _Targ8 = void
00066        , typename _Targ9 = void
00067        >
00068 struct func_type_info_t
00069     : public std::unary_function<_Ty, _Tret>
00070 {
00071 public:
00072     typedef typename arg_info<_Targ1>::argument_t  arg1_t;
00073     typedef typename arg_info<_Targ1>::variable_t  var1_t;
00074     typedef typename arg_info<_Targ2>::argument_t  arg2_t;
00075     typedef typename arg_info<_Targ2>::variable_t  var2_t;
00076     typedef typename arg_info<_Targ3>::argument_t  arg3_t;
00077     typedef typename arg_info<_Targ3>::variable_t  var3_t;
00078     typedef typename arg_info<_Targ4>::argument_t  arg4_t;
00079     typedef typename arg_info<_Targ4>::variable_t  var4_t;
00080     typedef typename arg_info<_Targ5>::argument_t  arg5_t;
00081     typedef typename arg_info<_Targ5>::variable_t  var5_t;
00082     typedef typename arg_info<_Targ6>::argument_t  arg6_t;
00083     typedef typename arg_info<_Targ6>::variable_t  var6_t;
00084     typedef typename arg_info<_Targ7>::argument_t  arg7_t;
00085     typedef typename arg_info<_Targ7>::variable_t  var7_t;
00086     typedef typename arg_info<_Targ8>::argument_t  arg8_t;
00087     typedef typename arg_info<_Targ8>::variable_t  var8_t;
00088     typedef typename arg_info<_Targ9>::argument_t  arg9_t;
00089     typedef typename arg_info<_Targ9>::variable_t  var9_t;
00090 };
00091 
00092 /****************************************************************************/
00096 template<class _Ty, typename _Tret, typename _Targ>
00097 struct obj_func_t
00098     : public func_type_info_t<_Tret, _Ty, _Targ>
00099 {
00100 public:
00101     typedef _Ty     obj_t;
00102     typedef typename result_type (_Ty::*func_t)(arg1_t);
00103 
00104     obj_func_t(obj_t& obj, func_t func)
00105         : m_obj(obj)
00106         , m_func(func)
00107     {
00108     }
00109 
00110     result_type operator() (arg1_t arg1)
00111     {
00112         return (m_obj.*m_func)(arg1);
00113     }
00114 
00115 protected:
00116 
00117     obj_t&   m_obj;
00118     func_t   m_func;
00119 };
00120 
00121 template<class _Ty, typename _Tret, typename _Targ>
00122 struct obj_func_t<const _Ty, _Tret, _Targ>
00123     : public func_type_info_t<_Tret, _Ty, _Targ>
00124 {
00125 public:
00126     typedef _Ty     obj_t;
00127     typedef result_type (_Ty::*func_t)(arg1_t);
00128 
00129     obj_func_t(obj_t& obj, func_t func)
00130         : m_obj(obj)
00131         , m_func(func)
00132     {
00133     }
00134 
00135     result_type operator() (arg1_t arg1) const
00136     {
00137         return (m_obj.*m_func)(arg1);
00138     }
00139 
00140 protected:
00141 
00142     obj_t&   m_obj;
00143     func_t   m_func;
00144 };
00145 
00146 template<class _Ty, typename _Tret, typename _Targ, typename _Targ2>
00147 struct obj_func_1_t
00148     : public func_type_info_t<_Tret, _Ty, _Targ, _Targ2>
00149 {
00150 public:
00151     typedef typename _Ty     obj_t;
00152     typedef result_type (_Ty::*func_t)(arg1_t, arg2_t);
00153 
00154     obj_func_1_t(obj_t& obj, func_t func, arg2_t _arg2)
00155         : m_obj(obj)
00156         , m_func(func)
00157         , m_arg2(_arg2)
00158     {
00159     }
00160 
00161     result_type operator() (arg1_t arg1)
00162     {
00163         return (m_obj.*m_func)(arg1, m_arg2);
00164     }
00165 
00166 protected:
00167 
00168     obj_t&   m_obj;
00169     func_t   m_func;
00170     arg2_t   m_arg2;
00171 };
00172 
00173 template<class _Ty, typename _Tret, typename _Targ, typename _Targ2>
00174 struct obj_func_1_t<const _Ty, _Tret, _Targ, _Targ2>
00175     : public func_type_info_t<_Tret, _Ty, _Targ, _Targ2>
00176 {
00177 public:
00178     typedef _Ty     obj_t;
00179     typedef result_type (_Ty::*func_t)(arg1_t, arg2_t);
00180 
00181     obj_func_1_t(obj_t& obj, func_t func, arg2_t arg2)
00182         : m_obj(obj)
00183         , m_func(func)
00184         , m_arg2(arg2)
00185     {
00186     }
00187 
00188     result_type operator() (arg1_t arg1) const
00189     {
00190         return (m_obj.*m_func)(arg1, m_arg2);
00191     }
00192 
00193 protected:
00194 
00195     obj_t&   m_obj;
00196     func_t   m_func;
00197     arg2_t   m_arg2;
00198 };
00199 
00200 template<class _Ty, typename _Tret, typename _Targ, typename _Targ2, typename _Targ3>
00201 struct obj_func_2_t
00202     : public func_type_info_t<_Tret, _Ty, _Targ, _Targ2, _Targ3>
00203 {
00204 public:
00205     typedef _Ty     obj_t;
00206     typedef result_type (_Ty::*func_t)(arg1_t, arg2_t, arg3_t);
00207 
00208     obj_func_2_t(obj_t& obj, func_t func, arg2_t arg2, arg3_t arg3)
00209         : m_obj(obj)
00210         , m_func(func)
00211         , m_arg2(arg2)
00212         , m_arg3(arg3)
00213     {
00214     }
00215 
00216     result_type operator() (arg1_t arg1)
00217     {
00218         return (m_obj.*m_func)(arg1, m_arg2, m_arg3);
00219     }
00220 
00221 protected:
00222 
00223     obj_t&   m_obj;
00224     func_t   m_func;
00225     arg2_t   m_arg2;
00226     arg3_t   m_arg3;
00227 };
00228 
00229 template<class _Ty, typename _Tret, typename _Targ, typename _Targ2, typename _Targ3>
00230 struct obj_func_2_t<const _Ty, _Tret, _Targ, _Targ2, _Targ3>
00231     : public func_type_info_t<_Tret, _Ty, _Targ, _Targ2, _Targ3>
00232 {
00233 public:
00234     typedef _Ty     obj_t;
00235     typedef result_type (_Ty::*func_t)(arg1_t, arg2_t, arg3_t);
00236 
00237     obj_func_2_t(obj_t& obj, func_t func, arg2_t arg2, arg3_t arg3)
00238         : m_obj(obj)
00239         , m_func(func)
00240         , m_arg2(arg2)
00241         , m_arg3(arg3)
00242     {
00243     }
00244 
00245     result_type operator() (arg1_t arg1) const
00246     {
00247         return (m_obj.*m_func)(arg1, m_arg2, m_arg3);
00248     }
00249 
00250 protected:
00251 
00252     obj_t&   m_obj;
00253     func_t   m_func;
00254     arg2_t   m_arg2;
00255     arg3_t   m_arg3;
00256 };
00257 
00260 template<typename _Ty, typename _Tret, typename _Targ>
00261 inline obj_func_t<_Ty, typename _Tret, typename _Targ> obj_func(_Ty& obj, _Tret (_Ty::* func)(_Targ))
00262 {
00263     return obj_func_t<_Ty, _Tret, _Targ>(obj, func);
00264 }
00265 
00268 template<typename _Ty, typename _Tret, typename _Targ>
00269 inline obj_func_t<const _Ty, typename _Tret, typename _Targ> obj_func(const _Ty& obj, _Tret (_Ty::* func)(_Targ) const)
00270 {
00271     return obj_func_t<_Ty, _Tret, _Targ>(obj, func);
00272 }
00273 
00276 template<typename _Ty, typename _Tret, typename _Targ, typename _Targ2>
00277 inline obj_func_1_t<_Ty, typename _Tret, typename _Targ, typename _Targ2> obj_func(_Ty& obj, _Tret (_Ty::* func)(_Targ, _Targ2), _Targ2 arg2)
00278 {
00279     return obj_func_1_t<_Ty, _Tret, _Targ, _Targ2>(obj, func, arg2);
00280 }
00281 
00284 template<typename _Ty, typename _Tret, typename _Targ, typename _Targ2>
00285 inline obj_func_1_t<const _Ty, typename _Tret, typename _Targ, typename _Targ2> obj_func(const _Ty& obj, _Tret (_Ty::* func)(_Targ, _Targ2) const, _Targ2 arg2)
00286 {
00287     return obj_func_1_t<_Ty, _Tret, _Targ, _Targ2>(obj, func, arg2);
00288 }
00289 
00292 template<typename _Ty, typename _Tret, typename _Targ, typename _Targ2, typename _Targ3>
00293 inline obj_func_2_t<_Ty, typename _Tret, typename _Targ, typename _Targ2, typename _Targ3> 
00294     obj_func(_Ty& obj, 
00295         _Tret (_Ty::*func)(_Targ, _Targ2, _Targ3),
00296         typename arg_info<_Targ2>::argument_t arg2, 
00297         typename arg_info<_Targ3>::argument_t arg3)
00298 {
00299     return obj_func_2_t<_Ty, _Tret, _Targ, _Targ2, _Targ3>(obj, func, arg2, arg3);
00300 }
00301 
00304 template<typename _Ty, typename _Tret, typename _Targ, typename _Targ2, typename _Targ3>
00305 inline obj_func_2_t<const _Ty, typename _Tret, typename _Targ, typename _Targ2, typename _Targ3> 
00306     obj_func(const _Ty& obj, 
00307         _Tret (_Ty::*func)(_Targ, _Targ2, _Targ3) const,
00308         typename arg_info<_Targ2>::argument_t arg2, 
00309         typename arg_info<_Targ3>::argument_t arg3)
00310 {
00311     return obj_func_2_t<const _Ty, _Tret, _Targ, _Targ2, _Targ3>(obj, func, arg2, arg3);
00312 }
00313 
00314 /****************************************************************************/
00315 
00318 template<typename _Tfunc, typename _Ty>
00319 struct all_of_t
00320     : public std::unary_function<typename _Ty, bool>
00321 {
00322 public:
00323     typedef _Tfunc func_t;
00324 
00325     all_of_t(func_t func)
00326         : m_func(func)
00327         , m_res(true)
00328     {
00329     }
00330 
00331     result_type operator() (argument_type arg)
00332     {
00333         // Cannot use &= because compiler might generate code that 
00334         // optimizes out remaining calls after first fail.
00335         if (!(m_func(arg)))
00336         {
00337             m_res = false;
00338         }
00339         return m_res;
00340     }
00341 
00342     operator bool()
00343     {
00344         return m_res;
00345     }
00346 
00347 protected:
00348 
00349     bool     m_res;
00350     func_t   m_func;
00351 };
00352 
00355 template<typename _Tfunc>
00356 all_of_t<_Tfunc, typename _Tfunc::argument_type> all_of_func(_Tfunc func)
00357 {
00358     return all_of_t<_Tfunc, typename _Tfunc::argument_type>(func);
00359 }
00360 
00363 template<typename _Ty, typename _Tfunc>
00364 struct any_of_t
00365     : public std::unary_function<typename _Ty, bool>
00366 {
00367 public:
00368     typedef _Tfunc func_t;
00369 
00370     any_of_t(func_t func)
00371         : m_func(func)
00372         , m_res(false)
00373     {
00374     }
00375 
00376     result_type operator() (argument_type arg)
00377     {
00378         // Cannot use |= because compiler might generate code that 
00379         // optimizes out remaining calls after first sucess.
00380         if (m_func(arg))
00381         {
00382             m_res = true;
00383         }
00384         return m_res;
00385     }
00386 
00387     operator bool()
00388     {
00389         return m_res;
00390     }
00391 
00392 protected:
00393 
00394     bool     m_res;
00395     func_t   m_func;
00396 };
00397 
00400 template<typename _Tfunc>
00401 any_of_t<_Tfunc, typename _Tfunc::argument_type> any_of_func(_Tfunc func)
00402 {
00403     return any_of_t<_Tfunc, typename _Tfunc::argument_type>(func);
00404 }
00405 
00406 /****************************************************************************/
00410 template<typename _Tpair, typename _Tfunc>
00411 struct pair_first_func_t
00412     : public std::unary_function<_Tpair, _Tfunc>
00413 {
00414 public:
00415     typedef _Tpair        pair_t;
00416     typedef _Tfunc        func_t;
00417 
00418     pair_first_func_t(func_t func)
00419         : m_func(func)
00420     {
00421     }
00422 
00423     result_type operator() (pair_t& arg)
00424     {
00425         return m_func(arg.first);
00426     }
00427 
00428 protected:
00429 
00430     func_t   m_func;
00431 };
00432 
00435 template<typename _Tpair, typename _Tfunc>
00436 inline pair_first_func_t<_Tpair, _Tfunc> pair_first_func(_Tfunc func)
00437 {
00438     return pair_first_func_t<_Tpair, _Tfunc>(func);
00439 }
00440 
00441 /****************************************************************************/
00445 template<typename _Tpair, typename _Tret, typename _Tfunc>
00446 struct pair_second_func_t
00447     : public std::unary_function<_Tpair, _Tret>
00448 {
00449 public:
00450     typedef _Tpair        pair_t;
00451     typedef _Tfunc        func_t;
00452 
00453     pair_second_func_t(func_t func)
00454         : m_func(func)
00455     {
00456     }
00457 
00458     result_type operator() (pair_t& arg)
00459     {
00460         return m_func(arg.second);
00461     }
00462 
00463 protected:
00464 
00465     func_t   m_func;
00466 };
00467 
00470 template<typename _Tpair, typename _Tret, typename _Tfunc>
00471 inline pair_second_func_t<_Tpair, _Tret, _Tfunc> pair_second_func(_Tfunc func)
00472 {
00473     return pair_second_func_t<_Tpair, _Tret, _Tfunc>(func);
00474 }
00475 
00476 /****************************************************************************/
00479 template<typename _Tret, typename _Tkey, typename _Tval>
00480 struct map_value_func_t
00481     : public std::unary_function<typename std::map<_Tkey, _Tval>::value_type, _Tret>
00482 {
00483 public:
00484     typedef result_type (_Tval::*func_t)();
00485 
00486     map_value_func_t(func_t func)
00487         : m_func(func)
00488     {
00489     }
00490 
00491     result_type operator() (argument_type& it)
00492     {
00493         return (it.second.*m_func)();
00494     }
00495 
00496 protected:
00497 
00498     func_t  m_func;
00499 };
00500 
00503 template<typename _Tret, typename _Tkey, typename _Tval>
00504 struct map_value_func_t<_Tret, _Tkey, _Tval*>
00505     : public std::unary_function<typename std::map<_Tkey, _Tval*>::value_type, _Tret>
00506 {
00507 public:
00508     typedef result_type (_Tval::*func_t)();
00509 
00510     map_value_func_t(func_t func)
00511         : m_func(func)
00512     {
00513     }
00514 
00515     result_type operator() (argument_type& it)
00516     {
00517         return (it.second->*m_func)();
00518     }
00519 
00520 protected:
00521 
00522     func_t  m_func;
00523 };
00524 
00527 template<typename _Tret, typename _Tkey, typename _Tval>
00528 struct const_map_value_func_t
00529     : public std::unary_function<typename std::map<_Tkey, _Tval>::value_type, _Tret>
00530 {
00531 public:
00532     typedef result_type (_Tval::*func_t)() const;
00533 
00534     const_map_value_func_t(func_t func)
00535         : m_func(func)
00536     {
00537     }
00538 
00539     result_type operator() (const argument_type& it) const
00540     {
00541         return (it.second.*m_func)();
00542     }
00543 
00544 protected:
00545 
00546     func_t  m_func;
00547 };
00548 
00551 template<typename _Tret, typename _Tkey, typename _Tval>
00552 struct const_map_value_func_t<_Tret, _Tkey, _Tval*>
00553     : public std::unary_function<typename std::map<_Tkey, _Tval*>::value_type, _Tret>
00554 {
00555 public:
00556     typedef result_type (_Tval::*func_t)() const;
00557 
00558     const_map_value_func_t(func_t func)
00559         : m_func(func)
00560     {
00561     }
00562 
00563     result_type operator() (const argument_type& it) const
00564     {
00565         return (it.second->*m_func)();
00566     }
00567 
00568 protected:
00569 
00570     func_t  m_func;
00571 };
00572 
00577 template<typename _Tret, typename _Ty>
00578 struct value_func_t
00579     : public func_type_info_t<_Tret, _Ty>
00580 {
00581 public:
00582     typedef result_type (_Ty::*func_t)();
00583 
00584     value_func_t(func_t func)
00585         : m_func(func)
00586     {
00587     }
00588 
00589     result_type operator() (argument_type& p)
00590     {
00591         return (p.*m_func)();
00592     }
00593 
00594 protected:
00595     func_t  m_func;
00596 };
00597 
00600 template<typename _Tret, typename _Ty>
00601 struct value_func_t<_Tret, _Ty*>
00602     : public func_type_info_t<_Tret, _Ty*>
00603 {
00604 public:
00605     typedef result_type (_Ty::*func_t)();
00606 
00607     value_func_t(func_t func)
00608         : m_func(func)
00609     {
00610     }
00611 
00612     result_type operator() (argument_type p)
00613     {
00614         return (p->*m_func)();
00615     }
00616 
00617 protected:
00618     func_t  m_func;
00619 };
00620 
00623 template<typename _Tret, typename _Ty>
00624 struct const_value_func_t
00625     : public func_type_info_t<_Tret, _Ty>
00626 {
00627 public:
00628     typedef result_type (_Ty::*func_t)();
00629 
00630     const_value_func_t(func_t func)
00631         : m_func(func)
00632     {
00633     }
00634 
00635     result_type operator() (const argument_type& p) const
00636     {
00637         return (p->*m_func)();
00638     }
00639 
00640 protected:
00641     func_t  m_func;
00642 };
00643 
00646 template<typename _Tret, typename _Ty>
00647 struct const_value_func_t<_Tret, _Ty*>
00648     : public func_type_info_t<_Tret, _Ty*>
00649 {
00650 public:
00651     typedef result_type (_Ty::*func_t)();
00652 
00653     const_value_func_t(func_t func)
00654         : m_func(func)
00655     {
00656     }
00657 
00658     result_type operator() (const argument_type p) const
00659     {
00660         return (p->*m_func)();
00661     }
00662 
00663 protected:
00664     func_t  m_func;
00665 };
00666 
00669 template<typename _Tret, typename _Ty, typename _Targ1>
00670 struct value_func_1_t
00671     : public func_type_info_t<_Tret, _Ty, _Targ1>
00672 {
00673 public:
00674     typedef result_type (_Ty::*func_t)(arg1_t);
00675 
00676     value_func_1_t(func_t func, arg1_t arg1)
00677         : m_func(func)
00678         , m_arg1(arg1)
00679     {
00680     }
00681 
00682     result_type operator() (argument_type& p)
00683     {
00684         return (p.*m_func)(m_arg1);
00685     }
00686 
00687 protected:
00688     func_t  m_func;
00689     var1_t  m_arg1;
00690 };
00691 
00694 template<typename _Tret, typename _Ty, typename _Targ1>
00695 struct value_func_1_t<_Tret, _Ty*, _Targ1>
00696     : public func_type_info_t<_Tret, _Ty*, _Targ1>
00697 {
00698 public:
00699     typedef result_type (_Ty::*func_t)(arg1_t);
00700 
00701     value_func_1_t(func_t func, arg1_t arg1)
00702         : m_func(func)
00703         , m_arg1(arg1)
00704     {
00705     }
00706 
00707     result_type operator() (argument_type p)
00708     {
00709         return (p->*m_func)(m_arg1);
00710     }
00711 
00712 protected:
00713     func_t  m_func;
00714     var1_t  m_arg1;
00715 };
00716 
00719 template<typename _Tret, typename _Ty, typename _Targ1>
00720 struct const_value_func_1_t
00721     : public func_type_info_t<_Tret, _Ty, _Targ1>
00722 {
00723 public:
00724     typedef result_type (_Ty::*func_t)(arg1_t) const;
00725 
00726     const_value_func_1_t(func_t func, arg1_t arg1)
00727         : m_func(func)
00728         , m_arg1(arg1)
00729     {
00730     }
00731 
00732     result_type operator() (const argument_type& p) const
00733     {
00734         return (p->*m_func)(m_arg1);
00735     }
00736 
00737 protected:
00738     func_t  m_func;
00739     var1_t  m_arg1;
00740 };
00741 
00744 template<typename _Tret, typename _Ty, typename _Targ1>
00745 struct const_value_func_1_t<_Tret, _Ty*, _Targ1>
00746     : public func_type_info_t<_Tret, _Ty*, _Targ1>
00747 {
00748 public:
00749     typedef result_type (_Ty::*func_t)(arg1_t) const;
00750 
00751     const_value_func_1_t(func_t func, arg1_t arg1)
00752         : m_func(func)
00753         , m_arg1(arg1)
00754     {
00755     }
00756 
00757     result_type operator() (const argument_type p) const
00758     {
00759         return (p->*m_func)(m_arg1);
00760     }
00761 
00762 protected:
00763     func_t  m_func;
00764     var1_t  m_arg1;
00765 };
00766 
00769 template<typename _Tret, typename _Ty, typename _Targ1, typename _Targ2>
00770 struct value_func_2_t
00771     : public func_type_info_t<_Tret, _Ty, _Targ1, _Targ2>
00772 {
00773 public:
00774     typedef result_type (_Ty::*func_t)(arg1_t, arg2_t);
00775 
00776     value_func_2_t(func_t func, arg1_t arg1, arg2_t arg2)
00777         : m_func(func)
00778         , m_arg1(arg1)
00779         , m_arg2(arg2)
00780     {
00781     }
00782 
00783     result_type operator() (argument_type& p)
00784     {
00785         return (p.*m_func)(m_arg1, m_arg2);
00786     }
00787 
00788 protected:
00789     func_t  m_func;
00790     var1_t  m_arg1;
00791     var2_t  m_arg2;
00792 };
00793 
00796 template<typename _Tret, typename _Ty, typename _Targ1, typename _Targ2>
00797 struct value_func_2_t<_Tret, _Ty*, _Targ1, _Targ2>
00798     : public func_type_info_t<_Tret, _Ty*, _Targ1, _Targ2>
00799 {
00800 public:
00801     typedef result_type (_Ty::*func_t)(arg1_t, arg2_t);
00802 
00803     value_func_2_t(func_t func, arg1_t arg1, arg2_t arg2)
00804         : m_func(func)
00805         , m_arg1(arg1)
00806         , m_arg2(arg2)
00807     {
00808     }
00809 
00810     result_type operator() (argument_type p)
00811     {
00812         return (p->*m_func)(m_arg1, m_arg2);
00813     }
00814 
00815 protected:
00816     func_t  m_func;
00817     var1_t  m_arg1;
00818     var2_t  m_arg2;
00819 };
00820 
00823 template<typename _Tret, typename _Ty, typename _Targ1, typename _Targ2>
00824 struct const_value_func_2_t
00825     : public func_type_info_t<_Tret, _Ty, _Targ1, _Targ2>
00826 {
00827 public:
00828     typedef result_type (_Ty::*func_t)(arg1_t, arg2_t) const;
00829 
00830     const_value_func_2_t(func_t func, arg1_t arg1, arg2_t arg2)
00831         : m_func(func)
00832         , m_arg1(arg1)
00833         , m_arg2(arg2)
00834     {
00835     }
00836 
00837     result_type operator() (const argument_type& p) const
00838     {
00839         return (p.*m_func)(m_arg1, m_arg2);
00840     }
00841 
00842 protected:
00843     func_t  m_func;
00844     var1_t  m_arg1;
00845     var2_t  m_arg2;
00846 };
00847 
00850 template<typename _Tret, typename _Ty, typename _Targ1, typename _Targ2>
00851 struct const_value_func_2_t<_Tret, _Ty*, _Targ1, _Targ2>
00852     : public func_type_info_t<_Tret, _Ty*, _Targ1, _Targ2>
00853 {
00854 public:
00855     typedef result_type (_Ty::*func_t)(arg1_t, arg2_t) const;
00856 
00857     const_value_func_2_t(func_t func, arg1_t arg1, arg2_t arg2)
00858         : m_func(func)
00859         , m_arg1(arg1)
00860         , m_arg2(arg2)
00861     {
00862     }
00863 
00864     result_type operator() (const argument_type p) const
00865     {
00866         return (p->*m_func)(m_arg1, m_arg2);
00867     }
00868 
00869 protected:
00870     func_t  m_func;
00871     var1_t  m_arg1;
00872     var2_t  m_arg2;
00873 };
00874 
00877 template<typename _Tret, typename _Ty, typename _Targ1, typename _Targ2, typename _Targ3>
00878 struct value_func_3_t
00879     : public func_type_info_t<_Tret, _Ty, _Targ1, _Targ2, _Targ3>
00880 {
00881 public:
00882     typedef result_type (_Ty::*func_t)(arg1_t, arg2_t, arg3_t);
00883 
00884     value_func_3_t(func_t func, arg1_t arg1, arg2_t arg2, arg3_t arg3)
00885         : m_func(func)
00886         , m_arg1(arg1)
00887         , m_arg2(arg2)
00888         , m_arg3(arg3)
00889     {
00890     }
00891 
00892     result_type operator() (argument_type& p)
00893     {
00894         return (p.*m_func)(m_arg1, m_arg2, m_arg3);
00895     }
00896 
00897 protected:
00898     func_t  m_func;
00899     var1_t  m_arg1;
00900     var2_t  m_arg2;
00901     var3_t  m_arg3;
00902 };
00903 
00906 template<typename _Tret, typename _Ty, typename _Targ1, typename _Targ2, typename _Targ3>
00907 struct value_func_3_t<_Tret, _Ty*, _Targ1, _Targ2, _Targ3>
00908     : public func_type_info_t<_Tret, _Ty*, _Targ1, _Targ2, _Targ3>
00909 {
00910 public:
00911     typedef result_type (_Ty::*func_t)(arg1_t, arg2_t, arg3_t);
00912 
00913     value_func_3_t(func_t func, arg1_t arg1, arg2_t arg2, arg3_t arg3)
00914         : m_func(func)
00915         , m_arg1(arg1)
00916         , m_arg2(arg2)
00917         , m_arg3(arg3)
00918     {
00919     }
00920 
00921     result_type operator() (argument_type p)
00922     {
00923         return (p->*m_func)(m_arg1, m_arg2, m_arg3);
00924     }
00925 
00926 protected:
00927     func_t  m_func;
00928     var1_t  m_arg1;
00929     var2_t  m_arg2;
00930     var3_t  m_arg3;
00931 };
00932 
00935 template<typename _Tret, typename _Ty, typename _Targ1, typename _Targ2, typename _Targ3>
00936 struct const_value_func_3_t
00937     : public func_type_info_t<_Tret, _Ty, _Targ1, _Targ2, _Targ3>
00938 {
00939 public:
00940     typedef result_type (_Ty::*func_t)(arg1_t, arg2_t, arg3_t) const;
00941 
00942     const_value_func_3_t(func_t func, arg1_t arg1, arg2_t arg2, arg3_t arg3)
00943         : m_func(func)
00944         , m_arg1(arg1)
00945         , m_arg2(arg2)
00946         , m_arg3(arg3)
00947     {
00948     }
00949 
00950     result_type operator() (const argument_type& p) const
00951     {
00952         return (p.*m_func)(m_arg1, m_arg2, m_arg3);
00953     }
00954 
00955 protected:
00956     func_t  m_func;
00957     var1_t  m_arg1;
00958     var2_t  m_arg2;
00959     var3_t  m_arg3;
00960 };
00961 
00964 template<typename _Tret, typename _Ty, typename _Targ1, typename _Targ2, typename _Targ3>
00965 struct const_value_func_3_t<_Tret, _Ty*, _Targ1, _Targ2, _Targ3>
00966     : public func_type_info_t<_Tret, _Ty*, _Targ1, _Targ2, _Targ3>
00967 {
00968 public:
00969     typedef result_type (_Ty::*func_t)(arg1_t, arg2_t, arg3_t) const;
00970 
00971     const_value_func_3_t(func_t func, arg1_t arg1, arg2_t arg2, arg3_t arg3)
00972         : m_func(func)
00973         , m_arg1(arg1)
00974         , m_arg2(arg2)
00975         , m_arg3(arg3)
00976     {
00977     }
00978 
00979     result_type operator() (const argument_type p) const
00980     {
00981         return (p->*m_func)(m_arg1, m_arg2, m_arg3);
00982     }
00983 
00984 protected:
00985     func_t  m_func;
00986     var1_t  m_arg1;
00987     var2_t  m_arg2;
00988     var3_t  m_arg3;
00989 };
00990 
00993 template<typename _Tret, typename _Ty, typename _Targ1, typename _Targ2, typename _Targ3, typename _Targ4>
00994 struct value_func_4_t
00995     : public func_type_info_t<_Tret, _Ty, _Targ1, _Targ2, _Targ3, _Targ4>
00996 {
00997 public:
00998     typedef result_type (_Ty::*func_t)(arg1_t, arg2_t, arg3_t, arg4_t);
00999 
01000     value_func_4_t(func_t func, arg1_t arg1, arg2_t arg2, arg3_t arg3, arg4_t arg4)
01001         : m_func(func)
01002         , m_arg1(arg1)
01003         , m_arg2(arg2)
01004         , m_arg3(arg3)
01005         , m_arg4(arg4)
01006     {
01007     }
01008 
01009     result_type operator() (argument_type& p)
01010     {
01011         return (p.*m_func)(m_arg1, m_arg2, m_arg3, m_arg4);
01012     }
01013 
01014 protected:
01015     func_t  m_func;
01016     var1_t  m_arg1;
01017     var2_t  m_arg2;
01018     var3_t  m_arg3;
01019     var4_t  m_arg4;
01020 };
01021 
01024 template<typename _Tret, typename _Ty, typename _Targ1, typename _Targ2, typename _Targ3, typename _Targ4>
01025 struct value_func_4_t<_Tret, _Ty*, _Targ1, _Targ2, _Targ3, _Targ4>
01026     : public func_type_info_t<_Tret, _Ty*, _Targ1, _Targ2, _Targ3, _Targ4>
01027 {
01028 public:
01029     typedef result_type (_Ty::*func_t)(arg1_t, arg2_t, arg3_t, arg4_t);
01030 
01031     value_func_4_t(func_t func, arg1_t arg1, arg2_t arg2, arg3_t arg3, arg4_t arg4)
01032         : m_func(func)
01033         , m_arg1(arg1)
01034         , m_arg2(arg2)
01035         , m_arg3(arg3)
01036         , m_arg4(arg4)
01037     {
01038     }
01039 
01040     result_type operator() (argument_type p)
01041     {
01042         return (p->*m_func)(m_arg1, m_arg2, m_arg3, m_arg4);
01043     }
01044 
01045 protected:
01046     func_t  m_func;
01047     var1_t  m_arg1;
01048     var2_t  m_arg2;
01049     var3_t  m_arg3;
01050     var4_t  m_arg4;
01051 };
01052 
01055 template<typename _Tret, typename _Ty, typename _Targ1, typename _Targ2, typename _Targ3, typename _Targ4>
01056 struct const_value_func_4_t
01057     : public func_type_info_t<_Tret, _Ty, _Targ1, _Targ2, _Targ3, _Targ4>
01058 {
01059 public:
01060     typedef result_type (_Ty::*func_t)(arg1_t, arg2_t, arg3_t, arg4_t) const;
01061 
01062     const_value_func_4_t(func_t func, arg1_t arg1, arg2_t arg2, arg3_t arg3, arg4_t arg4)
01063         : m_func(func)
01064         , m_arg1(arg1)
01065         , m_arg2(arg2)
01066         , m_arg3(arg3)
01067         , m_arg4(arg4)
01068     {
01069     }
01070 
01071     result_type operator() (const argument_type& p) const
01072     {
01073         return (p.*m_func)(m_arg1, m_arg2, m_arg3, m_arg4);
01074     }
01075 
01076 protected:
01077     func_t  m_func;
01078     var1_t  m_arg1;
01079     var2_t  m_arg2;
01080     var3_t  m_arg3;
01081     var4_t  m_arg4;
01082 };
01083 
01086 template<typename _Tret, typename _Ty, typename _Targ1, typename _Targ2, typename _Targ3, typename _Targ4>
01087 struct const_value_func_4_t<_Tret, _Ty*, _Targ1, _Targ2, _Targ3, _Targ4>
01088     : public func_type_info_t<_Tret, _Ty*, _Targ1, _Targ2, _Targ3, _Targ4>
01089 {
01090 public:
01091     typedef result_type (_Ty::*func_t)(arg1_t, arg2_t, arg3_t, arg4_t) const;
01092 
01093     const_value_func_4_t(func_t func, arg1_t arg1, arg2_t arg2, arg3_t arg3, arg4_t arg4)
01094         : m_func(func)
01095         , m_arg1(arg1)
01096         , m_arg2(arg2)
01097         , m_arg3(arg3)
01098         , m_arg4(arg4)
01099     {
01100     }
01101 
01102     result_type operator() (const argument_type p) const
01103     {
01104         return (p->*m_func)(m_arg1, m_arg2, m_arg3, m_arg4);
01105     }
01106 
01107 protected:
01108     func_t  m_func;
01109     var1_t  m_arg1;
01110     var2_t  m_arg2;
01111     var3_t  m_arg3;
01112     var4_t  m_arg4;
01113 };
01114 
01117 template<typename _Tret, typename _Ty, typename _Targ1, typename _Targ2, typename _Targ3, typename _Targ4, typename _Targ5>
01118 struct value_func_5_t
01119     : public func_type_info_t<_Tret, _Ty, _Targ1, _Targ2, _Targ3, _Targ4, _Targ5>
01120 {
01121 public:
01122     typedef result_type (_Ty::*func_t)(arg1_t, arg2_t, arg3_t, arg4_t, arg5_t);
01123 
01124     value_func_5_t(func_t func, arg1_t arg1, arg2_t arg2, arg3_t arg3, arg4_t arg4, arg5_t)
01125         : m_func(func)
01126         , m_arg1(arg1)
01127         , m_arg2(arg2)
01128         , m_arg3(arg3)
01129         , m_arg4(arg4)
01130         , m_arg5(arg5)
01131     {
01132     }
01133 
01134     result_type operator() (argument_type& p)
01135     {
01136         return (p.*m_func)(m_arg1, m_arg2, m_arg3, m_arg4, m_arg5);
01137     }
01138 
01139 protected:
01140     func_t  m_func;
01141     var1_t  m_arg1;
01142     var2_t  m_arg2;
01143     var3_t  m_arg3;
01144     var4_t  m_arg4;
01145     var5_t  m_arg5;
01146 };
01147 
01150 template<typename _Tret, typename _Ty, typename _Targ1, typename _Targ2, typename _Targ3, typename _Targ4, typename _Targ5>
01151 struct value_func_5_t<_Tret, _Ty*, _Targ1, _Targ2, _Targ3, _Targ4, _Targ5>
01152     : public func_type_info_t<_Tret, _Ty*, _Targ1, _Targ2, _Targ3, _Targ4, _Targ5>
01153 {
01154 public:
01155     typedef result_type (_Ty::*func_t)(arg1_t, arg2_t, arg3_t, arg4_t, arg5_t);
01156 
01157     value_func_5_t(func_t func, arg1_t arg1, arg2_t arg2, arg3_t arg3, arg4_t arg4, arg5_t arg5)
01158         : m_func(func)
01159         , m_arg1(arg1)
01160         , m_arg2(arg2)
01161         , m_arg3(arg3)
01162         , m_arg4(arg4)
01163         , m_arg5(arg5)
01164     {
01165     }
01166 
01167     result_type operator() (argument_type p)
01168     {
01169         return (p->*m_func)(m_arg1, m_arg2, m_arg3, m_arg4, m_arg5);
01170     }
01171 
01172 protected:
01173     func_t  m_func;
01174     var1_t  m_arg1;
01175     var2_t  m_arg2;
01176     var3_t  m_arg3;
01177     var4_t  m_arg4;
01178     var5_t  m_arg5;
01179 };
01180 
01183 template<typename _Tret, typename _Ty, typename _Targ1, typename _Targ2, typename _Targ3, typename _Targ4, typename _Targ5>
01184 struct const_value_func_5_t
01185     : public func_type_info_t<_Tret, _Ty, _Targ1, _Targ2, _Targ3, _Targ4, _Targ5>
01186 {
01187 public:
01188     typedef result_type (_Ty::*func_t)(arg1_t, arg2_t, arg3_t, arg4_t, arg5_t) const;
01189 
01190     const_value_func_5_t(func_t func, arg1_t arg1, arg2_t arg2, arg3_t arg3, arg4_t arg4, arg5_t arg5)
01191         : m_func(func)
01192         , m_arg1(arg1)
01193         , m_arg2(arg2)
01194         , m_arg3(arg3)
01195         , m_arg4(arg4)
01196         , m_arg5(arg5)
01197     {
01198     }
01199 
01200     result_type operator() (const argument_type& p) const
01201     {
01202         return (p.*m_func)(m_arg1, m_arg2, m_arg3, m_arg4, m_arg5);
01203     }
01204 
01205 protected:
01206     func_t  m_func;
01207     var1_t  m_arg1;
01208     var2_t  m_arg2;
01209     var3_t  m_arg3;
01210     var4_t  m_arg4;
01211     var5_t  m_arg5;
01212 };
01213 
01216 template<typename _Tret, typename _Ty, typename _Targ1, typename _Targ2, typename _Targ3, typename _Targ4, typename _Targ5>
01217 struct const_value_func_5_t<_Tret, _Ty*, _Targ1, _Targ2, _Targ3, _Targ4, _Targ5>
01218     : public func_type_info_t<_Tret, _Ty*, _Targ1, _Targ2, _Targ3, _Targ4, _Targ5>
01219 {
01220 public:
01221     typedef result_type (_Ty::*func_t)(arg1_t, arg2_t, arg3_t, arg4_t, arg5_t) const;
01222 
01223     const_value_func_5_t(func_t func, arg1_t arg1, arg2_t arg2, arg3_t arg3, arg4_t arg4, arg5_t arg5)
01224         : m_func(func)
01225         , m_arg1(arg1)
01226         , m_arg2(arg2)
01227         , m_arg3(arg3)
01228         , m_arg4(arg4)
01229         , m_arg5(arg5)
01230     {
01231     }
01232 
01233     result_type operator() (const argument_type p) const
01234     {
01235         return (p->*m_func)(m_arg1, m_arg2, m_arg3, m_arg4, m_arg5);
01236     }
01237 
01238 protected:
01239     func_t  m_func;
01240     var1_t  m_arg1;
01241     var2_t  m_arg2;
01242     var3_t  m_arg3;
01243     var4_t  m_arg4;
01244     var5_t  m_arg5;
01245 };
01246 
01247 /****************************************************************************/
01248 
01251 template<typename _Tret, typename _Tkey, typename _Tval> 
01252 inline map_value_func_t<_Tret, _Tkey, _Tval> map_value_func(typename map_value_func_t<_Tret, _Tkey, _Tval>::func_t func)
01253 {
01254     return map_value_func_t<_Tret, _Tkey, _Tval>(func);
01255 }
01256 
01259 template<typename _Tret, typename _Tkey, typename _Tval> 
01260 inline const_map_value_func_t<_Tret, _Tkey, _Tval> map_value_func(typename const_map_value_func_t<_Tret, _Tkey, _Tval>::func_t func)
01261 {
01262     return const_map_value_func_t<_Tret, _Tkey, _Tval>(func);
01263 }
01264 
01267 template<typename _Tret, typename _Ty>
01268 inline value_func_t<_Tret, _Ty> value_func(_Tret (_Ty::*func)())
01269 {
01270     return value_func_t<_Ty, _Tret>(func);
01271 }
01272 
01275 template<typename _Tret, typename _Ty>
01276 inline const_value_func_t<_Tret, _Ty> value_func(_Tret (_Ty::*func)() const)
01277 {
01278     return const_value_func_t<_Ty, _Tret>(func);
01279 }
01280 
01283 template<typename _Tret, typename _Ty, typename _Targ1>
01284 inline value_func_1_t<_Tret, _Ty, _Targ1> value_func(_Tret (_Ty::*func)(_Targ1))
01285 {
01286     return value_func_1_t<_Ty, _Tret, _Targ1>(func);
01287 }
01288 
01291 template<typename _Tret, typename _Ty, typename _Targ1>
01292 inline const_value_func_1_t<_Tret, _Ty, _Targ1> value_func(_Tret (_Ty::*func)(_Targ1) const)
01293 {
01294     return const_value_func_1_t<_Ty, _Tret, _Targ1>(func);
01295 }
01296 
01299 template<typename _Tret, typename _Ty, typename _Targ1, typename _Targ2>
01300 inline value_func_2_t<_Tret, _Ty, _Targ1, _Targ2> value_func(_Tret (_Ty::*func)(_Targ1, _Targ2))
01301 {
01302     return value_func_2_t<_Ty, _Tret, _Targ1, _Targ2>(func);
01303 }
01304 
01307 template<typename _Tret, typename _Ty, typename _Targ1, typename _Targ2>
01308 inline const_value_func_2_t<_Tret, _Ty, _Targ1, _Targ2> value_func(_Tret (_Ty::*func)(_Targ1, _Targ2) const)
01309 {
01310     return const_value_func_2_t<_Ty, _Tret, _Targ1, _Targ2>(func);
01311 }
01312 
01315 template<typename _Tret, typename _Ty, typename _Targ1, typename _Targ2, typename _Targ3>
01316 inline value_func_3_t<_Tret, _Ty, _Targ1, _Targ2, _Targ3> value_func(_Tret (_Ty::*func)(_Targ1, _Targ2, _Targ3))
01317 {
01318     return value_func_3_t<_Ty, _Tret, _Targ1, _Targ2, _Targ3>(func);
01319 }
01320 
01323 template<typename _Tret, typename _Ty, typename _Targ1, typename _Targ2, typename _Targ3>
01324 inline const_value_func_3_t<_Tret, _Ty, _Targ1, _Targ2, _Targ3> value_func(_Tret (_Ty::*func)(_Targ1, _Targ2, _Targ3) const)
01325 {
01326     return const_value_func_3_t<_Ty, _Tret, _Targ1, _Targ2, _Targ3>(func);
01327 }
01328 
01329 /****************************************************************************/
01332 template<typename _Tcontainer, typename _Tfunc>
01333 _Tfunc for_all(_Tcontainer& cont, _Tfunc func)
01334 {
01335     return std::for_each(cont.begin(), cont.end(), func);
01336 }
01337 
01340 template<typename _Tcontainer, typename _Tfunc>
01341 bool all_of(_Tcontainer& cont, _Tfunc func)
01342 {
01343     return for_all(cont, all_of_t<_Tfunc, _Tcontainer::value_type>(func));
01344 }
01345 
01348 template<typename _Tcontainer, typename _Tfunc>
01349 bool any_of(_Tcontainer& cont, _Tfunc func)
01350 {
01351     return for_all(cont, any_of_t<_Tcontainer::value_type, _Tfunc>(func));
01352 }
01353 
01354 /* - map - */
01355 
01358 template<typename _Tret, typename _Tmap, typename _Tval>
01359 void for_all_map_val(_Tmap& cont, _Tret (_Tval::*func)())
01360 {
01361     for_all(cont, map_value_func_t<_Tret, _Tmap::key_type, _Tmap::mapped_type>(func));
01362 }
01363 
01366 template<typename _Tret, typename _Tmap, typename _Tval>
01367 void for_all_map_val(const _Tmap& cont, _Tret (_Tval::*func)() const)
01368 {
01369     for_all(cont, const_map_value_func_t<_Tret, _Tmap::key_type, _Tmap::mapped_type>(func));
01370 }
01371 
01374 template<typename _Tmap, typename _Tfunc>
01375 _Tfunc for_all_map_first(_Tmap& cont, _Tfunc func)
01376 {
01377     for_all(cont, pair_first_func_t<_Tmap::value_type, void, _Tfunc>(func));
01378     return func;
01379 }
01380 
01383 template<typename _Tmap, typename _Tfunc>
01384 _Tfunc for_all_map_second(_Tmap& cont, _Tfunc func)
01385 {
01386     for_all(cont, pair_second_func_t<_Tmap::value_type, void, _Tfunc>(func));
01387     return func;
01388 }
01389 
01392 template<typename _Tmap, typename _Tfunc>
01393 bool all_of_map_second(_Tmap& cont, _Tfunc func)
01394 {
01395     return for_all(cont, all_of_func(pair_second_func<_Tmap::value_type, bool>(func)));
01396 }
01397 
01400 template<typename _Tmap, typename _Tfunc>
01401 bool any_of_map_second(_Tmap& cont, _Tfunc func)
01402 {
01403     return for_all(cont, any_of_func(pair_second_func<_Tmap::value_type, bool>(func)));
01404 }
01405 
01406 /* - 0 - */
01407 
01410 template<typename _Tret, typename _Tcontainer, typename _Tval>
01411 void for_all_val(_Tcontainer& cont, _Tret (_Tval::*func)())
01412 {
01413     for_all(cont, value_func_t<_Tret, _Tcontainer::value_type>(func));
01414 }
01415 
01418 template<typename _Tret, typename _Tcontainer, typename _Tval>
01419 void for_all_val(_Tcontainer& cont, _Tret (_Tval::*func)() const)
01420 {
01421     for_all(cont, const_value_func_t<_Tret, _Tcontainer::value_type>(func));
01422 }
01423 
01424 /* - 1 - */
01425 
01428 template<typename _Targ1, typename _Tret, typename _Tcontainer, typename _Tval>
01429 void for_all_val(
01430         _Tcontainer& cont, 
01431         _Tret (_Tval::*func)(_Targ1), 
01432         typename arg_info<_Targ1>::argument_t arg1
01433     )
01434 {
01435     for_all(cont, value_func_1_t<_Tret, _Tcontainer::value_type, _Targ1>(func, arg1));
01436 }
01437 
01440 template<typename _Targ1, typename _Tret, typename _Tcontainer, typename _Tval>
01441 void for_all_val(
01442         _Tcontainer& cont, 
01443         _Tret (_Tval::*func)(_Targ1) const, 
01444         typename arg_info<_Targ1>::argument_t arg1
01445     )
01446 {
01447     for_all(cont, const_value_func_1_t<_Tret, _Tcontainer::value_type, _Targ1>(func, arg1));
01448 }
01449 
01450 /* - 2 - */
01451 
01454 template<typename _Targ1, typename _Targ2, typename _Tret, typename _Tcontainer, typename _Tval>
01455 void for_all_val(
01456         _Tcontainer& cont, 
01457         _Tret (_Tval::*func)(_Targ1, _Targ2), 
01458         typename arg_info<_Targ1>::argument_t arg1, 
01459         typename arg_info<_Targ2>::argument_t arg2
01460     )
01461 {
01462     for_all(cont, value_func_2_t<_Tret, _Tcontainer::value_type, _Targ1, _Targ2>(func, arg1, arg2));
01463 }
01464 
01467 template<typename _Targ1, typename _Targ2, typename _Tret, typename _Tcontainer, typename _Tval>
01468 void for_all_val(
01469         _Tcontainer& cont, 
01470         _Tret (_Tval::*func)(_Targ1, _Targ2) const, 
01471         typename arg_info<_Targ1>::argument_t arg1, 
01472         typename arg_info<_Targ2>::argument_t arg2
01473     )
01474 {
01475     for_all(cont, const_value_func_2_t<_Tret, _Tcontainer::value_type, _Targ1, _Targ2>(func, arg1, arg2));
01476 }
01477 
01478 /* - 3 - */
01479 
01482 template<typename _Targ1, typename _Targ2, typename _Targ3, typename _Tret, typename _Tcontainer, typename _Tval>
01483 void for_all_val(
01484         _Tcontainer& cont, 
01485         _Tret (_Tval::*func)(_Targ1, _Targ2, _Targ3), 
01486         typename arg_info<_Targ1>::argument_t arg1, 
01487         typename arg_info<_Targ2>::argument_t arg2,
01488         typename arg_info<_Targ3>::argument_t arg3
01489     )
01490 {
01491     for_all(cont, value_func_3_t<_Tret, _Tcontainer::value_type, _Targ1, _Targ2, _Targ3>(func, arg1, arg2, arg3));
01492 }
01493 
01496 template<typename _Targ1, typename _Targ2, typename _Targ3, typename _Tret, typename _Tcontainer, typename _Tval>
01497 void for_all_val(
01498         _Tcontainer& cont, 
01499         _Tret (_Tval::*func)(_Targ1, _Targ2, _Targ3) const, 
01500         typename arg_info<_Targ1>::argument_t arg1, 
01501         typename arg_info<_Targ2>::argument_t arg2,
01502         typename arg_info<_Targ3>::argument_t arg3
01503     )
01504 {
01505     for_all(cont, const_value_func_3_t<_Tret, _Tcontainer::value_type, _Targ1, _Targ2, _Targ3>(func, arg1, arg2, arg3));
01506 }
01507 
01508 /* - 4 - */
01509 
01512 template<typename _Targ1, typename _Targ2, typename _Targ3, typename _Targ4, typename _Tret, typename _Tcontainer, typename _Tval>
01513 void for_all_val(
01514         _Tcontainer& cont, 
01515         _Tret (_Tval::*func)(_Targ1, _Targ2, _Targ3, _Targ4), 
01516         typename arg_info<_Targ1>::argument_t arg1, 
01517         typename arg_info<_Targ2>::argument_t arg2,
01518         typename arg_info<_Targ3>::argument_t arg3,
01519         typename arg_info<_Targ4>::argument_t arg4
01520     )
01521 {
01522     for_all(cont, value_func_4_t<_Tret, _Tcontainer::value_type, _Targ1, _Targ2, _Targ3, _Targ4>(func, arg1, arg2, arg3, arg4));
01523 }
01524 
01527 template<typename _Targ1, typename _Targ2, typename _Targ3, typename _Targ4, typename _Tret, typename _Tcontainer, typename _Tval>
01528 void for_all_val(
01529         _Tcontainer& cont, 
01530         _Tret (_Tval::*func)(_Targ1, _Targ2, _Targ3, _Targ4) const, 
01531         typename arg_info<_Targ1>::argument_t arg1, 
01532         typename arg_info<_Targ2>::argument_t arg2,
01533         typename arg_info<_Targ3>::argument_t arg3,
01534         typename arg_info<_Targ4>::argument_t arg4
01535     )
01536 {
01537     for_all(cont, const_value_func_4_t<_Tret, _Tcontainer::value_type, _Targ1, _Targ2, _Targ3, _Targ4>(func, arg1, arg2, arg3, arg4));
01538 }
01539 
01540 /* - 5 - */
01541 
01544 template<typename _Targ1, typename _Targ2, typename _Targ3, typename _Targ4, typename _Targ5, typename _Tret, typename _Tcontainer, typename _Tval>
01545 void for_all_val(
01546         _Tcontainer& cont, 
01547         _Tret (_Tval::*func)(_Targ1, _Targ2, _Targ3, _Targ4, _Targ5), 
01548         typename arg_info<_Targ1>::argument_t arg1, 
01549         typename arg_info<_Targ2>::argument_t arg2,
01550         typename arg_info<_Targ3>::argument_t arg3,
01551         typename arg_info<_Targ4>::argument_t arg4,
01552         typename arg_info<_Targ5>::argument_t arg5
01553     )
01554 {
01555     for_all(cont, value_func_5_t<_Tret, _Tcontainer::value_type, _Targ1, _Targ2, _Targ3, _Targ4, _Targ5>(func, arg1, arg2, arg3, arg4, arg5));
01556 }
01557 
01560 template<typename _Targ1, typename _Targ2, typename _Targ3, typename _Targ4, typename _Targ5, typename _Tret, typename _Tcontainer, typename _Tval>
01561 void for_all_val(
01562         _Tcontainer& cont, 
01563         _Tret (_Tval::*func)(_Targ1, _Targ2, _Targ3, _Targ4, _Targ5) const, 
01564         typename arg_info<_Targ1>::argument_t arg1, 
01565         typename arg_info<_Targ2>::argument_t arg2,
01566         typename arg_info<_Targ3>::argument_t arg3,
01567         typename arg_info<_Targ4>::argument_t arg4,
01568         typename arg_info<_Targ5>::argument_t arg5
01569     )
01570 {
01571     for_all(cont, const_value_func_5_t<_Tret, _Tcontainer::value_type, _Targ1, _Targ2, _Targ3, _Targ4, _Targ5>(func, arg1, arg2, arg3, arg4, arg5));
01572 }
01573 
01574 }; // namespace
01575 
01576 #endif // _FOR_ALL_H_

  Hosted on code.google.com  
© Marcus Börger
Generated on Fri Jan 18 21:21:07 2008 for MBO-lib by doxygen 1.5.4