mirror of
https://github.com/boostorg/unordered.git
synced 2025-08-01 04:14:29 +02:00
Implement proxy erase(iterator)
This commit is contained in:
@@ -348,17 +348,40 @@ public:
|
|||||||
>::type
|
>::type
|
||||||
insert(element_type&& x){return emplace_impl(std::move(x));}
|
insert(element_type&& x){return emplace_impl(std::move(x));}
|
||||||
|
|
||||||
|
struct proxy_erase {
|
||||||
|
const_iterator pos;
|
||||||
|
operator iterator()const noexcept
|
||||||
|
{
|
||||||
|
auto it=pos;
|
||||||
|
it.increment();
|
||||||
|
return iterator(const_iterator_cast_tag{},it);
|
||||||
|
}
|
||||||
|
|
||||||
template<
|
template<
|
||||||
bool dependent_value=false,
|
bool dependent_value=false,
|
||||||
typename std::enable_if<
|
typename std::enable_if<
|
||||||
has_mutable_iterator||dependent_value>::type* =nullptr
|
has_mutable_iterator||dependent_value>::type* =nullptr
|
||||||
>
|
>
|
||||||
void erase(iterator pos)noexcept{return erase(const_iterator(pos));}
|
operator const_iterator()const noexcept
|
||||||
|
{
|
||||||
|
auto it=pos;
|
||||||
|
it.increment();
|
||||||
|
return it;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<
|
||||||
|
bool dependent_value=false,
|
||||||
|
typename std::enable_if<
|
||||||
|
has_mutable_iterator||dependent_value>::type* =nullptr
|
||||||
|
>
|
||||||
|
proxy_erase erase(iterator pos)noexcept{return erase(const_iterator(pos));}
|
||||||
|
|
||||||
BOOST_FORCEINLINE
|
BOOST_FORCEINLINE
|
||||||
void erase(const_iterator pos)noexcept
|
proxy_erase erase(const_iterator pos)noexcept
|
||||||
{
|
{
|
||||||
super::erase(pos.pc,pos.p);
|
super::erase(pos.pc,pos.p);
|
||||||
|
return proxy_erase{pos};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Key>
|
template<typename Key>
|
||||||
|
@@ -381,11 +381,17 @@ namespace boost {
|
|||||||
.first;
|
.first;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_FORCEINLINE void erase(iterator pos) { table_.erase(pos); }
|
BOOST_FORCEINLINE typename table_type::proxy_erase erase(iterator pos)
|
||||||
BOOST_FORCEINLINE void erase(const_iterator pos)
|
|
||||||
{
|
{
|
||||||
return table_.erase(pos);
|
return table_.erase(pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_FORCEINLINE typename table_type::proxy_erase erase(
|
||||||
|
const_iterator pos)
|
||||||
|
{
|
||||||
|
return table_.erase(pos);
|
||||||
|
}
|
||||||
|
|
||||||
iterator erase(const_iterator first, const_iterator last)
|
iterator erase(const_iterator first, const_iterator last)
|
||||||
{
|
{
|
||||||
while (first != last) {
|
while (first != last) {
|
||||||
|
@@ -282,10 +282,12 @@ namespace boost {
|
|||||||
return table_.emplace(std::forward<Args>(args)...).first;
|
return table_.emplace(std::forward<Args>(args)...).first;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_FORCEINLINE void erase(const_iterator pos)
|
BOOST_FORCEINLINE typename table_type::proxy_erase erase(
|
||||||
|
const_iterator pos)
|
||||||
{
|
{
|
||||||
return table_.erase(pos);
|
return table_.erase(pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
iterator erase(const_iterator first, const_iterator last)
|
iterator erase(const_iterator first, const_iterator last)
|
||||||
{
|
{
|
||||||
while (first != last) {
|
while (first != last) {
|
||||||
|
@@ -458,11 +458,17 @@ namespace boost {
|
|||||||
.first;
|
.first;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_FORCEINLINE void erase(iterator pos) { table_.erase(pos); }
|
BOOST_FORCEINLINE typename table_type::proxy_erase erase(iterator pos)
|
||||||
BOOST_FORCEINLINE void erase(const_iterator pos)
|
|
||||||
{
|
{
|
||||||
return table_.erase(pos);
|
return table_.erase(pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_FORCEINLINE typename table_type::proxy_erase erase(
|
||||||
|
const_iterator pos)
|
||||||
|
{
|
||||||
|
return table_.erase(pos);
|
||||||
|
}
|
||||||
|
|
||||||
iterator erase(const_iterator first, const_iterator last)
|
iterator erase(const_iterator first, const_iterator last)
|
||||||
{
|
{
|
||||||
while (first != last) {
|
while (first != last) {
|
||||||
|
@@ -352,10 +352,12 @@ namespace boost {
|
|||||||
return table_.emplace(std::forward<Args>(args)...).first;
|
return table_.emplace(std::forward<Args>(args)...).first;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_FORCEINLINE void erase(const_iterator pos)
|
BOOST_FORCEINLINE typename table_type::proxy_erase erase(
|
||||||
|
const_iterator pos)
|
||||||
{
|
{
|
||||||
return table_.erase(pos);
|
return table_.erase(pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
iterator erase(const_iterator first, const_iterator last)
|
iterator erase(const_iterator first, const_iterator last)
|
||||||
{
|
{
|
||||||
while (first != last) {
|
while (first != last) {
|
||||||
|
@@ -844,7 +844,7 @@ void unordered_copyable_test(X& x, Key& k, T& t, Hash& hf, Pred& eq)
|
|||||||
a10.insert(t);
|
a10.insert(t);
|
||||||
q = a10.cbegin();
|
q = a10.cbegin();
|
||||||
#ifdef BOOST_UNORDERED_FOA_TESTS
|
#ifdef BOOST_UNORDERED_FOA_TESTS
|
||||||
BOOST_STATIC_ASSERT(std::is_same<void, decltype(a10.erase(q))>::value);
|
test::check_return_type<iterator>::convertible(a10.erase(q));
|
||||||
#else
|
#else
|
||||||
test::check_return_type<iterator>::equals(a10.erase(q));
|
test::check_return_type<iterator>::equals(a10.erase(q));
|
||||||
#endif
|
#endif
|
||||||
@@ -937,7 +937,7 @@ void unordered_movable_test(X& x, Key& k, T& /* t */, Hash& hf, Pred& eq)
|
|||||||
a10.insert(boost::move(v5));
|
a10.insert(boost::move(v5));
|
||||||
q = a10.cbegin();
|
q = a10.cbegin();
|
||||||
#ifdef BOOST_UNORDERED_FOA_TESTS
|
#ifdef BOOST_UNORDERED_FOA_TESTS
|
||||||
BOOST_STATIC_ASSERT(std::is_same<void, decltype(a10.erase(q))>::value);
|
test::check_return_type<iterator>::convertible(a10.erase(q));
|
||||||
#else
|
#else
|
||||||
test::check_return_type<iterator>::equals(a10.erase(q));
|
test::check_return_type<iterator>::equals(a10.erase(q));
|
||||||
#endif
|
#endif
|
||||||
|
@@ -23,9 +23,7 @@ namespace erase_tests {
|
|||||||
template <class Container>
|
template <class Container>
|
||||||
void erase_tests1(Container*, test::random_generator generator)
|
void erase_tests1(Container*, test::random_generator generator)
|
||||||
{
|
{
|
||||||
#ifndef BOOST_UNORDERED_FOA_TESTS
|
|
||||||
typedef typename Container::iterator iterator;
|
typedef typename Container::iterator iterator;
|
||||||
#endif
|
|
||||||
typedef typename Container::const_iterator c_iterator;
|
typedef typename Container::const_iterator c_iterator;
|
||||||
|
|
||||||
BOOST_LIGHTWEIGHT_TEST_OSTREAM << "Erase by key.\n";
|
BOOST_LIGHTWEIGHT_TEST_OSTREAM << "Erase by key.\n";
|
||||||
@@ -59,12 +57,8 @@ namespace erase_tests {
|
|||||||
while (size > 0 && !x.empty()) {
|
while (size > 0 && !x.empty()) {
|
||||||
typename Container::key_type key = test::get_key<Container>(*x.begin());
|
typename Container::key_type key = test::get_key<Container>(*x.begin());
|
||||||
std::size_t count = x.count(key);
|
std::size_t count = x.count(key);
|
||||||
#ifdef BOOST_UNORDERED_FOA_TESTS
|
|
||||||
x.erase(x.begin());
|
|
||||||
#else
|
|
||||||
iterator pos = x.erase(x.begin());
|
iterator pos = x.erase(x.begin());
|
||||||
BOOST_TEST(pos == x.begin());
|
BOOST_ASSERT(BOOST_TEST(pos == x.begin()));
|
||||||
#endif
|
|
||||||
--size;
|
--size;
|
||||||
BOOST_TEST(x.count(key) == count - 1);
|
BOOST_TEST(x.count(key) == count - 1);
|
||||||
BOOST_TEST(x.size() == size);
|
BOOST_TEST(x.size() == size);
|
||||||
@@ -95,15 +89,10 @@ namespace erase_tests {
|
|||||||
typename Container::key_type key = test::get_key<Container>(*pos);
|
typename Container::key_type key = test::get_key<Container>(*pos);
|
||||||
std::size_t count = x.count(key);
|
std::size_t count = x.count(key);
|
||||||
BOOST_TEST(count > 0);
|
BOOST_TEST(count > 0);
|
||||||
#ifdef BOOST_UNORDERED_FOA_TESTS
|
|
||||||
x.erase(pos);
|
|
||||||
--size;
|
|
||||||
#else
|
|
||||||
BOOST_TEST(next == x.erase(pos));
|
BOOST_TEST(next == x.erase(pos));
|
||||||
--size;
|
--size;
|
||||||
if (size > 0)
|
if (size > 0)
|
||||||
BOOST_TEST(index == 0 ? next == x.begin() : next == test::next(prev));
|
BOOST_TEST(index == 0 ? next == x.begin() : next == test::next(prev));
|
||||||
#endif
|
|
||||||
BOOST_TEST(x.count(key) == count - 1);
|
BOOST_TEST(x.count(key) == count - 1);
|
||||||
if (x.count(key) != count - 1) {
|
if (x.count(key) != count - 1) {
|
||||||
BOOST_LIGHTWEIGHT_TEST_OSTREAM << count << " => " << x.count(key)
|
BOOST_LIGHTWEIGHT_TEST_OSTREAM << count << " => " << x.count(key)
|
||||||
|
@@ -1065,11 +1065,7 @@ typedef boost::unordered_map<int, int, transparent_hasher,
|
|||||||
// test that in the presence of the member function template `erase()`, we still
|
// test that in the presence of the member function template `erase()`, we still
|
||||||
// invoke the correct iterator overloads when the type is implicitly convertible
|
// invoke the correct iterator overloads when the type is implicitly convertible
|
||||||
//
|
//
|
||||||
#ifdef BOOST_UNORDERED_FOA_TESTS
|
|
||||||
void
|
|
||||||
#else
|
|
||||||
transparent_unordered_map::iterator
|
transparent_unordered_map::iterator
|
||||||
#endif
|
|
||||||
map_erase_overload_compile_test()
|
map_erase_overload_compile_test()
|
||||||
{
|
{
|
||||||
convertible_to_iterator<transparent_unordered_map> c;
|
convertible_to_iterator<transparent_unordered_map> c;
|
||||||
@@ -1079,11 +1075,7 @@ map_erase_overload_compile_test()
|
|||||||
return map.erase(c);
|
return map.erase(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef BOOST_UNORDERED_FOA_TESTS
|
|
||||||
void
|
|
||||||
#else
|
|
||||||
transparent_unordered_map::const_iterator
|
transparent_unordered_map::const_iterator
|
||||||
#endif
|
|
||||||
map_erase_const_overload_compile_test()
|
map_erase_const_overload_compile_test()
|
||||||
{
|
{
|
||||||
convertible_to_const_iterator<transparent_unordered_map> c;
|
convertible_to_const_iterator<transparent_unordered_map> c;
|
||||||
@@ -1226,11 +1218,7 @@ typedef boost::unordered_multiset<int, transparent_hasher,
|
|||||||
transparent_unordered_multiset;
|
transparent_unordered_multiset;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BOOST_UNORDERED_FOA_TESTS
|
|
||||||
void
|
|
||||||
#else
|
|
||||||
transparent_unordered_set::iterator
|
transparent_unordered_set::iterator
|
||||||
#endif
|
|
||||||
set_erase_overload_compile_test()
|
set_erase_overload_compile_test()
|
||||||
{
|
{
|
||||||
convertible_to_iterator<transparent_unordered_set> c;
|
convertible_to_iterator<transparent_unordered_set> c;
|
||||||
@@ -1240,11 +1228,7 @@ set_erase_overload_compile_test()
|
|||||||
return set.erase(c);
|
return set.erase(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef BOOST_UNORDERED_FOA_TESTS
|
|
||||||
void
|
|
||||||
#else
|
|
||||||
transparent_unordered_set::const_iterator
|
transparent_unordered_set::const_iterator
|
||||||
#endif
|
|
||||||
set_erase_const_overload_compile_test()
|
set_erase_const_overload_compile_test()
|
||||||
{
|
{
|
||||||
convertible_to_const_iterator<transparent_unordered_set> c;
|
convertible_to_const_iterator<transparent_unordered_set> c;
|
||||||
|
Reference in New Issue
Block a user