Skip to content

Commit 88a4372

Browse files
[ADT] Add DenseSet::insert_range
This pach adds DenseSet::insert_range, named after std::map::insert_range from C++23. The intent is to allow a heavy operation as the argument like: Set.insert_range(Map[Key]); Without insert_range, we would have to do: Set.insert(Map[Key].begin(), Map[Key].end()); or: auto &M = Map[Key]; Set.insert(M.begin(), M.end()); Neither is elegant.
1 parent c5a491e commit 88a4372

File tree

2 files changed

+16
-0
lines changed

2 files changed

+16
-0
lines changed

llvm/include/llvm/ADT/DenseSet.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#ifndef LLVM_ADT_DENSESET_H
1515
#define LLVM_ADT_DENSESET_H
1616

17+
#include "llvm/ADT/ADL.h"
1718
#include "llvm/ADT/DenseMap.h"
1819
#include "llvm/ADT/DenseMapInfo.h"
1920
#include "llvm/Support/MathExtras.h"
@@ -237,6 +238,10 @@ class DenseSetImpl {
237238
for (; I != E; ++I)
238239
insert(*I);
239240
}
241+
242+
template <typename Range> void insert_range(Range &&R) {
243+
insert(adl_begin(R), adl_end(R));
244+
}
240245
};
241246

242247
/// Equality comparison for DenseSet.

llvm/unittests/ADT/DenseSetTest.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,17 @@ TEST(DenseSetTest, DoubleEntrySetTest) {
3232
EXPECT_EQ(0u, set.count(2));
3333
}
3434

35+
TEST(DenseSetTest, InsertRange) {
36+
llvm::DenseSet<unsigned> set1;
37+
llvm::DenseSet<unsigned> set2;
38+
set1.insert(1);
39+
set1.insert(2);
40+
set1.insert(3);
41+
constexpr unsigned Args[] = {3, 1, 2};
42+
set2.insert_range(Args);
43+
EXPECT_EQ(set1, set2);
44+
}
45+
3546
struct TestDenseSetInfo {
3647
static inline unsigned getEmptyKey() { return ~0; }
3748
static inline unsigned getTombstoneKey() { return ~0U - 1; }

0 commit comments

Comments
 (0)