From 5e316ebc88b740116c95959b8f32723d6bbbf2c9 Mon Sep 17 00:00:00 2001 From: Christian Mazakas Date: Wed, 29 Mar 2023 15:00:54 -0700 Subject: [PATCH] Add initial draft of erase() --- .../boost/unordered/concurrent_flat_map.hpp | 7 ++ test/Jamfile.v2 | 3 +- test/cfoa/erase_tests.cpp | 85 +++++++++++++++++++ 3 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 test/cfoa/erase_tests.cpp diff --git a/include/boost/unordered/concurrent_flat_map.hpp b/include/boost/unordered/concurrent_flat_map.hpp index 5b31af89..ccc028ba 100644 --- a/include/boost/unordered/concurrent_flat_map.hpp +++ b/include/boost/unordered/concurrent_flat_map.hpp @@ -123,6 +123,11 @@ namespace boost { size_type size() const noexcept { return table_.size(); } + BOOST_ATTRIBUTE_NODISCARD bool empty() const noexcept + { + return size() == 0; + } + /// Modifiers /// @@ -209,6 +214,8 @@ namespace boost { this->insert_or_visit(ilist.begin(), ilist.end(), std::move(f)); } + size_type erase(key_type const& k) { return table_.erase(k); } + /// Hash Policy /// void rehash(size_type n) { table_.rehash(n); } diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index ee5a2018..160e32b2 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -213,5 +213,6 @@ rule build_cfoa ( name ) } build_cfoa insert_tests ; +build_cfoa erase_tests ; -alias cfoa_tests : cfoa_insert_tests ; +alias cfoa_tests : cfoa_insert_tests cfoa_erase_tests ; diff --git a/test/cfoa/erase_tests.cpp b/test/cfoa/erase_tests.cpp new file mode 100644 index 00000000..1db36905 --- /dev/null +++ b/test/cfoa/erase_tests.cpp @@ -0,0 +1,85 @@ +// Copyright (C) 2023 Christian Mazakas +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include "helpers.hpp" + +#include + +#include + +namespace { + test::seed_t initialize_seed(3292023); + + struct lvalue_eraser_type + { + template void operator()(std::vector& values, X& x) + { + thread_runner(values, [&values, &x](boost::span) { + for (auto const& k : values) { + x.erase(k.first); + } + }); + + BOOST_TEST_EQ(x.size(), 0); + BOOST_TEST(x.empty()); + } + } lvalue_eraser; + + template + void erase(X*, G gen, F eraser, test::random_generator rg) + { + auto values = make_random_values(1024 * 16, [&] { return gen(rg); }); + auto reference_map = + boost::unordered_flat_map(values.begin(), values.end()); + raii::reset_counts(); + + { + X x; + + x.insert(values.begin(), values.end()); + + BOOST_TEST_EQ(x.size(), reference_map.size()); + + using value_type = typename X::value_type; + BOOST_TEST_EQ(x.size(), x.visit_all([&](value_type const& kv) { + BOOST_TEST(reference_map.contains(kv.first)); + if (rg == test::sequential) { + BOOST_TEST_EQ(kv.second, reference_map[kv.first]); + } + })); + + eraser(values, x); + } + + BOOST_TEST_GE(raii::default_constructor, 0); + BOOST_TEST_GE(raii::copy_constructor, 0); + BOOST_TEST_GE(raii::move_constructor, 0); + BOOST_TEST_GT(raii::destructor, 0); + + BOOST_TEST_EQ(raii::default_constructor + raii::copy_constructor + + raii::move_constructor, + raii::destructor); + } + + boost::unordered::concurrent_flat_map* map; + // boost::unordered::concurrent_flat_map* transparent_map; + +} // namespace + +using test::default_generator; +using test::limited_range; +using test::sequential; + +// clang-format off +UNORDERED_TEST( + erase, + ((map)) + ((value_type_generator)(init_type_generator)) + ((lvalue_eraser)) + ((default_generator)(sequential)(limited_range))) + +// clang-format on + +RUN_TESTS()