///////////////////////////////////////////////////////////////////////////// | |
// | |
// (C) Copyright Joaquin M Lopez Munoz 2006-2009 | |
// | |
// 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/intrusive for documentation. | |
// | |
///////////////////////////////////////////////////////////////////////////// | |
#ifndef BOOST_INTRUSIVE_DETAIL_EBO_HOLDER_HPP | |
#define BOOST_INTRUSIVE_DETAIL_EBO_HOLDER_HPP | |
#include <boost/intrusive/detail/config_begin.hpp> | |
#include <boost/intrusive/detail/mpl.hpp> | |
namespace boost { | |
namespace intrusive { | |
namespace detail { | |
template<typename T, bool IsEmpty = true> | |
class ebo_functor_holder_impl | |
{ | |
public: | |
ebo_functor_holder_impl() | |
{} | |
ebo_functor_holder_impl(const T& t) | |
: t_(t) | |
{} | |
template<class Arg1, class Arg2> | |
ebo_functor_holder_impl(const Arg1& arg1, const Arg2& arg2) | |
: t_(arg1, arg2) | |
{} | |
T& get(){return t_;} | |
const T& get()const{return t_;} | |
private: | |
T t_; | |
}; | |
template<typename T> | |
class ebo_functor_holder_impl<T, false> | |
: public T | |
{ | |
public: | |
ebo_functor_holder_impl() | |
{} | |
ebo_functor_holder_impl(const T& t) | |
: T(t) | |
{} | |
template<class Arg1, class Arg2> | |
ebo_functor_holder_impl(const Arg1& arg1, const Arg2& arg2) | |
: T(arg1, arg2) | |
{} | |
T& get(){return *this;} | |
const T& get()const{return *this;} | |
}; | |
template<typename T> | |
class ebo_functor_holder | |
: public ebo_functor_holder_impl<T, is_unary_or_binary_function<T>::value> | |
{ | |
private: | |
typedef ebo_functor_holder_impl<T, is_unary_or_binary_function<T>::value> super; | |
public: | |
ebo_functor_holder(){} | |
ebo_functor_holder(const T& t) | |
: super(t) | |
{} | |
template<class Arg1, class Arg2> | |
ebo_functor_holder(const Arg1& arg1, const Arg2& arg2) | |
: super(arg1, arg2) | |
{} | |
ebo_functor_holder& operator=(const ebo_functor_holder& x) | |
{ | |
this->get()=x.get(); | |
return *this; | |
} | |
}; | |
} //namespace detail { | |
} //namespace intrusive { | |
} //namespace boost { | |
#include <boost/intrusive/detail/config_end.hpp> | |
#endif //#ifndef BOOST_INTRUSIVE_DETAIL_EBO_HOLDER_HPP |