From becd166e66372d741b1d736fc8f260031d00988a Mon Sep 17 00:00:00 2001 From: joaquintides Date: Wed, 12 Oct 2022 15:34:05 +0200 Subject: [PATCH] implemented erase_if --- include/boost/unordered/detail/foa.hpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/include/boost/unordered/detail/foa.hpp b/include/boost/unordered/detail/foa.hpp index ac142209..dcb6a749 100644 --- a/include/boost/unordered/detail/foa.hpp +++ b/include/boost/unordered/detail/foa.hpp @@ -1239,6 +1239,12 @@ public: rehash(std::size_t(std::ceil(static_cast(n)/mlf))); } + template + friend std::size_t erase_if(table& x,Predicate pr) + { + return x.erase_if_impl(pr); + } + private: template friend class table; using arrays_type=table_arrays; @@ -1523,6 +1529,16 @@ private: } #endif + template + std::size_t erase_if_impl(Predicate pr) + { + std::size_t s=size(); + for_all_elements([&,this](group_type* pg,unsigned int n,value_type* p){ + if(pr(*p)) erase(iterator{pg,n,p}); + }); + return std::size_t(s-size()); + } + template void for_all_elements(F f)const { @@ -1534,7 +1550,7 @@ private: ->decltype(f(nullptr),void()) { for_all_elements( - arrays_,[=](group_type*,unsigned int,value_type* p){return f(p);}); + arrays_,[&](group_type*,unsigned int,value_type* p){return f(p);}); } template