diff --git a/llvm/include/llvm/ADT/MapVector.h b/llvm/include/llvm/ADT/MapVector.h index 80bcb7e0b7ba4..2b2f098dd3abf 100644 --- a/llvm/include/llvm/ADT/MapVector.h +++ b/llvm/include/llvm/ADT/MapVector.h @@ -99,6 +99,11 @@ class MapVector { return try_emplace_impl(Key).first->second; } + [[nodiscard]] auto keys() { return make_first_range(Vector); } + [[nodiscard]] auto keys() const { return make_first_range(Vector); } + [[nodiscard]] auto values() { return make_second_range(Vector); } + [[nodiscard]] auto values() const { return make_second_range(Vector); } + // Returns a copy of the value. Only allowed if ValueT is copyable. [[nodiscard]] ValueT lookup(const KeyT &Key) const { static_assert(std::is_copy_constructible_v, diff --git a/llvm/unittests/ADT/MapVectorTest.cpp b/llvm/unittests/ADT/MapVectorTest.cpp index e0589445e3271..b11d4603b90b7 100644 --- a/llvm/unittests/ADT/MapVectorTest.cpp +++ b/llvm/unittests/ADT/MapVectorTest.cpp @@ -307,6 +307,24 @@ TEST(MapVectorTest, AtTest) { EXPECT_EQ(ConstMV.at(1), 12); } +TEST(MapVectorTest, KeysValuesIterator) { + MapVector MV; + + MV.insert(std::make_pair(1, 11)); + MV.insert(std::make_pair(2, 12)); + MV.insert(std::make_pair(3, 13)); + MV.insert(std::make_pair(4, 14)); + MV.insert(std::make_pair(5, 15)); + MV.insert(std::make_pair(6, 16)); + + EXPECT_THAT(MV.keys(), testing::ElementsAre(1, 2, 3, 4, 5, 6)); + EXPECT_THAT(MV.values(), testing::ElementsAre(11, 12, 13, 14, 15, 16)); + + const MapVector &ConstMV = MV; + EXPECT_THAT(ConstMV.keys(), testing::ElementsAre(1, 2, 3, 4, 5, 6)); + EXPECT_THAT(ConstMV.values(), testing::ElementsAre(11, 12, 13, 14, 15, 16)); +} + template struct MapVectorMappedTypeTest : ::testing::Test { using int_type = IntType; };