mirror of
https://github.com/boostorg/container.git
synced 2025-08-03 06:24:26 +02:00
Use Intrusive's tree_value_compare class instead of duplicating code
This commit is contained in:
@@ -415,12 +415,12 @@ struct node_alloc_holder
|
|||||||
template<class ConvertibleToAlloc>
|
template<class ConvertibleToAlloc>
|
||||||
members_holder(BOOST_FWD_REF(ConvertibleToAlloc) c2alloc, const value_compare &c)
|
members_holder(BOOST_FWD_REF(ConvertibleToAlloc) c2alloc, const value_compare &c)
|
||||||
: NodeAlloc(boost::forward<ConvertibleToAlloc>(c2alloc))
|
: NodeAlloc(boost::forward<ConvertibleToAlloc>(c2alloc))
|
||||||
, m_icont(typename ICont::value_compare(c))
|
, m_icont(typename ICont::key_compare(c))
|
||||||
{}
|
{}
|
||||||
|
|
||||||
explicit members_holder(const value_compare &c)
|
explicit members_holder(const value_compare &c)
|
||||||
: NodeAlloc()
|
: NodeAlloc()
|
||||||
, m_icont(typename ICont::value_compare(c))
|
, m_icont(typename ICont::key_compare(c))
|
||||||
{}
|
{}
|
||||||
|
|
||||||
//The intrusive container
|
//The intrusive container
|
||||||
|
@@ -43,6 +43,7 @@
|
|||||||
#include <boost/intrusive/sgtree.hpp>
|
#include <boost/intrusive/sgtree.hpp>
|
||||||
// intrusive/detail
|
// intrusive/detail
|
||||||
#include <boost/intrusive/detail/minimal_pair_header.hpp> //pair
|
#include <boost/intrusive/detail/minimal_pair_header.hpp> //pair
|
||||||
|
#include <boost/intrusive/detail/tree_value_compare.hpp> //tree_value_compare
|
||||||
// move
|
// move
|
||||||
#include <boost/move/utility_core.hpp>
|
#include <boost/move/utility_core.hpp>
|
||||||
// move/detail
|
// move/detail
|
||||||
@@ -60,53 +61,7 @@ namespace boost {
|
|||||||
namespace container {
|
namespace container {
|
||||||
namespace container_detail {
|
namespace container_detail {
|
||||||
|
|
||||||
template<class Key, class T, class Compare, class KeyOfValue>
|
using boost::intrusive::tree_value_compare;
|
||||||
struct tree_value_compare
|
|
||||||
: public Compare
|
|
||||||
{
|
|
||||||
typedef T value_type;
|
|
||||||
typedef Compare key_compare;
|
|
||||||
typedef KeyOfValue key_of_value;
|
|
||||||
typedef Key key_type;
|
|
||||||
|
|
||||||
explicit tree_value_compare(const key_compare &kcomp)
|
|
||||||
: Compare(kcomp)
|
|
||||||
{}
|
|
||||||
|
|
||||||
tree_value_compare()
|
|
||||||
: Compare()
|
|
||||||
{}
|
|
||||||
|
|
||||||
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
|
|
||||||
{
|
|
||||||
static const bool value = is_same<const U, const key_type>::value;
|
|
||||||
};
|
|
||||||
|
|
||||||
template<class U>
|
|
||||||
typename enable_if_c<is_key<U>::value, const key_type &>::type
|
|
||||||
key_forward(const U &key) const
|
|
||||||
{ return key; }
|
|
||||||
|
|
||||||
template<class U>
|
|
||||||
typename enable_if_c<!is_key<U>::value, 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)); }
|
|
||||||
};
|
|
||||||
|
|
||||||
template<class VoidPointer, boost::container::tree_type_enum tree_type_value, bool OptimizeSize>
|
template<class VoidPointer, boost::container::tree_type_enum tree_type_value, bool OptimizeSize>
|
||||||
struct intrusive_tree_hook;
|
struct intrusive_tree_hook;
|
||||||
@@ -671,7 +626,7 @@ class tree
|
|||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
this->icont().clone_from
|
this->icont().clone_from
|
||||||
(x.icont(), typename AllocHolder::move_cloner(*this), Destroyer(this->node_alloc()));
|
(boost::move(x.icont()), typename AllocHolder::move_cloner(*this), Destroyer(this->node_alloc()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -738,7 +693,7 @@ class tree
|
|||||||
|
|
||||||
//Now recreate the source tree reusing nodes stored by other_tree
|
//Now recreate the source tree reusing nodes stored by other_tree
|
||||||
this->icont().clone_from
|
this->icont().clone_from
|
||||||
(x.icont()
|
(::boost::move(x.icont())
|
||||||
, RecyclingCloner<AllocHolder, true>(*this, other_tree)
|
, RecyclingCloner<AllocHolder, true>(*this, other_tree)
|
||||||
, Destroyer(this->node_alloc()));
|
, Destroyer(this->node_alloc()));
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user