1
0
Fork 0

Codechange: Give FlatSet insert() a return value.

This now returns an iterator, and whether an insert was performed.

Allows the caller to know if the item was already in the FlatSet without explicitly checking first.
pull/14392/head
Peter Nelson 2025-06-24 21:47:11 +01:00 committed by Peter Nelson
parent 1ff12b6e74
commit 1ddc03b916
2 changed files with 18 additions and 15 deletions

View File

@ -23,13 +23,16 @@ public:
using const_iterator = std::vector<Tkey>::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<const_iterator, bool> 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};
}
/**

View File

@ -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));
}