#ifndef BOOST_MEM_FN_HPP_INCLUDED #define BOOST_MEM_FN_HPP_INCLUDED #if _MSC_VER >= 1020 #pragma once #endif // // mem_fn.hpp - a generalization of std::mem_fun[_ref] // // Version 1.02.0001 (2001-08-30) // // Copyright (c) 2001 Peter Dimov and Multi Media Ltd. // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // // See http://www.boost.org/libs/bind/mem_fn.html for documentation. // namespace boost { // get_pointer(p) extracts a ->* capable pointer from p template T * get_pointer(T * p) { return p; } // implementation of get_pointer for boost::shared_ptr // this will probably migrate to boost/shared_ptr.hpp template class shared_ptr; template T * get_pointer(shared_ptr const & p) { return p.get(); } // namespace _mfi // mem_fun_impl { // mf0 template class mf0 { public: typedef R result_type; typedef T * first_argument_type; private: typedef R (T::*F) (); F f_; public: explicit mf0(F f): f_(f) {} R operator()(T * p) const { return (p->*f_)(); } template R operator()(U & u) const { return (get_pointer(u)->*f_)(); } R operator()(T & t) const { return (t.*f_)(); } }; // cmf0 template class cmf0 { public: typedef R result_type; typedef T const * first_argument_type; private: typedef R (T::*F) () const; F f_; public: explicit cmf0(F f): f_(f) {} template R operator()(U const & u) const { return (get_pointer(u)->*f_)(); } R operator()(T const & t) const { return (t.*f_)(); } }; // mf1 template class mf1 { public: typedef R result_type; typedef T * first_argument_type; typedef A1 second_argument_type; private: typedef R (T::*F) (A1); F f_; public: explicit mf1(F f): f_(f) {} R operator()(T * p, A1 a1) const { return (p->*f_)(a1); } template R operator()(U & u, A1 a1) const { return (get_pointer(u)->*f_)(a1); } R operator()(T & t, A1 a1) const { return (t.*f_)(a1); } }; // cmf1 template class cmf1 { public: typedef R result_type; typedef T const * first_argument_type; typedef A1 second_argument_type; private: typedef R (T::*F) (A1) const; F f_; public: explicit cmf1(F f): f_(f) {} template R operator()(U const & u, A1 a1) const { return (get_pointer(u)->*f_)(a1); } R operator()(T const & t, A1 a1) const { return (t.*f_)(a1); } }; // mf2 template class mf2 { public: typedef R result_type; private: typedef R (T::*F) (A1, A2); F f_; public: explicit mf2(F f): f_(f) {} R operator()(T * p, A1 a1, A2 a2) const { return (p->*f_)(a1, a2); } template R operator()(U & u, A1 a1, A2 a2) const { return (get_pointer(u)->*f_)(a1, a2); } R operator()(T & t, A1 a1, A2 a2) const { return (t.*f_)(a1, a2); } }; // cmf2 template class cmf2 { public: typedef R result_type; private: typedef R (T::*F) (A1, A2) const; F f_; public: explicit cmf2(F f): f_(f) {} template R operator()(U const & u, A1 a1, A2 a2) const { return (get_pointer(u)->*f_)(a1, a2); } R operator()(T const & t, A1 a1, A2 a2) const { return (t.*f_)(a1, a2); } }; // mf3 template class mf3 { public: typedef R result_type; private: typedef R (T::*F) (A1, A2, A3); F f_; public: explicit mf3(F f): f_(f) {} R operator()(T * p, A1 a1, A2 a2, A3 a3) const { return (p->*f_)(a1, a2, a3); } template R operator()(U & u, A1 a1, A2 a2, A3 a3) const { return (get_pointer(u)->*f_)(a1, a2, a3); } R operator()(T & t, A1 a1, A2 a2, A3 a3) const { return (t.*f_)(a1, a2, a3); } }; // cmf3 template class cmf3 { public: typedef R result_type; private: typedef R (T::*F) (A1, A2, A3) const; F f_; public: explicit cmf3(F f): f_(f) {} template R operator()(U const & u, A1 a1, A2 a2, A3 a3) const { return (get_pointer(u)->*f_)(a1, a2, a3); } R operator()(T const & t, A1 a1, A2 a2, A3 a3) const { return (t.*f_)(a1, a2, a3); } }; // mf4 template class mf4 { public: typedef R result_type; private: typedef R (T::*F) (A1, A2, A3, A4); F f_; public: explicit mf4(F f): f_(f) {} R operator()(T * p, A1 a1, A2 a2, A3 a3, A4 a4) const { return (p->*f_)(a1, a2, a3, a4); } template R operator()(U & u, A1 a1, A2 a2, A3 a3, A4 a4) const { return (get_pointer(u)->*f_)(a1, a2, a3, a4); } R operator()(T & t, A1 a1, A2 a2, A3 a3, A4 a4) const { return (t.*f_)(a1, a2, a3, a4); } }; // cmf4 template class cmf4 { public: typedef R result_type; private: typedef R (T::*F) (A1, A2, A3, A4) const; F f_; public: explicit cmf4(F f): f_(f) {} template R operator()(U const & u, A1 a1, A2 a2, A3 a3, A4 a4) const { return (get_pointer(u)->*f_)(a1, a2, a3, a4); } R operator()(T const & t, A1 a1, A2 a2, A3 a3, A4 a4) const { return (t.*f_)(a1, a2, a3, a4); } }; // mf5 template class mf5 { public: typedef R result_type; private: typedef R (T::*F) (A1, A2, A3, A4, A5); F f_; public: explicit mf5(F f): f_(f) {} R operator()(T * p, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) const { return (p->*f_)(a1, a2, a3, a4, a5); } template R operator()(U & u, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) const { return (get_pointer(u)->*f_)(a1, a2, a3, a4, a5); } R operator()(T & t, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) const { return (t.*f_)(a1, a2, a3, a4, a5); } }; // cmf5 template class cmf5 { public: typedef R result_type; private: typedef R (T::*F) (A1, A2, A3, A4, A5) const; F f_; public: explicit cmf5(F f): f_(f) {} template R operator()(U const & u, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) const { return (get_pointer(u)->*f_)(a1, a2, a3, a4, a5); } R operator()(T const & t, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) const { return (t.*f_)(a1, a2, a3, a4, a5); } }; // mf6 template class mf6 { public: typedef R result_type; private: typedef R (T::*F) (A1, A2, A3, A4, A5, A6); F f_; public: explicit mf6(F f): f_(f) {} R operator()(T * p, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) const { return (p->*f_)(a1, a2, a3, a4, a5, a6); } template R operator()(U & u, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) const { return (get_pointer(u)->*f_)(a1, a2, a3, a4, a5, a6); } R operator()(T & t, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) const { return (t.*f_)(a1, a2, a3, a4, a5, a6); } }; // cmf6 template class cmf6 { public: typedef R result_type; private: typedef R (T::*F) (A1, A2, A3, A4, A5, A6) const; F f_; public: explicit cmf6(F f): f_(f) {} template R operator()(U const & u, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) const { return (get_pointer(u)->*f_)(a1, a2, a3, a4, a5, a6); } R operator()(T const & t, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) const { return (t.*f_)(a1, a2, a3, a4, a5, a6); } }; // mf7 template class mf7 { public: typedef R result_type; private: typedef R (T::*F) (A1, A2, A3, A4, A5, A6, A7); F f_; public: explicit mf7(F f): f_(f) {} R operator()(T * p, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) const { return (p->*f_)(a1, a2, a3, a4, a5, a6, a7); } template R operator()(U & u, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) const { return (get_pointer(u)->*f_)(a1, a2, a3, a4, a5, a6, a7); } R operator()(T & t, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) const { return (t.*f_)(a1, a2, a3, a4, a5, a6, a7); } }; // cmf7 template class cmf7 { public: typedef R result_type; private: typedef R (T::*F) (A1, A2, A3, A4, A5, A6, A7) const; F f_; public: explicit cmf7(F f): f_(f) {} template R operator()(U const & u, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) const { return (get_pointer(u)->*f_)(a1, a2, a3, a4, a5, a6, a7); } R operator()(T const & t, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) const { return (t.*f_)(a1, a2, a3, a4, a5, a6, a7); } }; // mf8 template class mf8 { public: typedef R result_type; private: typedef R (T::*F) (A1, A2, A3, A4, A5, A6, A7, A8); F f_; public: explicit mf8(F f): f_(f) {} R operator()(T * p, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) const { return (p->*f_)(a1, a2, a3, a4, a5, a6, a7, a8); } template R operator()(U & u, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) const { return (get_pointer(u)->*f_)(a1, a2, a3, a4, a5, a6, a7, a8); } R operator()(T & t, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) const { return (t.*f_)(a1, a2, a3, a4, a5, a6, a7, a8); } }; // cmf8 template class cmf8 { public: typedef R result_type; private: typedef R (T::*F) (A1, A2, A3, A4, A5, A6, A7, A8) const; F f_; public: explicit cmf8(F f): f_(f) {} R operator()(T const * p, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) const { return (p->*f_)(a1, a2, a3, a4, a5, a6, a7, a8); } template R operator()(U const & u, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) const { return (get_pointer(u)->*f_)(a1, a2, a3, a4, a5, a6, a7, a8); } R operator()(T const & t, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) const { return (t.*f_)(a1, a2, a3, a4, a5, a6, a7, a8); } }; } // namespace _mfi // mem_fn template _mfi::mf0 mem_fn(R (T::*f) ()) { return _mfi::mf0(f); } template _mfi::cmf0 mem_fn(R (T::*f) () const) { return _mfi::cmf0(f); } template _mfi::mf1 mem_fn(R (T::*f) (A1)) { return _mfi::mf1(f); } template _mfi::cmf1 mem_fn(R (T::*f) (A1) const) { return _mfi::cmf1(f); } template _mfi::mf2 mem_fn(R (T::*f) (A1, A2)) { return _mfi::mf2(f); } template _mfi::cmf2 mem_fn(R (T::*f) (A1, A2) const) { return _mfi::cmf2(f); } template _mfi::mf3 mem_fn(R (T::*f) (A1, A2, A3)) { return _mfi::mf3(f); } template _mfi::cmf3 mem_fn(R (T::*f) (A1, A2, A3) const) { return _mfi::cmf3(f); } template _mfi::mf4 mem_fn(R (T::*f) (A1, A2, A3, A4)) { return _mfi::mf4(f); } template _mfi::cmf4 mem_fn(R (T::*f) (A1, A2, A3, A4) const) { return _mfi::cmf4(f); } template _mfi::mf5 mem_fn(R (T::*f) (A1, A2, A3, A4, A5)) { return _mfi::mf5(f); } template _mfi::cmf5 mem_fn(R (T::*f) (A1, A2, A3, A4, A5) const) { return _mfi::cmf5(f); } template _mfi::mf6 mem_fn(R (T::*f) (A1, A2, A3, A4, A5, A6)) { return _mfi::mf6(f); } template _mfi::cmf6 mem_fn(R (T::*f) (A1, A2, A3, A4, A5, A6) const) { return _mfi::cmf6(f); } template _mfi::mf7 mem_fn(R (T::*f) (A1, A2, A3, A4, A5, A6, A7)) { return _mfi::mf7(f); } template _mfi::cmf7 mem_fn(R (T::*f) (A1, A2, A3, A4, A5, A6, A7) const) { return _mfi::cmf7(f); } template _mfi::mf8 mem_fn(R (T::*f) (A1, A2, A3, A4, A5, A6, A7, A8)) { return _mfi::mf8(f); } template _mfi::cmf8 mem_fn(R (T::*f) (A1, A2, A3, A4, A5, A6, A7, A8) const) { return _mfi::cmf8(f); } } // namespace boost #endif // #ifndef BOOST_MEM_FN_HPP_INCLUDED