diff --git a/src/core/flatset_type.hpp b/src/core/flatset_type.hpp index 26f40e1379..2dc42d0b48 100644 --- a/src/core/flatset_type.hpp +++ b/src/core/flatset_type.hpp @@ -23,13 +23,16 @@ public: using const_iterator = std::vector::const_iterator; /** - * Insert a key into the set. + * Insert a key into the set, if it does not already exist. * @param key Key to insert. + * @return A pair consisting of an iterator to the inserted element (or to the element that prevented the + * insertion), and a bool value to true iff the insertion took place. */ - void insert(const Tkey &key) + std::pair insert(const Tkey &key) { auto it = std::ranges::lower_bound(this->data, key, Tcompare{}); - if (it == std::end(this->data) || *it != key) this->data.emplace(it, key); + if (it == std::end(this->data) || *it != key) return {this->data.emplace(it, key), true}; + return {it, false}; } /** diff --git a/src/tests/flatset_type.cpp b/src/tests/flatset_type.cpp index c27b284300..7b2233ed43 100644 --- a/src/tests/flatset_type.cpp +++ b/src/tests/flatset_type.cpp @@ -28,11 +28,11 @@ TEST_CASE("FlatSet - basic") CHECK(set.empty()); /* Insert in a random order,. */ - set.insert(values[1]); - set.insert(values[2]); - set.insert(values[4]); - set.insert(values[3]); - set.insert(values[0]); + CHECK(set.insert(values[1]).second); + CHECK(set.insert(values[2]).second); + CHECK(set.insert(values[4]).second); + CHECK(set.insert(values[3]).second); + CHECK(set.insert(values[0]).second); CHECK(set.size() == 5); CHECK(set.contains(values[0])); CHECK(set.contains(values[1])); @@ -42,7 +42,7 @@ TEST_CASE("FlatSet - basic") CHECK(std::ranges::equal(set, values)); /* Test inserting an existing value does not affect order. */ - set.insert(values[1]); + CHECK_FALSE(set.insert(values[1]).second); CHECK(set.size() == 5); CHECK(set.contains(values[0])); CHECK(set.contains(values[1])); @@ -52,16 +52,16 @@ TEST_CASE("FlatSet - basic") CHECK(std::ranges::equal(set, values)); /* Insert a value multiple times. */ - set.insert(0); - set.insert(0); - set.insert(0); + CHECK(set.insert(0).second); + CHECK_FALSE(set.insert(0).second); + CHECK_FALSE(set.insert(0).second); CHECK(set.size() == 6); CHECK(set.contains(0)); /* Remove a value multiple times. */ - set.erase(0); - set.erase(0); - set.erase(0); + CHECK(set.erase(0) == 1); + CHECK(set.erase(0) == 0); + CHECK(set.erase(0) == 0); CHECK(set.size() == 5); CHECK(!set.contains(0)); }