You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
389 lines
6.9 KiB
389 lines
6.9 KiB
#ifndef BOOST_BIND_MEM_FN_HPP_INCLUDED |
|
#define BOOST_BIND_MEM_FN_HPP_INCLUDED |
|
|
|
// MS compatible compilers support #pragma once |
|
|
|
#if defined(_MSC_VER) && (_MSC_VER >= 1020) |
|
# pragma once |
|
#endif |
|
|
|
// |
|
// mem_fn.hpp - a generalization of std::mem_fun[_ref] |
|
// |
|
// Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd. |
|
// Copyright (c) 2001 David Abrahams |
|
// Copyright (c) 2003-2005 Peter Dimov |
|
// |
|
// Distributed under the Boost Software License, Version 1.0. (See |
|
// accompanying file LICENSE_1_0.txt or copy at |
|
// http://www.boost.org/LICENSE_1_0.txt) |
|
// |
|
// See http://www.boost.org/libs/bind/mem_fn.html for documentation. |
|
// |
|
|
|
#include <boost/config.hpp> |
|
#include <boost/get_pointer.hpp> |
|
#include <boost/detail/workaround.hpp> |
|
|
|
namespace boost |
|
{ |
|
|
|
#if defined(BOOST_NO_VOID_RETURNS) |
|
|
|
#define BOOST_MEM_FN_CLASS_F , class F |
|
#define BOOST_MEM_FN_TYPEDEF(X) |
|
|
|
namespace _mfi // mem_fun_impl |
|
{ |
|
|
|
template<class V> struct mf |
|
{ |
|
|
|
#define BOOST_MEM_FN_RETURN return |
|
|
|
#define BOOST_MEM_FN_NAME(X) inner_##X |
|
#define BOOST_MEM_FN_CC |
|
|
|
#include <boost/bind/mem_fn_template.hpp> |
|
|
|
#undef BOOST_MEM_FN_CC |
|
#undef BOOST_MEM_FN_NAME |
|
|
|
#ifdef BOOST_MEM_FN_ENABLE_CDECL |
|
|
|
#define BOOST_MEM_FN_NAME(X) inner_##X##_cdecl |
|
#define BOOST_MEM_FN_CC __cdecl |
|
|
|
#include <boost/bind/mem_fn_template.hpp> |
|
|
|
#undef BOOST_MEM_FN_CC |
|
#undef BOOST_MEM_FN_NAME |
|
|
|
#endif |
|
|
|
#ifdef BOOST_MEM_FN_ENABLE_STDCALL |
|
|
|
#define BOOST_MEM_FN_NAME(X) inner_##X##_stdcall |
|
#define BOOST_MEM_FN_CC __stdcall |
|
|
|
#include <boost/bind/mem_fn_template.hpp> |
|
|
|
#undef BOOST_MEM_FN_CC |
|
#undef BOOST_MEM_FN_NAME |
|
|
|
#endif |
|
|
|
#ifdef BOOST_MEM_FN_ENABLE_FASTCALL |
|
|
|
#define BOOST_MEM_FN_NAME(X) inner_##X##_fastcall |
|
#define BOOST_MEM_FN_CC __fastcall |
|
|
|
#include <boost/bind/mem_fn_template.hpp> |
|
|
|
#undef BOOST_MEM_FN_CC |
|
#undef BOOST_MEM_FN_NAME |
|
|
|
#endif |
|
|
|
#undef BOOST_MEM_FN_RETURN |
|
|
|
}; // struct mf<V> |
|
|
|
template<> struct mf<void> |
|
{ |
|
|
|
#define BOOST_MEM_FN_RETURN |
|
|
|
#define BOOST_MEM_FN_NAME(X) inner_##X |
|
#define BOOST_MEM_FN_CC |
|
|
|
#include <boost/bind/mem_fn_template.hpp> |
|
|
|
#undef BOOST_MEM_FN_CC |
|
#undef BOOST_MEM_FN_NAME |
|
|
|
#ifdef BOOST_MEM_FN_ENABLE_CDECL |
|
|
|
#define BOOST_MEM_FN_NAME(X) inner_##X##_cdecl |
|
#define BOOST_MEM_FN_CC __cdecl |
|
|
|
#include <boost/bind/mem_fn_template.hpp> |
|
|
|
#undef BOOST_MEM_FN_CC |
|
#undef BOOST_MEM_FN_NAME |
|
|
|
#endif |
|
|
|
#ifdef BOOST_MEM_FN_ENABLE_STDCALL |
|
|
|
#define BOOST_MEM_FN_NAME(X) inner_##X##_stdcall |
|
#define BOOST_MEM_FN_CC __stdcall |
|
|
|
#include <boost/bind/mem_fn_template.hpp> |
|
|
|
#undef BOOST_MEM_FN_CC |
|
#undef BOOST_MEM_FN_NAME |
|
|
|
#endif |
|
|
|
#ifdef BOOST_MEM_FN_ENABLE_FASTCALL |
|
|
|
#define BOOST_MEM_FN_NAME(X) inner_##X##_fastcall |
|
#define BOOST_MEM_FN_CC __fastcall |
|
|
|
#include <boost/bind/mem_fn_template.hpp> |
|
|
|
#undef BOOST_MEM_FN_CC |
|
#undef BOOST_MEM_FN_NAME |
|
|
|
#endif |
|
|
|
#undef BOOST_MEM_FN_RETURN |
|
|
|
}; // struct mf<void> |
|
|
|
#undef BOOST_MEM_FN_CLASS_F |
|
#undef BOOST_MEM_FN_TYPEDEF_F |
|
|
|
#define BOOST_MEM_FN_NAME(X) X |
|
#define BOOST_MEM_FN_NAME2(X) inner_##X |
|
#define BOOST_MEM_FN_CC |
|
|
|
#include <boost/bind/mem_fn_vw.hpp> |
|
|
|
#undef BOOST_MEM_FN_NAME |
|
#undef BOOST_MEM_FN_NAME2 |
|
#undef BOOST_MEM_FN_CC |
|
|
|
#ifdef BOOST_MEM_FN_ENABLE_CDECL |
|
|
|
#define BOOST_MEM_FN_NAME(X) X##_cdecl |
|
#define BOOST_MEM_FN_NAME2(X) inner_##X##_cdecl |
|
#define BOOST_MEM_FN_CC __cdecl |
|
|
|
#include <boost/bind/mem_fn_vw.hpp> |
|
|
|
#undef BOOST_MEM_FN_NAME |
|
#undef BOOST_MEM_FN_NAME2 |
|
#undef BOOST_MEM_FN_CC |
|
|
|
#endif |
|
|
|
#ifdef BOOST_MEM_FN_ENABLE_STDCALL |
|
|
|
#define BOOST_MEM_FN_NAME(X) X##_stdcall |
|
#define BOOST_MEM_FN_NAME2(X) inner_##X##_stdcall |
|
#define BOOST_MEM_FN_CC __stdcall |
|
|
|
#include <boost/bind/mem_fn_vw.hpp> |
|
|
|
#undef BOOST_MEM_FN_NAME |
|
#undef BOOST_MEM_FN_NAME2 |
|
#undef BOOST_MEM_FN_CC |
|
|
|
#endif |
|
|
|
#ifdef BOOST_MEM_FN_ENABLE_FASTCALL |
|
|
|
#define BOOST_MEM_FN_NAME(X) X##_fastcall |
|
#define BOOST_MEM_FN_NAME2(X) inner_##X##_fastcall |
|
#define BOOST_MEM_FN_CC __fastcall |
|
|
|
#include <boost/bind/mem_fn_vw.hpp> |
|
|
|
#undef BOOST_MEM_FN_NAME |
|
#undef BOOST_MEM_FN_NAME2 |
|
#undef BOOST_MEM_FN_CC |
|
|
|
#endif |
|
|
|
} // namespace _mfi |
|
|
|
#else // #ifdef BOOST_NO_VOID_RETURNS |
|
|
|
#define BOOST_MEM_FN_CLASS_F |
|
#define BOOST_MEM_FN_TYPEDEF(X) typedef X; |
|
|
|
namespace _mfi |
|
{ |
|
|
|
#define BOOST_MEM_FN_RETURN return |
|
|
|
#define BOOST_MEM_FN_NAME(X) X |
|
#define BOOST_MEM_FN_CC |
|
|
|
#include <boost/bind/mem_fn_template.hpp> |
|
|
|
#undef BOOST_MEM_FN_CC |
|
#undef BOOST_MEM_FN_NAME |
|
|
|
#ifdef BOOST_MEM_FN_ENABLE_CDECL |
|
|
|
#define BOOST_MEM_FN_NAME(X) X##_cdecl |
|
#define BOOST_MEM_FN_CC __cdecl |
|
|
|
#include <boost/bind/mem_fn_template.hpp> |
|
|
|
#undef BOOST_MEM_FN_CC |
|
#undef BOOST_MEM_FN_NAME |
|
|
|
#endif |
|
|
|
#ifdef BOOST_MEM_FN_ENABLE_STDCALL |
|
|
|
#define BOOST_MEM_FN_NAME(X) X##_stdcall |
|
#define BOOST_MEM_FN_CC __stdcall |
|
|
|
#include <boost/bind/mem_fn_template.hpp> |
|
|
|
#undef BOOST_MEM_FN_CC |
|
#undef BOOST_MEM_FN_NAME |
|
|
|
#endif |
|
|
|
#ifdef BOOST_MEM_FN_ENABLE_FASTCALL |
|
|
|
#define BOOST_MEM_FN_NAME(X) X##_fastcall |
|
#define BOOST_MEM_FN_CC __fastcall |
|
|
|
#include <boost/bind/mem_fn_template.hpp> |
|
|
|
#undef BOOST_MEM_FN_CC |
|
#undef BOOST_MEM_FN_NAME |
|
|
|
#endif |
|
|
|
#undef BOOST_MEM_FN_RETURN |
|
|
|
} // namespace _mfi |
|
|
|
#undef BOOST_MEM_FN_CLASS_F |
|
#undef BOOST_MEM_FN_TYPEDEF |
|
|
|
#endif // #ifdef BOOST_NO_VOID_RETURNS |
|
|
|
#define BOOST_MEM_FN_NAME(X) X |
|
#define BOOST_MEM_FN_CC |
|
|
|
#include <boost/bind/mem_fn_cc.hpp> |
|
|
|
#undef BOOST_MEM_FN_NAME |
|
#undef BOOST_MEM_FN_CC |
|
|
|
#ifdef BOOST_MEM_FN_ENABLE_CDECL |
|
|
|
#define BOOST_MEM_FN_NAME(X) X##_cdecl |
|
#define BOOST_MEM_FN_CC __cdecl |
|
|
|
#include <boost/bind/mem_fn_cc.hpp> |
|
|
|
#undef BOOST_MEM_FN_NAME |
|
#undef BOOST_MEM_FN_CC |
|
|
|
#endif |
|
|
|
#ifdef BOOST_MEM_FN_ENABLE_STDCALL |
|
|
|
#define BOOST_MEM_FN_NAME(X) X##_stdcall |
|
#define BOOST_MEM_FN_CC __stdcall |
|
|
|
#include <boost/bind/mem_fn_cc.hpp> |
|
|
|
#undef BOOST_MEM_FN_NAME |
|
#undef BOOST_MEM_FN_CC |
|
|
|
#endif |
|
|
|
#ifdef BOOST_MEM_FN_ENABLE_FASTCALL |
|
|
|
#define BOOST_MEM_FN_NAME(X) X##_fastcall |
|
#define BOOST_MEM_FN_CC __fastcall |
|
|
|
#include <boost/bind/mem_fn_cc.hpp> |
|
|
|
#undef BOOST_MEM_FN_NAME |
|
#undef BOOST_MEM_FN_CC |
|
|
|
#endif |
|
|
|
// data member support |
|
|
|
namespace _mfi |
|
{ |
|
|
|
template<class R, class T> class dm |
|
{ |
|
public: |
|
|
|
typedef R const & result_type; |
|
typedef T const * argument_type; |
|
|
|
private: |
|
|
|
typedef R (T::*F); |
|
F f_; |
|
|
|
template<class U> R const & call(U & u, T const *) const |
|
{ |
|
return (u.*f_); |
|
} |
|
|
|
template<class U> R const & call(U & u, void const *) const |
|
{ |
|
return (get_pointer(u)->*f_); |
|
} |
|
|
|
public: |
|
|
|
explicit dm(F f): f_(f) {} |
|
|
|
R & operator()(T * p) const |
|
{ |
|
return (p->*f_); |
|
} |
|
|
|
R const & operator()(T const * p) const |
|
{ |
|
return (p->*f_); |
|
} |
|
|
|
template<class U> R const & operator()(U const & u) const |
|
{ |
|
return call(u, &u); |
|
} |
|
|
|
#if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) && !BOOST_WORKAROUND(__MWERKS__, < 0x3200) |
|
|
|
R & operator()(T & t) const |
|
{ |
|
return (t.*f_); |
|
} |
|
|
|
R const & operator()(T const & t) const |
|
{ |
|
return (t.*f_); |
|
} |
|
|
|
#endif |
|
|
|
bool operator==(dm const & rhs) const |
|
{ |
|
return f_ == rhs.f_; |
|
} |
|
|
|
bool operator!=(dm const & rhs) const |
|
{ |
|
return f_ != rhs.f_; |
|
} |
|
}; |
|
|
|
} // namespace _mfi |
|
|
|
template<class R, class T> _mfi::dm<R, T> mem_fn(R T::*f) |
|
{ |
|
return _mfi::dm<R, T>(f); |
|
} |
|
|
|
} // namespace boost |
|
|
|
#endif // #ifndef BOOST_BIND_MEM_FN_HPP_INCLUDED
|
|
|