diff options
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenlib/BLI_multi_value_map.hh | 16 | ||||
-rw-r--r-- | source/blender/blenlib/tests/BLI_multi_value_map_test.cc | 21 |
2 files changed, 37 insertions, 0 deletions
diff --git a/source/blender/blenlib/BLI_multi_value_map.hh b/source/blender/blenlib/BLI_multi_value_map.hh index 018f080e633..4113085a1e3 100644 --- a/source/blender/blenlib/BLI_multi_value_map.hh +++ b/source/blender/blenlib/BLI_multi_value_map.hh @@ -104,6 +104,22 @@ template<typename Key, typename Value> class MultiValueMap { } /** + * Get a mutable span to all the values that are stored for the given key. + */ + MutableSpan<Value> lookup(const Key &key) + { + return this->lookup_as(key); + } + template<typename ForwardKey> MutableSpan<Value> lookup_as(const ForwardKey &key) + { + Vector<Value> *vector = map_.lookup_ptr_as(key); + if (vector != nullptr) { + return vector->as_mutable_span(); + } + return {}; + } + + /** * Note: This signature will change when the implementation changes. */ typename MapType::ItemIterator items() const diff --git a/source/blender/blenlib/tests/BLI_multi_value_map_test.cc b/source/blender/blenlib/tests/BLI_multi_value_map_test.cc index 7501fbe0d87..a910f2935d4 100644 --- a/source/blender/blenlib/tests/BLI_multi_value_map_test.cc +++ b/source/blender/blenlib/tests/BLI_multi_value_map_test.cc @@ -29,6 +29,27 @@ TEST(multi_value_map, LookupExistant) EXPECT_EQ(map.lookup(3)[0], 6); } +TEST(multi_value_map, LookupMutable) +{ + MultiValueMap<int, int> map; + map.add(1, 2); + map.add(4, 5); + map.add(4, 6); + map.add(6, 7); + + MutableSpan<int> span = map.lookup(4); + EXPECT_EQ(span.size(), 2); + span[0] = 10; + span[1] = 20; + + map.add(4, 5); + MutableSpan<int> new_span = map.lookup(4); + EXPECT_EQ(new_span.size(), 3); + EXPECT_EQ(new_span[0], 10); + EXPECT_EQ(new_span[1], 20); + EXPECT_EQ(new_span[2], 5); +} + TEST(multi_value_map, AddMultiple) { MultiValueMap<int, int> map; |