From a76bb1a27782317449c04c0ab4916d66c46b6803 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Mon, 18 Oct 2021 22:15:52 -0500 Subject: BLI: Support removing keys from a set during iteration This adds the ability to mark slots as removed while iterating through a mutable set. Differential Revision: https://developer.blender.org/D12867 --- source/blender/blenlib/BLI_set.hh | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'source/blender/blenlib/BLI_set.hh') diff --git a/source/blender/blenlib/BLI_set.hh b/source/blender/blenlib/BLI_set.hh index a8ccf957f6c..2e0dfea70e9 100644 --- a/source/blender/blenlib/BLI_set.hh +++ b/source/blender/blenlib/BLI_set.hh @@ -423,6 +423,8 @@ class Set { int64_t total_slots_; int64_t current_slot_; + friend Set; + public: Iterator(const Slot *slots, int64_t total_slots, int64_t current_slot) : slots_(slots), total_slots_(total_slots), current_slot_(current_slot) @@ -467,6 +469,12 @@ class Set { { return !(a != b); } + + protected: + const Slot ¤t_slot() const + { + return slots_[current_slot_]; + } }; Iterator begin() const @@ -484,6 +492,20 @@ class Set { return Iterator(slots_.data(), slots_.size(), slots_.size()); } + /** + * Remove the key that the iterator is currently pointing at. It is valid to call this method + * while iterating over the set. However, after this method has been called, the removed element + * must not be accessed anymore. + */ + void remove(const Iterator &iterator) + { + /* The const cast is valid because this method itself is not const. */ + Slot &slot = const_cast(iterator.current_slot()); + BLI_assert(slot.is_occupied()); + slot.remove(); + removed_slots_++; + } + /** * Print common statistics like size and collision count. This is useful for debugging purposes. */ -- cgit v1.2.3