forked from boostorg/unordered
Rename methods to be different for unique/equiv keys
So that the implementation can be moved into a single class. Still some other methods to rename. Some methods didn't need to be renamed (e.g. try_emplace is only used with unique keys), but still renamed for consistency.
This commit is contained in:
@@ -3624,7 +3624,7 @@ template <typename N> struct node_algo
|
||||
|
||||
// Add node 'n' after 'pos'.
|
||||
// This results in a different order to the grouped implementation.
|
||||
static inline void add_to_node_group(node_pointer n, node_pointer pos)
|
||||
static inline void add_to_node(node_pointer n, node_pointer pos)
|
||||
{
|
||||
n->next_ = pos->next_;
|
||||
pos->next_ = n;
|
||||
@@ -3761,7 +3761,7 @@ struct table_unique : boost::unordered::detail::table<Types>
|
||||
|
||||
// equals
|
||||
|
||||
bool equals(table_unique const& other) const
|
||||
bool equals_unique(table const& other) const
|
||||
{
|
||||
if (this->size_ != other.size_)
|
||||
return false;
|
||||
@@ -3779,7 +3779,7 @@ struct table_unique : boost::unordered::detail::table<Types>
|
||||
|
||||
// Emplace/Insert
|
||||
|
||||
inline node_pointer add_node(node_pointer n, std::size_t key_hash)
|
||||
inline node_pointer add_node_unique(node_pointer n, std::size_t key_hash)
|
||||
{
|
||||
n->hash_ = key_hash;
|
||||
|
||||
@@ -3806,27 +3806,28 @@ struct table_unique : boost::unordered::detail::table<Types>
|
||||
return n;
|
||||
}
|
||||
|
||||
inline node_pointer resize_and_add_node(
|
||||
inline node_pointer resize_and_add_node_unique(
|
||||
node_pointer n, std::size_t key_hash)
|
||||
{
|
||||
node_tmp b(n, this->node_alloc());
|
||||
this->reserve_for_insert(this->size_ + 1);
|
||||
return this->add_node(b.release(), key_hash);
|
||||
return this->add_node_unique(b.release(), key_hash);
|
||||
}
|
||||
|
||||
template <BOOST_UNORDERED_EMPLACE_TEMPLATE>
|
||||
iterator emplace_hint_impl(
|
||||
iterator emplace_hint_unique(
|
||||
c_iterator hint, const_key_type& k, BOOST_UNORDERED_EMPLACE_ARGS)
|
||||
{
|
||||
if (hint.node_ && this->key_eq()(k, this->get_key(hint.node_))) {
|
||||
return iterator(hint.node_);
|
||||
} else {
|
||||
return emplace_impl(k, BOOST_UNORDERED_EMPLACE_FORWARD).first;
|
||||
return emplace_unique(k, BOOST_UNORDERED_EMPLACE_FORWARD).first;
|
||||
}
|
||||
}
|
||||
|
||||
template <BOOST_UNORDERED_EMPLACE_TEMPLATE>
|
||||
emplace_return emplace_impl(const_key_type& k, BOOST_UNORDERED_EMPLACE_ARGS)
|
||||
emplace_return emplace_unique(
|
||||
const_key_type& k, BOOST_UNORDERED_EMPLACE_ARGS)
|
||||
{
|
||||
std::size_t key_hash = this->hash(k);
|
||||
node_pointer pos = this->find_node(key_hash, k);
|
||||
@@ -3834,7 +3835,7 @@ struct table_unique : boost::unordered::detail::table<Types>
|
||||
return emplace_return(iterator(pos), false);
|
||||
} else {
|
||||
return emplace_return(
|
||||
iterator(this->resize_and_add_node(
|
||||
iterator(this->resize_and_add_node_unique(
|
||||
boost::unordered::detail::func::construct_node_from_args(
|
||||
this->node_alloc(), BOOST_UNORDERED_EMPLACE_FORWARD),
|
||||
key_hash)),
|
||||
@@ -3843,7 +3844,7 @@ struct table_unique : boost::unordered::detail::table<Types>
|
||||
}
|
||||
|
||||
template <BOOST_UNORDERED_EMPLACE_TEMPLATE>
|
||||
iterator emplace_hint_impl(
|
||||
iterator emplace_hint_unique(
|
||||
c_iterator hint, no_key, BOOST_UNORDERED_EMPLACE_ARGS)
|
||||
{
|
||||
node_tmp b(boost::unordered::detail::func::construct_node_from_args(
|
||||
@@ -3858,12 +3859,13 @@ struct table_unique : boost::unordered::detail::table<Types>
|
||||
if (pos) {
|
||||
return iterator(pos);
|
||||
} else {
|
||||
return iterator(this->resize_and_add_node(b.release(), key_hash));
|
||||
return iterator(
|
||||
this->resize_and_add_node_unique(b.release(), key_hash));
|
||||
}
|
||||
}
|
||||
|
||||
template <BOOST_UNORDERED_EMPLACE_TEMPLATE>
|
||||
emplace_return emplace_impl(no_key, BOOST_UNORDERED_EMPLACE_ARGS)
|
||||
emplace_return emplace_unique(no_key, BOOST_UNORDERED_EMPLACE_ARGS)
|
||||
{
|
||||
node_tmp b(boost::unordered::detail::func::construct_node_from_args(
|
||||
this->node_alloc(), BOOST_UNORDERED_EMPLACE_FORWARD),
|
||||
@@ -3874,14 +3876,14 @@ struct table_unique : boost::unordered::detail::table<Types>
|
||||
if (pos) {
|
||||
return emplace_return(iterator(pos), false);
|
||||
} else {
|
||||
return emplace_return(
|
||||
iterator(this->resize_and_add_node(b.release(), key_hash)),
|
||||
return emplace_return(iterator(this->resize_and_add_node_unique(
|
||||
b.release(), key_hash)),
|
||||
true);
|
||||
}
|
||||
}
|
||||
|
||||
template <typename Key>
|
||||
emplace_return try_emplace_impl(BOOST_FWD_REF(Key) k)
|
||||
emplace_return try_emplace_unique(BOOST_FWD_REF(Key) k)
|
||||
{
|
||||
std::size_t key_hash = this->hash(k);
|
||||
node_pointer pos = this->find_node(key_hash, k);
|
||||
@@ -3889,7 +3891,7 @@ struct table_unique : boost::unordered::detail::table<Types>
|
||||
return emplace_return(iterator(pos), false);
|
||||
} else {
|
||||
return emplace_return(
|
||||
iterator(this->resize_and_add_node(
|
||||
iterator(this->resize_and_add_node_unique(
|
||||
boost::unordered::detail::func::construct_node_pair(
|
||||
this->node_alloc(), boost::forward<Key>(k)),
|
||||
key_hash)),
|
||||
@@ -3898,17 +3900,17 @@ struct table_unique : boost::unordered::detail::table<Types>
|
||||
}
|
||||
|
||||
template <typename Key>
|
||||
iterator try_emplace_hint_impl(c_iterator hint, BOOST_FWD_REF(Key) k)
|
||||
iterator try_emplace_hint_unique(c_iterator hint, BOOST_FWD_REF(Key) k)
|
||||
{
|
||||
if (hint.node_ && this->key_eq()(hint->first, k)) {
|
||||
return iterator(hint.node_);
|
||||
} else {
|
||||
return try_emplace_impl(k).first;
|
||||
return try_emplace_unique(k).first;
|
||||
}
|
||||
}
|
||||
|
||||
template <typename Key, BOOST_UNORDERED_EMPLACE_TEMPLATE>
|
||||
emplace_return try_emplace_impl(
|
||||
emplace_return try_emplace_unique(
|
||||
BOOST_FWD_REF(Key) k, BOOST_UNORDERED_EMPLACE_ARGS)
|
||||
{
|
||||
std::size_t key_hash = this->hash(k);
|
||||
@@ -3917,7 +3919,7 @@ struct table_unique : boost::unordered::detail::table<Types>
|
||||
return emplace_return(iterator(pos), false);
|
||||
} else {
|
||||
return emplace_return(
|
||||
iterator(this->resize_and_add_node(
|
||||
iterator(this->resize_and_add_node_unique(
|
||||
boost::unordered::detail::func::
|
||||
construct_node_pair_from_args(this->node_alloc(),
|
||||
boost::forward<Key>(k),
|
||||
@@ -3928,18 +3930,18 @@ struct table_unique : boost::unordered::detail::table<Types>
|
||||
}
|
||||
|
||||
template <typename Key, BOOST_UNORDERED_EMPLACE_TEMPLATE>
|
||||
iterator try_emplace_hint_impl(
|
||||
iterator try_emplace_hint_unique(
|
||||
c_iterator hint, BOOST_FWD_REF(Key) k, BOOST_UNORDERED_EMPLACE_ARGS)
|
||||
{
|
||||
if (hint.node_ && this->key_eq()(hint->first, k)) {
|
||||
return iterator(hint.node_);
|
||||
} else {
|
||||
return try_emplace_impl(k, BOOST_UNORDERED_EMPLACE_FORWARD).first;
|
||||
return try_emplace_unique(k, BOOST_UNORDERED_EMPLACE_FORWARD).first;
|
||||
}
|
||||
}
|
||||
|
||||
template <typename Key, typename M>
|
||||
emplace_return insert_or_assign_impl(
|
||||
emplace_return insert_or_assign_unique(
|
||||
BOOST_FWD_REF(Key) k, BOOST_FWD_REF(M) obj)
|
||||
{
|
||||
std::size_t key_hash = this->hash(k);
|
||||
@@ -3950,7 +3952,7 @@ struct table_unique : boost::unordered::detail::table<Types>
|
||||
return emplace_return(iterator(pos), false);
|
||||
} else {
|
||||
return emplace_return(
|
||||
iterator(this->resize_and_add_node(
|
||||
iterator(this->resize_and_add_node_unique(
|
||||
boost::unordered::detail::func::construct_node_pair(
|
||||
this->node_alloc(), boost::forward<Key>(k),
|
||||
boost::forward<M>(obj)),
|
||||
@@ -3960,7 +3962,7 @@ struct table_unique : boost::unordered::detail::table<Types>
|
||||
}
|
||||
|
||||
template <typename NodeType, typename InsertReturnType>
|
||||
void move_insert_node_type(NodeType& np, InsertReturnType& result)
|
||||
void move_insert_node_type_unique(NodeType& np, InsertReturnType& result)
|
||||
{
|
||||
if (np) {
|
||||
const_key_type& k = this->get_key(np.ptr_);
|
||||
@@ -3972,7 +3974,8 @@ struct table_unique : boost::unordered::detail::table<Types>
|
||||
result.position = iterator(pos);
|
||||
} else {
|
||||
this->reserve_for_insert(this->size_ + 1);
|
||||
result.position = iterator(this->add_node(np.ptr_, key_hash));
|
||||
result.position =
|
||||
iterator(this->add_node_unique(np.ptr_, key_hash));
|
||||
result.inserted = true;
|
||||
np.ptr_ = node_pointer();
|
||||
}
|
||||
@@ -3980,7 +3983,8 @@ struct table_unique : boost::unordered::detail::table<Types>
|
||||
}
|
||||
|
||||
template <typename NodeType>
|
||||
iterator move_insert_node_type_with_hint(c_iterator hint, NodeType& np)
|
||||
iterator move_insert_node_type_with_hint_unique(
|
||||
c_iterator hint, NodeType& np)
|
||||
{
|
||||
if (!np) {
|
||||
return iterator();
|
||||
@@ -3993,14 +3997,14 @@ struct table_unique : boost::unordered::detail::table<Types>
|
||||
node_pointer pos = this->find_node(key_hash, k);
|
||||
if (!pos) {
|
||||
this->reserve_for_insert(this->size_ + 1);
|
||||
pos = this->add_node(np.ptr_, key_hash);
|
||||
pos = this->add_node_unique(np.ptr_, key_hash);
|
||||
np.ptr_ = node_pointer();
|
||||
}
|
||||
return iterator(pos);
|
||||
}
|
||||
|
||||
template <typename Types2>
|
||||
void merge_impl(boost::unordered::detail::table<Types2>& other)
|
||||
void merge_unique(boost::unordered::detail::table<Types2>& other)
|
||||
{
|
||||
typedef boost::unordered::detail::table<Types2> other_table;
|
||||
BOOST_STATIC_ASSERT(
|
||||
@@ -4025,7 +4029,7 @@ struct table_unique : boost::unordered::detail::table<Types>
|
||||
prev->next_ = n->next_;
|
||||
--other.size_;
|
||||
other.fix_bucket(other.hash_to_bucket(n->hash_), prev);
|
||||
this->add_node(n, key_hash);
|
||||
this->add_node_unique(n, key_hash);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4038,20 +4042,20 @@ struct table_unique : boost::unordered::detail::table<Types>
|
||||
// safety strong otherwise
|
||||
|
||||
template <class InputIt>
|
||||
void insert_range_impl(const_key_type& k, InputIt i, InputIt j)
|
||||
void insert_range_unique(const_key_type& k, InputIt i, InputIt j)
|
||||
{
|
||||
insert_range_impl2(k, i, j);
|
||||
insert_range_unique2(k, i, j);
|
||||
|
||||
while (++i != j) {
|
||||
// Note: can't use get_key as '*i' might not be value_type - it
|
||||
// could be a pair with first_types as key_type without const or
|
||||
// a different second_type.
|
||||
insert_range_impl2(extractor::extract(*i), i, j);
|
||||
insert_range_unique2(extractor::extract(*i), i, j);
|
||||
}
|
||||
}
|
||||
|
||||
template <class InputIt>
|
||||
void insert_range_impl2(const_key_type& k, InputIt i, InputIt j)
|
||||
void insert_range_unique2(const_key_type& k, InputIt i, InputIt j)
|
||||
{
|
||||
// No side effects in this initial code
|
||||
std::size_t key_hash = this->hash(k);
|
||||
@@ -4064,12 +4068,12 @@ struct table_unique : boost::unordered::detail::table<Types>
|
||||
if (this->size_ + 1 > this->max_load_)
|
||||
this->reserve_for_insert(
|
||||
this->size_ + boost::unordered::detail::insert_size(i, j));
|
||||
this->add_node(b.release(), key_hash);
|
||||
this->add_node_unique(b.release(), key_hash);
|
||||
}
|
||||
}
|
||||
|
||||
template <class InputIt>
|
||||
void insert_range_impl(no_key, InputIt i, InputIt j)
|
||||
void insert_range_unique(no_key, InputIt i, InputIt j)
|
||||
{
|
||||
node_constructor a(this->node_alloc());
|
||||
|
||||
@@ -4091,7 +4095,7 @@ struct table_unique : boost::unordered::detail::table<Types>
|
||||
// reserve has basic exception safety if the hash function
|
||||
// throws, strong otherwise.
|
||||
this->reserve_for_insert(this->size_ + 1);
|
||||
this->add_node(b.release(), key_hash);
|
||||
this->add_node_unique(b.release(), key_hash);
|
||||
}
|
||||
} while (++i != j);
|
||||
}
|
||||
@@ -4099,7 +4103,7 @@ struct table_unique : boost::unordered::detail::table<Types>
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// Extract
|
||||
|
||||
inline node_pointer extract_by_iterator(c_iterator i)
|
||||
inline node_pointer extract_by_iterator_unique(c_iterator i)
|
||||
{
|
||||
node_pointer n = i.node_;
|
||||
BOOST_ASSERT(n);
|
||||
@@ -4121,7 +4125,7 @@ struct table_unique : boost::unordered::detail::table<Types>
|
||||
//
|
||||
// no throw
|
||||
|
||||
std::size_t erase_key(const_key_type& k)
|
||||
std::size_t erase_key_unique(const_key_type& k)
|
||||
{
|
||||
if (!this->size_)
|
||||
return 0;
|
||||
@@ -4136,7 +4140,7 @@ struct table_unique : boost::unordered::detail::table<Types>
|
||||
return 1;
|
||||
}
|
||||
|
||||
void erase_nodes(node_pointer i, node_pointer j)
|
||||
void erase_nodes_unique(node_pointer i, node_pointer j)
|
||||
{
|
||||
std::size_t bucket_index = this->hash_to_bucket(i->hash_);
|
||||
|
||||
@@ -4153,15 +4157,16 @@ struct table_unique : boost::unordered::detail::table<Types>
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// fill_buckets
|
||||
// fill_buckets_unique
|
||||
|
||||
void copy_buckets(table const& src)
|
||||
{
|
||||
this->create_buckets(this->bucket_count_);
|
||||
|
||||
for (node_pointer n = src.begin(); n; n = node_algo::next_node(n)) {
|
||||
this->add_node(boost::unordered::detail::func::construct_node(
|
||||
this->node_alloc(), n->value()),
|
||||
this->add_node_unique(
|
||||
boost::unordered::detail::func::construct_node(
|
||||
this->node_alloc(), n->value()),
|
||||
n->hash_);
|
||||
}
|
||||
}
|
||||
@@ -4171,8 +4176,9 @@ struct table_unique : boost::unordered::detail::table<Types>
|
||||
this->create_buckets(this->bucket_count_);
|
||||
|
||||
for (node_pointer n = src.begin(); n; n = node_algo::next_node(n)) {
|
||||
this->add_node(boost::unordered::detail::func::construct_node(
|
||||
this->node_alloc(), boost::move(n->value())),
|
||||
this->add_node_unique(
|
||||
boost::unordered::detail::func::construct_node(
|
||||
this->node_alloc(), boost::move(n->value())),
|
||||
n->hash_);
|
||||
}
|
||||
}
|
||||
@@ -4181,7 +4187,7 @@ struct table_unique : boost::unordered::detail::table<Types>
|
||||
{
|
||||
node_holder<node_allocator> holder(*this);
|
||||
for (node_pointer n = src.begin(); n; n = node_algo::next_node(n)) {
|
||||
this->add_node(holder.copy_of(n->value()), n->hash_);
|
||||
this->add_node_unique(holder.copy_of(n->value()), n->hash_);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4189,7 +4195,7 @@ struct table_unique : boost::unordered::detail::table<Types>
|
||||
{
|
||||
node_holder<node_allocator> holder(*this);
|
||||
for (node_pointer n = src.begin(); n; n = node_algo::next_node(n)) {
|
||||
this->add_node(holder.move_copy_of(n->value()), n->hash_);
|
||||
this->add_node_unique(holder.move_copy_of(n->value()), n->hash_);
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -4297,7 +4303,7 @@ template <typename N> struct grouped_node_algo
|
||||
// If 'pos' is the first node in group, add to the end of the group,
|
||||
// otherwise add before 'pos'. Other versions will probably behave
|
||||
// differently.
|
||||
static inline void add_to_node_group(node_pointer n, node_pointer pos)
|
||||
static inline void add_to_node(node_pointer n, node_pointer pos)
|
||||
{
|
||||
n->next_ = pos->group_prev_->next_;
|
||||
n->group_prev_ = pos->group_prev_;
|
||||
@@ -4458,13 +4464,13 @@ struct table_equiv : boost::unordered::detail::table<Types>
|
||||
this->move_buckets_from(x);
|
||||
} else if (x.size_) {
|
||||
// TODO: Could pick new bucket size?
|
||||
this->move_buckets(x);
|
||||
this->move_buckets_equiv(x);
|
||||
}
|
||||
}
|
||||
|
||||
// Equality
|
||||
|
||||
bool equals(table_equiv const& other) const
|
||||
bool equals_equiv(table const& other) const
|
||||
{
|
||||
if (this->size_ != other.size_)
|
||||
return false;
|
||||
@@ -4475,7 +4481,7 @@ struct table_equiv : boost::unordered::detail::table<Types>
|
||||
return false;
|
||||
node_pointer end1 = node_algo::next_group(n1, this);
|
||||
node_pointer end2 = node_algo::next_group(n2, this);
|
||||
if (!group_equals(n1, end1, n2, end2))
|
||||
if (!group_equals_equiv(n1, end1, n2, end2))
|
||||
return false;
|
||||
n1 = end1;
|
||||
}
|
||||
@@ -4483,7 +4489,7 @@ struct table_equiv : boost::unordered::detail::table<Types>
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool group_equals(
|
||||
static bool group_equals_equiv(
|
||||
node_pointer n1, node_pointer end1, node_pointer n2, node_pointer end2)
|
||||
{
|
||||
for (;;) {
|
||||
@@ -4517,12 +4523,12 @@ struct table_equiv : boost::unordered::detail::table<Types>
|
||||
node_pointer start = n1;
|
||||
for (; n1 != end1; n1 = node_algo::next_node(n1)) {
|
||||
value_type const& v = n1->value();
|
||||
if (!find(start, n1, v)) {
|
||||
std::size_t matches = count_equal(n2, end2, v);
|
||||
if (!find_equiv(start, n1, v)) {
|
||||
std::size_t matches = count_equal_equiv(n2, end2, v);
|
||||
if (!matches)
|
||||
return false;
|
||||
if (matches !=
|
||||
1 + count_equal(node_algo::next_node(n1), end1, v))
|
||||
1 + count_equal_equiv(node_algo::next_node(n1), end1, v))
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -4530,7 +4536,8 @@ struct table_equiv : boost::unordered::detail::table<Types>
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool find(node_pointer n, node_pointer end, value_type const& v)
|
||||
static bool find_equiv(
|
||||
node_pointer n, node_pointer end, value_type const& v)
|
||||
{
|
||||
for (; n != end; n = node_algo::next_node(n))
|
||||
if (n->value() == v)
|
||||
@@ -4538,7 +4545,7 @@ struct table_equiv : boost::unordered::detail::table<Types>
|
||||
return false;
|
||||
}
|
||||
|
||||
static std::size_t count_equal(
|
||||
static std::size_t count_equal_equiv(
|
||||
node_pointer n, node_pointer end, value_type const& v)
|
||||
{
|
||||
std::size_t count = 0;
|
||||
@@ -4550,12 +4557,12 @@ struct table_equiv : boost::unordered::detail::table<Types>
|
||||
|
||||
// Emplace/Insert
|
||||
|
||||
inline node_pointer add_node(
|
||||
inline node_pointer add_node_equiv(
|
||||
node_pointer n, std::size_t key_hash, node_pointer pos)
|
||||
{
|
||||
n->hash_ = key_hash;
|
||||
if (pos) {
|
||||
node_algo::add_to_node_group(n, pos);
|
||||
node_algo::add_to_node(n, pos);
|
||||
if (n->next_) {
|
||||
std::size_t next_bucket =
|
||||
this->hash_to_bucket(node_algo::next_node(n)->hash_);
|
||||
@@ -4588,10 +4595,10 @@ struct table_equiv : boost::unordered::detail::table<Types>
|
||||
return n;
|
||||
}
|
||||
|
||||
inline node_pointer add_using_hint(node_pointer n, node_pointer hint)
|
||||
inline node_pointer add_using_hint_equiv(node_pointer n, node_pointer hint)
|
||||
{
|
||||
n->hash_ = hint->hash_;
|
||||
node_algo::add_to_node_group(n, hint);
|
||||
node_algo::add_to_node(n, hint);
|
||||
if (n->next_ != hint && n->next_) {
|
||||
std::size_t next_bucket =
|
||||
this->hash_to_bucket(node_algo::next_node(n)->hash_);
|
||||
@@ -4603,41 +4610,44 @@ struct table_equiv : boost::unordered::detail::table<Types>
|
||||
return n;
|
||||
}
|
||||
|
||||
iterator emplace_impl(node_pointer n)
|
||||
iterator emplace_equiv(node_pointer n)
|
||||
{
|
||||
node_tmp a(n, this->node_alloc());
|
||||
const_key_type& k = this->get_key(a.node_);
|
||||
std::size_t key_hash = this->hash(k);
|
||||
node_pointer position = this->find_node(key_hash, k);
|
||||
this->reserve_for_insert(this->size_ + 1);
|
||||
return iterator(this->add_node(a.release(), key_hash, position));
|
||||
return iterator(this->add_node_equiv(a.release(), key_hash, position));
|
||||
}
|
||||
|
||||
iterator emplace_hint_impl(c_iterator hint, node_pointer n)
|
||||
iterator emplace_hint_equiv(c_iterator hint, node_pointer n)
|
||||
{
|
||||
node_tmp a(n, this->node_alloc());
|
||||
const_key_type& k = this->get_key(a.node_);
|
||||
if (hint.node_ && this->key_eq()(k, this->get_key(hint.node_))) {
|
||||
this->reserve_for_insert(this->size_ + 1);
|
||||
return iterator(this->add_using_hint(a.release(), hint.node_));
|
||||
return iterator(
|
||||
this->add_using_hint_equiv(a.release(), hint.node_));
|
||||
} else {
|
||||
std::size_t key_hash = this->hash(k);
|
||||
node_pointer position = this->find_node(key_hash, k);
|
||||
this->reserve_for_insert(this->size_ + 1);
|
||||
return iterator(this->add_node(a.release(), key_hash, position));
|
||||
return iterator(
|
||||
this->add_node_equiv(a.release(), key_hash, position));
|
||||
}
|
||||
}
|
||||
|
||||
void emplace_impl_no_rehash(node_pointer n)
|
||||
void emplace_no_rehash_equiv(node_pointer n)
|
||||
{
|
||||
node_tmp a(n, this->node_alloc());
|
||||
const_key_type& k = this->get_key(a.node_);
|
||||
std::size_t key_hash = this->hash(k);
|
||||
node_pointer position = this->find_node(key_hash, k);
|
||||
this->add_node(a.release(), key_hash, position);
|
||||
this->add_node_equiv(a.release(), key_hash, position);
|
||||
}
|
||||
|
||||
template <typename NodeType> iterator move_insert_node_type(NodeType& np)
|
||||
template <typename NodeType>
|
||||
iterator move_insert_node_type_equiv(NodeType& np)
|
||||
{
|
||||
iterator result;
|
||||
|
||||
@@ -4646,7 +4656,7 @@ struct table_equiv : boost::unordered::detail::table<Types>
|
||||
std::size_t key_hash = this->hash(k);
|
||||
node_pointer pos = this->find_node(key_hash, k);
|
||||
this->reserve_for_insert(this->size_ + 1);
|
||||
result = iterator(this->add_node(np.ptr_, key_hash, pos));
|
||||
result = iterator(this->add_node_equiv(np.ptr_, key_hash, pos));
|
||||
np.ptr_ = node_pointer();
|
||||
}
|
||||
|
||||
@@ -4654,7 +4664,8 @@ struct table_equiv : boost::unordered::detail::table<Types>
|
||||
}
|
||||
|
||||
template <typename NodeType>
|
||||
iterator move_insert_node_type_with_hint(c_iterator hint, NodeType& np)
|
||||
iterator move_insert_node_type_with_hint_equiv(
|
||||
c_iterator hint, NodeType& np)
|
||||
{
|
||||
iterator result;
|
||||
|
||||
@@ -4663,12 +4674,13 @@ struct table_equiv : boost::unordered::detail::table<Types>
|
||||
|
||||
if (hint.node_ && this->key_eq()(k, this->get_key(hint.node_))) {
|
||||
this->reserve_for_insert(this->size_ + 1);
|
||||
result = iterator(this->add_using_hint(np.ptr_, hint.node_));
|
||||
result =
|
||||
iterator(this->add_using_hint_equiv(np.ptr_, hint.node_));
|
||||
} else {
|
||||
std::size_t key_hash = this->hash(k);
|
||||
node_pointer pos = this->find_node(key_hash, k);
|
||||
this->reserve_for_insert(this->size_ + 1);
|
||||
result = iterator(this->add_node(np.ptr_, key_hash, pos));
|
||||
result = iterator(this->add_node_equiv(np.ptr_, key_hash, pos));
|
||||
}
|
||||
np.ptr_ = node_pointer();
|
||||
}
|
||||
@@ -4682,7 +4694,7 @@ struct table_equiv : boost::unordered::detail::table<Types>
|
||||
// if hash function throws, or inserting > 1 element, basic exception
|
||||
// safety. Strong otherwise
|
||||
template <class I>
|
||||
void insert_range(I i, I j,
|
||||
void insert_range_equiv(I i, I j,
|
||||
typename boost::unordered::detail::enable_if_forward<I, void*>::type =
|
||||
0)
|
||||
{
|
||||
@@ -4691,14 +4703,14 @@ struct table_equiv : boost::unordered::detail::table<Types>
|
||||
|
||||
std::size_t distance = static_cast<std::size_t>(std::distance(i, j));
|
||||
if (distance == 1) {
|
||||
emplace_impl(boost::unordered::detail::func::construct_node(
|
||||
emplace_equiv(boost::unordered::detail::func::construct_node(
|
||||
this->node_alloc(), *i));
|
||||
} else {
|
||||
// Only require basic exception safety here
|
||||
this->reserve_for_insert(this->size_ + distance);
|
||||
|
||||
for (; i != j; ++i) {
|
||||
emplace_impl_no_rehash(
|
||||
emplace_no_rehash_equiv(
|
||||
boost::unordered::detail::func::construct_node(
|
||||
this->node_alloc(), *i));
|
||||
}
|
||||
@@ -4706,12 +4718,12 @@ struct table_equiv : boost::unordered::detail::table<Types>
|
||||
}
|
||||
|
||||
template <class I>
|
||||
void insert_range(I i, I j,
|
||||
void insert_range_equiv(I i, I j,
|
||||
typename boost::unordered::detail::disable_if_forward<I, void*>::type =
|
||||
0)
|
||||
{
|
||||
for (; i != j; ++i) {
|
||||
emplace_impl(boost::unordered::detail::func::construct_node(
|
||||
emplace_equiv(boost::unordered::detail::func::construct_node(
|
||||
this->node_alloc(), *i));
|
||||
}
|
||||
}
|
||||
@@ -4719,7 +4731,7 @@ struct table_equiv : boost::unordered::detail::table<Types>
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// Extract
|
||||
|
||||
inline node_pointer extract_by_iterator(c_iterator n)
|
||||
inline node_pointer extract_by_iterator_equiv(c_iterator n)
|
||||
{
|
||||
node_pointer i = n.node_;
|
||||
BOOST_ASSERT(i);
|
||||
@@ -4753,7 +4765,7 @@ struct table_equiv : boost::unordered::detail::table<Types>
|
||||
//
|
||||
// no throw
|
||||
|
||||
std::size_t erase_key(const_key_type& k)
|
||||
std::size_t erase_key_equiv(const_key_type& k)
|
||||
{
|
||||
if (!this->size_)
|
||||
return 0;
|
||||
@@ -4772,7 +4784,7 @@ struct table_equiv : boost::unordered::detail::table<Types>
|
||||
return deleted_count;
|
||||
}
|
||||
|
||||
link_pointer erase_nodes(node_pointer i, node_pointer j)
|
||||
link_pointer erase_nodes_equiv(node_pointer i, node_pointer j)
|
||||
{
|
||||
std::size_t bucket_index = this->hash_to_bucket(i->hash_);
|
||||
|
||||
@@ -4811,34 +4823,36 @@ struct table_equiv : boost::unordered::detail::table<Types>
|
||||
for (node_pointer n = src.begin(); n;) {
|
||||
std::size_t key_hash = n->hash_;
|
||||
node_pointer group_end(node_algo::next_group(n, this));
|
||||
node_pointer pos =
|
||||
this->add_node(boost::unordered::detail::func::construct_node(
|
||||
this->node_alloc(), n->value()),
|
||||
key_hash, node_pointer());
|
||||
node_pointer pos = this->add_node_equiv(
|
||||
boost::unordered::detail::func::construct_node(
|
||||
this->node_alloc(), n->value()),
|
||||
key_hash, node_pointer());
|
||||
for (n = node_algo::next_node(n); n != group_end;
|
||||
n = node_algo::next_node(n)) {
|
||||
this->add_node(boost::unordered::detail::func::construct_node(
|
||||
this->node_alloc(), n->value()),
|
||||
this->add_node_equiv(
|
||||
boost::unordered::detail::func::construct_node(
|
||||
this->node_alloc(), n->value()),
|
||||
key_hash, pos);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void move_buckets(table const& src)
|
||||
void move_buckets_equiv(table const& src)
|
||||
{
|
||||
this->create_buckets(this->bucket_count_);
|
||||
|
||||
for (node_pointer n = src.begin(); n;) {
|
||||
std::size_t key_hash = n->hash_;
|
||||
node_pointer group_end(node_algo::next_group(n, this));
|
||||
node_pointer pos =
|
||||
this->add_node(boost::unordered::detail::func::construct_node(
|
||||
this->node_alloc(), boost::move(n->value())),
|
||||
key_hash, node_pointer());
|
||||
node_pointer pos = this->add_node_equiv(
|
||||
boost::unordered::detail::func::construct_node(
|
||||
this->node_alloc(), boost::move(n->value())),
|
||||
key_hash, node_pointer());
|
||||
for (n = node_algo::next_node(n); n != group_end;
|
||||
n = node_algo::next_node(n)) {
|
||||
this->add_node(boost::unordered::detail::func::construct_node(
|
||||
this->node_alloc(), boost::move(n->value())),
|
||||
this->add_node_equiv(
|
||||
boost::unordered::detail::func::construct_node(
|
||||
this->node_alloc(), boost::move(n->value())),
|
||||
key_hash, pos);
|
||||
}
|
||||
}
|
||||
@@ -4850,11 +4864,11 @@ struct table_equiv : boost::unordered::detail::table<Types>
|
||||
for (node_pointer n = src.begin(); n;) {
|
||||
std::size_t key_hash = n->hash_;
|
||||
node_pointer group_end(node_algo::next_group(n, this));
|
||||
node_pointer pos = this->add_node(
|
||||
node_pointer pos = this->add_node_equiv(
|
||||
holder.copy_of(n->value()), key_hash, node_pointer());
|
||||
for (n = node_algo::next_node(n); n != group_end;
|
||||
n = node_algo::next_node(n)) {
|
||||
this->add_node(holder.copy_of(n->value()), key_hash, pos);
|
||||
this->add_node_equiv(holder.copy_of(n->value()), key_hash, pos);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4865,11 +4879,12 @@ struct table_equiv : boost::unordered::detail::table<Types>
|
||||
for (node_pointer n = src.begin(); n;) {
|
||||
std::size_t key_hash = n->hash_;
|
||||
node_pointer group_end(node_algo::next_group(n, this));
|
||||
node_pointer pos = this->add_node(
|
||||
node_pointer pos = this->add_node_equiv(
|
||||
holder.move_copy_of(n->value()), key_hash, node_pointer());
|
||||
for (n = node_algo::next_node(n); n != group_end;
|
||||
n = node_algo::next_node(n)) {
|
||||
this->add_node(holder.move_copy_of(n->value()), key_hash, pos);
|
||||
this->add_node_equiv(
|
||||
holder.move_copy_of(n->value()), key_hash, pos);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user