diff options
Diffstat (limited to 'boost/intrusive/detail/tree_value_compare.hpp')
-rw-r--r-- | boost/intrusive/detail/tree_value_compare.hpp | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/boost/intrusive/detail/tree_value_compare.hpp b/boost/intrusive/detail/tree_value_compare.hpp new file mode 100644 index 0000000000..a05741edee --- /dev/null +++ b/boost/intrusive/detail/tree_value_compare.hpp @@ -0,0 +1,78 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2015-2015. 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/container for documentation. +// +////////////////////////////////////////////////////////////////////////////// +#ifndef BOOST_INTRUSIVE_DETAIL_TREE_VALUE_COMPARE_HPP +#define BOOST_INTRUSIVE_DETAIL_TREE_VALUE_COMPARE_HPP + +#ifndef BOOST_CONFIG_HPP +# include <boost/config.hpp> +#endif + +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include <boost/intrusive/detail/mpl.hpp> +#include <boost/intrusive/detail/ebo_functor_holder.hpp> + +namespace boost{ +namespace intrusive{ + +template<class Key, class T, class KeyCompare, class KeyOfValue> +struct tree_value_compare + : public boost::intrusive::detail::ebo_functor_holder<KeyCompare> +{ + typedef boost::intrusive::detail::ebo_functor_holder<KeyCompare> base_t; + typedef T value_type; + typedef KeyCompare key_compare; + typedef KeyOfValue key_of_value; + typedef Key key_type; + + explicit tree_value_compare(const key_compare &kcomp) + : base_t(kcomp) + {} + + tree_value_compare() + : base_t() + {} + + const key_compare &key_comp() const + { return static_cast<const key_compare &>(*this); } + + key_compare &key_comp() + { return static_cast<key_compare &>(*this); } + + template<class U> + struct is_key + : boost::intrusive::detail::is_same<const U, const key_type> + {}; + + template<class U> + typename boost::intrusive::detail::enable_if<is_key<U>, const key_type &>::type + key_forward(const U &key) const + { return key; } + + template<class U> + typename boost::intrusive::detail::disable_if<is_key<U>, const key_type &>::type + key_forward(const U &key) const + { return KeyOfValue()(key); } + + template<class KeyType, class KeyType2> + bool operator()(const KeyType &key1, const KeyType2 &key2) const + { return key_compare::operator()(this->key_forward(key1), this->key_forward(key2)); } + + template<class KeyType, class KeyType2> + bool operator()(const KeyType &key1, const KeyType2 &key2) + { return key_compare::operator()(this->key_forward(key1), this->key_forward(key2)); } +}; + +} //namespace intrusive{ +} //namespace boost{ + +#endif //#ifdef BOOST_INTRUSIVE_DETAIL_TREE_VALUE_COMPARE_HPP |