williamr@2: #ifndef BOOST_MEM_FN_HPP_INCLUDED williamr@2: #define BOOST_MEM_FN_HPP_INCLUDED williamr@2: williamr@2: // MS compatible compilers support #pragma once williamr@2: williamr@2: #if defined(_MSC_VER) && (_MSC_VER >= 1020) williamr@2: # pragma once williamr@2: #endif williamr@2: williamr@2: // williamr@2: // mem_fn.hpp - a generalization of std::mem_fun[_ref] williamr@2: // williamr@2: // Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd. williamr@2: // Copyright (c) 2001 David Abrahams williamr@2: // Copyright (c) 2003-2005 Peter Dimov williamr@2: // williamr@2: // Distributed under the Boost Software License, Version 1.0. (See williamr@2: // accompanying file LICENSE_1_0.txt or copy at williamr@2: // http://www.boost.org/LICENSE_1_0.txt) williamr@2: // williamr@2: // See http://www.boost.org/libs/bind/mem_fn.html for documentation. williamr@2: // williamr@2: williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: namespace boost williamr@2: { williamr@2: williamr@2: #if defined(BOOST_NO_VOID_RETURNS) williamr@2: williamr@2: #define BOOST_MEM_FN_CLASS_F , class F williamr@2: #define BOOST_MEM_FN_TYPEDEF(X) williamr@2: williamr@2: namespace _mfi // mem_fun_impl williamr@2: { williamr@2: williamr@2: template struct mf williamr@2: { williamr@2: williamr@2: #define BOOST_MEM_FN_RETURN return williamr@2: williamr@2: #define BOOST_MEM_FN_NAME(X) inner_##X williamr@2: #define BOOST_MEM_FN_CC williamr@2: williamr@2: #include williamr@2: williamr@2: #undef BOOST_MEM_FN_CC williamr@2: #undef BOOST_MEM_FN_NAME williamr@2: williamr@2: #ifdef BOOST_MEM_FN_ENABLE_CDECL williamr@2: williamr@2: #define BOOST_MEM_FN_NAME(X) inner_##X##_cdecl williamr@2: #define BOOST_MEM_FN_CC __cdecl williamr@2: williamr@2: #include williamr@2: williamr@2: #undef BOOST_MEM_FN_CC williamr@2: #undef BOOST_MEM_FN_NAME williamr@2: williamr@2: #endif williamr@2: williamr@2: #ifdef BOOST_MEM_FN_ENABLE_STDCALL williamr@2: williamr@2: #define BOOST_MEM_FN_NAME(X) inner_##X##_stdcall williamr@2: #define BOOST_MEM_FN_CC __stdcall williamr@2: williamr@2: #include williamr@2: williamr@2: #undef BOOST_MEM_FN_CC williamr@2: #undef BOOST_MEM_FN_NAME williamr@2: williamr@2: #endif williamr@2: williamr@2: #ifdef BOOST_MEM_FN_ENABLE_FASTCALL williamr@2: williamr@2: #define BOOST_MEM_FN_NAME(X) inner_##X##_fastcall williamr@2: #define BOOST_MEM_FN_CC __fastcall williamr@2: williamr@2: #include williamr@2: williamr@2: #undef BOOST_MEM_FN_CC williamr@2: #undef BOOST_MEM_FN_NAME williamr@2: williamr@2: #endif williamr@2: williamr@2: #undef BOOST_MEM_FN_RETURN williamr@2: williamr@2: }; // struct mf williamr@2: williamr@2: template<> struct mf williamr@2: { williamr@2: williamr@2: #define BOOST_MEM_FN_RETURN williamr@2: williamr@2: #define BOOST_MEM_FN_NAME(X) inner_##X williamr@2: #define BOOST_MEM_FN_CC williamr@2: williamr@2: #include williamr@2: williamr@2: #undef BOOST_MEM_FN_CC williamr@2: #undef BOOST_MEM_FN_NAME williamr@2: williamr@2: #ifdef BOOST_MEM_FN_ENABLE_CDECL williamr@2: williamr@2: #define BOOST_MEM_FN_NAME(X) inner_##X##_cdecl williamr@2: #define BOOST_MEM_FN_CC __cdecl williamr@2: williamr@2: #include williamr@2: williamr@2: #undef BOOST_MEM_FN_CC williamr@2: #undef BOOST_MEM_FN_NAME williamr@2: williamr@2: #endif williamr@2: williamr@2: #ifdef BOOST_MEM_FN_ENABLE_STDCALL williamr@2: williamr@2: #define BOOST_MEM_FN_NAME(X) inner_##X##_stdcall williamr@2: #define BOOST_MEM_FN_CC __stdcall williamr@2: williamr@2: #include williamr@2: williamr@2: #undef BOOST_MEM_FN_CC williamr@2: #undef BOOST_MEM_FN_NAME williamr@2: williamr@2: #endif williamr@2: williamr@2: #ifdef BOOST_MEM_FN_ENABLE_FASTCALL williamr@2: williamr@2: #define BOOST_MEM_FN_NAME(X) inner_##X##_fastcall williamr@2: #define BOOST_MEM_FN_CC __fastcall williamr@2: williamr@2: #include williamr@2: williamr@2: #undef BOOST_MEM_FN_CC williamr@2: #undef BOOST_MEM_FN_NAME williamr@2: williamr@2: #endif williamr@2: williamr@2: #undef BOOST_MEM_FN_RETURN williamr@2: williamr@2: }; // struct mf williamr@2: williamr@2: #undef BOOST_MEM_FN_CLASS_F williamr@2: #undef BOOST_MEM_FN_TYPEDEF_F williamr@2: williamr@2: #define BOOST_MEM_FN_NAME(X) X williamr@2: #define BOOST_MEM_FN_NAME2(X) inner_##X williamr@2: #define BOOST_MEM_FN_CC williamr@2: williamr@2: #include williamr@2: williamr@2: #undef BOOST_MEM_FN_NAME williamr@2: #undef BOOST_MEM_FN_NAME2 williamr@2: #undef BOOST_MEM_FN_CC williamr@2: williamr@2: #ifdef BOOST_MEM_FN_ENABLE_CDECL williamr@2: williamr@2: #define BOOST_MEM_FN_NAME(X) X##_cdecl williamr@2: #define BOOST_MEM_FN_NAME2(X) inner_##X##_cdecl williamr@2: #define BOOST_MEM_FN_CC __cdecl williamr@2: williamr@2: #include williamr@2: williamr@2: #undef BOOST_MEM_FN_NAME williamr@2: #undef BOOST_MEM_FN_NAME2 williamr@2: #undef BOOST_MEM_FN_CC williamr@2: williamr@2: #endif williamr@2: williamr@2: #ifdef BOOST_MEM_FN_ENABLE_STDCALL williamr@2: williamr@2: #define BOOST_MEM_FN_NAME(X) X##_stdcall williamr@2: #define BOOST_MEM_FN_NAME2(X) inner_##X##_stdcall williamr@2: #define BOOST_MEM_FN_CC __stdcall williamr@2: williamr@2: #include williamr@2: williamr@2: #undef BOOST_MEM_FN_NAME williamr@2: #undef BOOST_MEM_FN_NAME2 williamr@2: #undef BOOST_MEM_FN_CC williamr@2: williamr@2: #endif williamr@2: williamr@2: #ifdef BOOST_MEM_FN_ENABLE_FASTCALL williamr@2: williamr@2: #define BOOST_MEM_FN_NAME(X) X##_fastcall williamr@2: #define BOOST_MEM_FN_NAME2(X) inner_##X##_fastcall williamr@2: #define BOOST_MEM_FN_CC __fastcall williamr@2: williamr@2: #include williamr@2: williamr@2: #undef BOOST_MEM_FN_NAME williamr@2: #undef BOOST_MEM_FN_NAME2 williamr@2: #undef BOOST_MEM_FN_CC williamr@2: williamr@2: #endif williamr@2: williamr@2: } // namespace _mfi williamr@2: williamr@2: #else // #ifdef BOOST_NO_VOID_RETURNS williamr@2: williamr@2: #define BOOST_MEM_FN_CLASS_F williamr@2: #define BOOST_MEM_FN_TYPEDEF(X) typedef X; williamr@2: williamr@2: namespace _mfi williamr@2: { williamr@2: williamr@2: #define BOOST_MEM_FN_RETURN return williamr@2: williamr@2: #define BOOST_MEM_FN_NAME(X) X williamr@2: #define BOOST_MEM_FN_CC williamr@2: williamr@2: #include williamr@2: williamr@2: #undef BOOST_MEM_FN_CC williamr@2: #undef BOOST_MEM_FN_NAME williamr@2: williamr@2: #ifdef BOOST_MEM_FN_ENABLE_CDECL williamr@2: williamr@2: #define BOOST_MEM_FN_NAME(X) X##_cdecl williamr@2: #define BOOST_MEM_FN_CC __cdecl williamr@2: williamr@2: #include williamr@2: williamr@2: #undef BOOST_MEM_FN_CC williamr@2: #undef BOOST_MEM_FN_NAME williamr@2: williamr@2: #endif williamr@2: williamr@2: #ifdef BOOST_MEM_FN_ENABLE_STDCALL williamr@2: williamr@2: #define BOOST_MEM_FN_NAME(X) X##_stdcall williamr@2: #define BOOST_MEM_FN_CC __stdcall williamr@2: williamr@2: #include williamr@2: williamr@2: #undef BOOST_MEM_FN_CC williamr@2: #undef BOOST_MEM_FN_NAME williamr@2: williamr@2: #endif williamr@2: williamr@2: #ifdef BOOST_MEM_FN_ENABLE_FASTCALL williamr@2: williamr@2: #define BOOST_MEM_FN_NAME(X) X##_fastcall williamr@2: #define BOOST_MEM_FN_CC __fastcall williamr@2: williamr@2: #include williamr@2: williamr@2: #undef BOOST_MEM_FN_CC williamr@2: #undef BOOST_MEM_FN_NAME williamr@2: williamr@2: #endif williamr@2: williamr@2: #undef BOOST_MEM_FN_RETURN williamr@2: williamr@2: } // namespace _mfi williamr@2: williamr@2: #undef BOOST_MEM_FN_CLASS_F williamr@2: #undef BOOST_MEM_FN_TYPEDEF williamr@2: williamr@2: #endif // #ifdef BOOST_NO_VOID_RETURNS williamr@2: williamr@2: #define BOOST_MEM_FN_NAME(X) X williamr@2: #define BOOST_MEM_FN_CC williamr@2: williamr@2: #include williamr@2: williamr@2: #undef BOOST_MEM_FN_NAME williamr@2: #undef BOOST_MEM_FN_CC williamr@2: williamr@2: #ifdef BOOST_MEM_FN_ENABLE_CDECL williamr@2: williamr@2: #define BOOST_MEM_FN_NAME(X) X##_cdecl williamr@2: #define BOOST_MEM_FN_CC __cdecl williamr@2: williamr@2: #include williamr@2: williamr@2: #undef BOOST_MEM_FN_NAME williamr@2: #undef BOOST_MEM_FN_CC williamr@2: williamr@2: #endif williamr@2: williamr@2: #ifdef BOOST_MEM_FN_ENABLE_STDCALL williamr@2: williamr@2: #define BOOST_MEM_FN_NAME(X) X##_stdcall williamr@2: #define BOOST_MEM_FN_CC __stdcall williamr@2: williamr@2: #include williamr@2: williamr@2: #undef BOOST_MEM_FN_NAME williamr@2: #undef BOOST_MEM_FN_CC williamr@2: williamr@2: #endif williamr@2: williamr@2: #ifdef BOOST_MEM_FN_ENABLE_FASTCALL williamr@2: williamr@2: #define BOOST_MEM_FN_NAME(X) X##_fastcall williamr@2: #define BOOST_MEM_FN_CC __fastcall williamr@2: williamr@2: #include williamr@2: williamr@2: #undef BOOST_MEM_FN_NAME williamr@2: #undef BOOST_MEM_FN_CC williamr@2: williamr@2: #endif williamr@2: williamr@2: // data member support williamr@2: williamr@2: namespace _mfi williamr@2: { williamr@2: williamr@2: template class dm williamr@2: { williamr@2: public: williamr@2: williamr@2: typedef R const & result_type; williamr@2: typedef T const * argument_type; williamr@2: williamr@2: private: williamr@2: williamr@2: typedef R (T::*F); williamr@2: F f_; williamr@2: williamr@2: template R const & call(U & u, T const *) const williamr@2: { williamr@2: return (u.*f_); williamr@2: } williamr@2: williamr@2: template R const & call(U & u, void const *) const williamr@2: { williamr@2: return (get_pointer(u)->*f_); williamr@2: } williamr@2: williamr@2: public: williamr@2: williamr@2: explicit dm(F f): f_(f) {} williamr@2: williamr@2: R & operator()(T * p) const williamr@2: { williamr@2: return (p->*f_); williamr@2: } williamr@2: williamr@2: R const & operator()(T const * p) const williamr@2: { williamr@2: return (p->*f_); williamr@2: } williamr@2: williamr@2: template R const & operator()(U const & u) const williamr@2: { williamr@2: return call(u, &u); williamr@2: } williamr@2: williamr@2: #if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) && !BOOST_WORKAROUND(__MWERKS__, < 0x3200) williamr@2: williamr@2: R & operator()(T & t) const williamr@2: { williamr@2: return (t.*f_); williamr@2: } williamr@2: williamr@2: R const & operator()(T const & t) const williamr@2: { williamr@2: return (t.*f_); williamr@2: } williamr@2: williamr@2: #endif williamr@2: williamr@2: bool operator==(dm const & rhs) const williamr@2: { williamr@2: return f_ == rhs.f_; williamr@2: } williamr@2: williamr@2: bool operator!=(dm const & rhs) const williamr@2: { williamr@2: return f_ != rhs.f_; williamr@2: } williamr@2: }; williamr@2: williamr@2: } // namespace _mfi williamr@2: williamr@2: template _mfi::dm mem_fn(R T::*f) williamr@2: { williamr@2: return _mfi::dm(f); williamr@2: } williamr@2: williamr@2: } // namespace boost williamr@2: williamr@2: #endif // #ifndef BOOST_MEM_FN_HPP_INCLUDED