diff options
author | Jacques Lucke <jacques@blender.org> | 2021-03-04 19:37:46 +0300 |
---|---|---|
committer | Jacques Lucke <jacques@blender.org> | 2021-03-04 19:38:01 +0300 |
commit | bb1f02510b69a70ab9bde68be1a4d51c47d72d57 (patch) | |
tree | 5919d50809056aa2206f6de884081c810cfe13ae | |
parent | d09b874244c8ef7385aff136acdaae6aae67ea7e (diff) |
BLI: support mutable lookup from multi value map
-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; |