[llvm] ADT: Complete the at() methods for DenseMap and MapVector (PR #169147)
Nicolai Hähnle via llvm-commits
llvm-commits at lists.llvm.org
Fri Nov 21 21:56:17 PST 2025
https://github.com/nhaehnle created https://github.com/llvm/llvm-project/pull/169147
Make it easier to use these containers as drop-in replacements for
std::map.
>From f6fcb2a75ddac2bf8cec2169dd10e1e8e5a1eb40 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Nicolai=20H=C3=A4hnle?= <nicolai.haehnle at amd.com>
Date: Thu, 20 Nov 2025 09:21:38 -0800
Subject: [PATCH] ADT: Complete the at() methods for DenseMap and MapVector
Make it easier to use these containers as drop-in replacements for
std::map.
commit-id:8b1d1826
---
llvm/include/llvm/ADT/DenseMap.h | 8 ++++++++
llvm/include/llvm/ADT/MapVector.h | 22 ++++++++++++++++++----
llvm/unittests/ADT/DenseMapTest.cpp | 8 ++++++++
llvm/unittests/ADT/MapVectorTest.cpp | 15 +++++++++++++++
4 files changed, 49 insertions(+), 4 deletions(-)
diff --git a/llvm/include/llvm/ADT/DenseMap.h b/llvm/include/llvm/ADT/DenseMap.h
index a706f68fab81b..fe8868619730e 100644
--- a/llvm/include/llvm/ADT/DenseMap.h
+++ b/llvm/include/llvm/ADT/DenseMap.h
@@ -219,6 +219,14 @@ class DenseMapBase : public DebugEpochBase {
return Default;
}
+ /// at - Return the entry for the specified key, or abort if no such
+ /// entry exists.
+ [[nodiscard]] ValueT &at(const_arg_type_t<KeyT> Val) {
+ auto Iter = this->find(std::move(Val));
+ assert(Iter != this->end() && "DenseMap::at failed due to a missing key");
+ return Iter->second;
+ }
+
/// at - Return the entry for the specified key, or abort if no such
/// entry exists.
[[nodiscard]] const ValueT &at(const_arg_type_t<KeyT> Val) const {
diff --git a/llvm/include/llvm/ADT/MapVector.h b/llvm/include/llvm/ADT/MapVector.h
index 82f2c4977e01d..80bcb7e0b7ba4 100644
--- a/llvm/include/llvm/ADT/MapVector.h
+++ b/llvm/include/llvm/ADT/MapVector.h
@@ -148,14 +148,28 @@ class MapVector {
[[nodiscard]] iterator find(const KeyT &Key) {
typename MapType::const_iterator Pos = Map.find(Key);
- return Pos == Map.end()? Vector.end() :
- (Vector.begin() + Pos->second);
+ return Pos == Map.end() ? Vector.end() : (Vector.begin() + Pos->second);
}
[[nodiscard]] const_iterator find(const KeyT &Key) const {
typename MapType::const_iterator Pos = Map.find(Key);
- return Pos == Map.end()? Vector.end() :
- (Vector.begin() + Pos->second);
+ return Pos == Map.end() ? Vector.end() : (Vector.begin() + Pos->second);
+ }
+
+ /// at - Return the entry for the specified key, or abort if no such
+ /// entry exists.
+ [[nodiscard]] ValueT &at(const KeyT &Key) {
+ auto Pos = Map.find(Key);
+ assert(Pos != Map.end() && "MapVector::at failed due to a missing key");
+ return Vector[Pos->second].second;
+ }
+
+ /// at - Return the entry for the specified key, or abort if no such
+ /// entry exists.
+ [[nodiscard]] const ValueT &at(const KeyT &Key) const {
+ auto Pos = Map.find(Key);
+ assert(Pos != Map.end() && "MapVector::at failed due to a missing key");
+ return Vector[Pos->second].second;
}
/// Remove the last element from the vector.
diff --git a/llvm/unittests/ADT/DenseMapTest.cpp b/llvm/unittests/ADT/DenseMapTest.cpp
index 273ee09fc1e28..553d159d33b1a 100644
--- a/llvm/unittests/ADT/DenseMapTest.cpp
+++ b/llvm/unittests/ADT/DenseMapTest.cpp
@@ -200,6 +200,14 @@ TYPED_TEST(DenseMapTest, AtTest) {
EXPECT_EQ(this->getValue(0), this->Map.at(this->getKey(0)));
EXPECT_EQ(this->getValue(1), this->Map.at(this->getKey(1)));
EXPECT_EQ(this->getValue(2), this->Map.at(this->getKey(2)));
+
+ this->Map.at(this->getKey(0)) = this->getValue(1);
+ EXPECT_EQ(this->getValue(1), this->Map.at(this->getKey(0)));
+
+ const auto &ConstMap = this->Map;
+ EXPECT_EQ(this->getValue(1), ConstMap.at(this->getKey(0)));
+ EXPECT_EQ(this->getValue(1), ConstMap.at(this->getKey(1)));
+ EXPECT_EQ(this->getValue(2), ConstMap.at(this->getKey(2)));
}
// Test clear() method
diff --git a/llvm/unittests/ADT/MapVectorTest.cpp b/llvm/unittests/ADT/MapVectorTest.cpp
index 639e1a14e8178..e0589445e3271 100644
--- a/llvm/unittests/ADT/MapVectorTest.cpp
+++ b/llvm/unittests/ADT/MapVectorTest.cpp
@@ -292,6 +292,21 @@ TEST(MapVectorTest, GetArrayRef) {
EXPECT_TRUE(MV.getArrayRef().equals({std::pair(100, 99), std::pair(99, 98)}));
}
+TEST(MapVectorTest, AtTest) {
+ MapVector<int, int> MV;
+ MV[0] = 10;
+ MV[1] = 11;
+ EXPECT_EQ(MV.at(0), 10);
+ EXPECT_EQ(MV.at(1), 11);
+
+ MV.at(1) = 12;
+ EXPECT_EQ(MV.at(1), 12);
+
+ const auto &ConstMV = MV;
+ EXPECT_EQ(ConstMV.at(0), 10);
+ EXPECT_EQ(ConstMV.at(1), 12);
+}
+
template <class IntType> struct MapVectorMappedTypeTest : ::testing::Test {
using int_type = IntType;
};
More information about the llvm-commits
mailing list