Implement proxy erase(iterator)

This commit is contained in:
Christian Mazakas
2023-06-14 15:29:08 -07:00
parent d65d9a65b7
commit 2f7bba0c21
8 changed files with 50 additions and 38 deletions

View File

@@ -348,17 +348,40 @@ public:
>::type
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<
bool dependent_value=false,
typename std::enable_if<
has_mutable_iterator||dependent_value>::type* =nullptr
>
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
>
void erase(iterator pos)noexcept{return erase(const_iterator(pos));}
proxy_erase erase(iterator pos)noexcept{return erase(const_iterator(pos));}
BOOST_FORCEINLINE
void erase(const_iterator pos)noexcept
proxy_erase erase(const_iterator pos)noexcept
{
super::erase(pos.pc,pos.p);
return proxy_erase{pos};
}
template<typename Key>

View File

@@ -381,11 +381,17 @@ namespace boost {
.first;
}
BOOST_FORCEINLINE void erase(iterator pos) { table_.erase(pos); }
BOOST_FORCEINLINE void erase(const_iterator pos)
BOOST_FORCEINLINE typename table_type::proxy_erase erase(iterator 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)
{
while (first != last) {

View File

@@ -282,10 +282,12 @@ namespace boost {
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);
}
iterator erase(const_iterator first, const_iterator last)
{
while (first != last) {

View File

@@ -458,11 +458,17 @@ namespace boost {
.first;
}
BOOST_FORCEINLINE void erase(iterator pos) { table_.erase(pos); }
BOOST_FORCEINLINE void erase(const_iterator pos)
BOOST_FORCEINLINE typename table_type::proxy_erase erase(iterator 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)
{
while (first != last) {

View File

@@ -352,10 +352,12 @@ namespace boost {
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);
}
iterator erase(const_iterator first, const_iterator last)
{
while (first != last) {