From bb1f02510b69a70ab9bde68be1a4d51c47d72d57 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Thu, 4 Mar 2021 17:37:46 +0100 Subject: BLI: support mutable lookup from multi value map --- source/blender/blenlib/BLI_multi_value_map.hh | 16 ++++++++++++++++ .../blenlib/tests/BLI_multi_value_map_test.cc | 21 +++++++++++++++++++++ 2 files changed, 37 insertions(+) (limited to 'source/blender') 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 @@ -103,6 +103,22 @@ template class MultiValueMap { return {}; } + /** + * Get a mutable span to all the values that are stored for the given key. + */ + MutableSpan lookup(const Key &key) + { + return this->lookup_as(key); + } + template MutableSpan lookup_as(const ForwardKey &key) + { + Vector *vector = map_.lookup_ptr_as(key); + if (vector != nullptr) { + return vector->as_mutable_span(); + } + return {}; + } + /** * Note: This signature will change when the implementation changes. */ 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 map; + map.add(1, 2); + map.add(4, 5); + map.add(4, 6); + map.add(6, 7); + + MutableSpan span = map.lookup(4); + EXPECT_EQ(span.size(), 2); + span[0] = 10; + span[1] = 20; + + map.add(4, 5); + MutableSpan 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 map; -- cgit v1.2.3