Chris@16: ///////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: // (C) Copyright Joaquin M Lopez Munoz 2006-2013 Chris@101: // (C) Copyright Ion Gaztanaga 2014-2014 Chris@16: // Chris@16: // Distributed under the Boost Software License, Version 1.0. Chris@16: // (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: // Chris@16: // See http://www.boost.org/libs/intrusive for documentation. Chris@16: // Chris@16: ///////////////////////////////////////////////////////////////////////////// Chris@16: Chris@16: #ifndef BOOST_INTRUSIVE_DETAIL_EBO_HOLDER_HPP Chris@16: #define BOOST_INTRUSIVE_DETAIL_EBO_HOLDER_HPP Chris@16: Chris@101: #ifndef BOOST_CONFIG_HPP Chris@101: # include Chris@101: #endif Chris@101: Chris@101: #if defined(BOOST_HAS_PRAGMA_ONCE) Chris@101: # pragma once Chris@101: #endif Chris@16: Chris@16: namespace boost { Chris@16: namespace intrusive { Chris@16: namespace detail { Chris@16: Chris@101: #if defined(BOOST_MSVC) || defined(__BORLANDC_) Chris@101: #define BOOST_INTRUSIVE_TT_DECL __cdecl Chris@101: #else Chris@101: #define BOOST_INTRUSIVE_TT_DECL Chris@101: #endif Chris@101: Chris@101: #if defined(_MSC_EXTENSIONS) && !defined(__BORLAND__) && !defined(_WIN64) && !defined(_M_ARM) && !defined(UNDER_CE) Chris@101: #define BOOST_INTRUSIVE_TT_TEST_MSC_FUNC_SIGS Chris@101: #endif Chris@101: Chris@101: template Chris@101: struct is_unary_or_binary_function_impl Chris@101: { static const bool value = false; }; Chris@101: Chris@101: // see boost ticket #4094 Chris@101: // avoid duplicate definitions of is_unary_or_binary_function_impl Chris@101: #ifndef BOOST_INTRUSIVE_TT_TEST_MSC_FUNC_SIGS Chris@101: Chris@101: template Chris@101: struct is_unary_or_binary_function_impl Chris@101: { static const bool value = true; }; Chris@101: Chris@101: template Chris@101: struct is_unary_or_binary_function_impl Chris@101: { static const bool value = true; }; Chris@101: Chris@101: #else // BOOST_INTRUSIVE_TT_TEST_MSC_FUNC_SIGS Chris@101: Chris@101: template Chris@101: struct is_unary_or_binary_function_impl Chris@101: { static const bool value = true; }; Chris@101: Chris@101: #ifndef _MANAGED Chris@101: Chris@101: template Chris@101: struct is_unary_or_binary_function_impl Chris@101: { static const bool value = true; }; Chris@101: Chris@101: #endif Chris@101: Chris@101: template Chris@101: struct is_unary_or_binary_function_impl Chris@101: { static const bool value = true; }; Chris@101: Chris@101: template Chris@101: struct is_unary_or_binary_function_impl Chris@101: { static const bool value = true; }; Chris@101: Chris@101: #endif Chris@101: Chris@101: // see boost ticket #4094 Chris@101: // avoid duplicate definitions of is_unary_or_binary_function_impl Chris@101: #ifndef BOOST_INTRUSIVE_TT_TEST_MSC_FUNC_SIGS Chris@101: Chris@101: template Chris@101: struct is_unary_or_binary_function_impl Chris@101: { static const bool value = true; }; Chris@101: Chris@101: template Chris@101: struct is_unary_or_binary_function_impl Chris@101: { static const bool value = true; }; Chris@101: Chris@101: #else // BOOST_INTRUSIVE_TT_TEST_MSC_FUNC_SIGS Chris@101: Chris@101: template Chris@101: struct is_unary_or_binary_function_impl Chris@101: { static const bool value = true; }; Chris@101: Chris@101: #ifndef _MANAGED Chris@101: Chris@101: template Chris@101: struct is_unary_or_binary_function_impl Chris@101: { static const bool value = true; }; Chris@101: Chris@101: #endif Chris@101: Chris@101: template Chris@101: struct is_unary_or_binary_function_impl Chris@101: { static const bool value = true; }; Chris@101: Chris@101: template Chris@101: struct is_unary_or_binary_function_impl Chris@101: { static const bool value = true; }; Chris@101: Chris@101: #endif Chris@101: Chris@101: // see boost ticket #4094 Chris@101: // avoid duplicate definitions of is_unary_or_binary_function_impl Chris@101: #ifndef BOOST_INTRUSIVE_TT_TEST_MSC_FUNC_SIGS Chris@101: Chris@101: template Chris@101: struct is_unary_or_binary_function_impl Chris@101: { static const bool value = true; }; Chris@101: Chris@101: template Chris@101: struct is_unary_or_binary_function_impl Chris@101: { static const bool value = true; }; Chris@101: Chris@101: #else // BOOST_INTRUSIVE_TT_TEST_MSC_FUNC_SIGS Chris@101: Chris@101: template Chris@101: struct is_unary_or_binary_function_impl Chris@101: { static const bool value = true; }; Chris@101: Chris@101: #ifndef _MANAGED Chris@101: Chris@101: template Chris@101: struct is_unary_or_binary_function_impl Chris@101: { static const bool value = true; }; Chris@101: Chris@101: #endif Chris@101: Chris@101: template Chris@101: struct is_unary_or_binary_function_impl Chris@101: { static const bool value = true; }; Chris@101: Chris@101: template Chris@101: struct is_unary_or_binary_function_impl Chris@101: { static const bool value = true; }; Chris@101: #endif Chris@101: Chris@101: template Chris@101: struct is_unary_or_binary_function_impl Chris@101: { static const bool value = false; }; Chris@101: Chris@101: template Chris@101: struct is_unary_or_binary_function : is_unary_or_binary_function_impl Chris@101: {}; Chris@101: Chris@16: template Chris@16: class ebo_functor_holder_impl Chris@16: { Chris@16: public: Chris@16: ebo_functor_holder_impl() Chris@16: {} Chris@16: ebo_functor_holder_impl(const T& t) Chris@16: : t_(t) Chris@16: {} Chris@16: template Chris@16: ebo_functor_holder_impl(const Arg1& arg1, const Arg2& arg2) Chris@16: : t_(arg1, arg2) Chris@16: {} Chris@16: Chris@16: T& get(){return t_;} Chris@16: const T& get()const{return t_;} Chris@16: Chris@16: private: Chris@16: T t_; Chris@16: }; Chris@16: Chris@16: template Chris@16: class ebo_functor_holder_impl Chris@16: : public T Chris@16: { Chris@16: public: Chris@16: ebo_functor_holder_impl() Chris@16: {} Chris@101: explicit ebo_functor_holder_impl(const T& t) Chris@16: : T(t) Chris@16: {} Chris@16: template Chris@16: ebo_functor_holder_impl(const Arg1& arg1, const Arg2& arg2) Chris@16: : T(arg1, arg2) Chris@16: {} Chris@16: Chris@16: T& get(){return *this;} Chris@16: const T& get()const{return *this;} Chris@16: }; Chris@16: Chris@16: template Chris@16: class ebo_functor_holder Chris@16: : public ebo_functor_holder_impl::value> Chris@16: { Chris@16: private: Chris@16: typedef ebo_functor_holder_impl::value> super; Chris@16: Chris@16: public: Chris@16: ebo_functor_holder(){} Chris@101: explicit ebo_functor_holder(const T& t) Chris@16: : super(t) Chris@16: {} Chris@16: Chris@16: template Chris@16: ebo_functor_holder(const Arg1& arg1, const Arg2& arg2) Chris@16: : super(arg1, arg2) Chris@16: {} Chris@16: Chris@16: ebo_functor_holder& operator=(const ebo_functor_holder& x) Chris@16: { Chris@16: this->get()=x.get(); Chris@16: return *this; Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: } //namespace detail { Chris@16: } //namespace intrusive { Chris@16: } //namespace boost { Chris@16: Chris@16: #endif //#ifndef BOOST_INTRUSIVE_DETAIL_EBO_HOLDER_HPP