summaryrefslogtreecommitdiff
path: root/boost/intrusive/detail/tree_value_compare.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/intrusive/detail/tree_value_compare.hpp')
-rw-r--r--boost/intrusive/detail/tree_value_compare.hpp78
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