diff options
author | Jacques Lucke <jacques@blender.org> | 2021-04-30 17:22:24 +0300 |
---|---|---|
committer | Jacques Lucke <jacques@blender.org> | 2021-04-30 17:23:02 +0300 |
commit | 313a1c072d6d730e4665350befb6cfae5e03b1aa (patch) | |
tree | 79bc6a80bed093b3fd16daed330d4e844ed7dfb1 /source/blender/blenlib/tests | |
parent | e7274f9f2d4191b3b1b77448e2c1ea6f1f4aa97c (diff) |
BLI: support removing Map elements during iteration
While it was technically safe to call Map.remove while iterating over
a map, it wasn't really designed to work. Also it wasn't very efficient,
because to remove the element, the map would have to search it
again. Now it is possible to remove an element given an iterator
into the map. It is safe to remove the element while iterating over
the map. Obviously, the removed element must not be accessed
anymore after it has been removed.
Diffstat (limited to 'source/blender/blenlib/tests')
-rw-r--r-- | source/blender/blenlib/tests/BLI_map_test.cc | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/source/blender/blenlib/tests/BLI_map_test.cc b/source/blender/blenlib/tests/BLI_map_test.cc index bb15f7f0d8d..18be456bd20 100644 --- a/source/blender/blenlib/tests/BLI_map_test.cc +++ b/source/blender/blenlib/tests/BLI_map_test.cc @@ -613,6 +613,33 @@ TEST(map, AddAsVariadic) EXPECT_EQ(map.lookup(2), "t"); } +TEST(map, RemoveDuringIteration) +{ + Map<int, int> map; + map.add(2, 1); + map.add(5, 2); + map.add(1, 2); + map.add(6, 0); + map.add(3, 3); + + EXPECT_EQ(map.size(), 5); + + using Iter = Map<int, int>::MutableItemIterator; + Iter begin = map.items().begin(); + Iter end = map.items().end(); + for (Iter iter = begin; iter != end; ++iter) { + Map<int, int>::MutableItem item = *iter; + if (item.value == 2) { + map.remove(iter); + } + } + + EXPECT_EQ(map.size(), 3); + EXPECT_EQ(map.lookup(2), 1); + EXPECT_EQ(map.lookup(6), 0); + EXPECT_EQ(map.lookup(3), 3); +} + /** * Set this to 1 to activate the benchmark. It is disabled by default, because it prints a lot. */ |