Skip to content

Commit 4379d22

Browse files
[ADT] Add DenseSet(llvm::from_t, Range) (llvm#131832)
This patch adds a constructor of the form: DenseSet Set(llvm::from_range, Range) while forward-porting std::from_range from c++23.
1 parent b19b6d9 commit 4379d22

File tree

3 files changed

+29
-0
lines changed

3 files changed

+29
-0
lines changed

llvm/include/llvm/ADT/DenseSet.h

+5
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "llvm/ADT/ADL.h"
1818
#include "llvm/ADT/DenseMap.h"
1919
#include "llvm/ADT/DenseMapInfo.h"
20+
#include "llvm/ADT/STLForwardCompat.h"
2021
#include "llvm/Support/MathExtras.h"
2122
#include "llvm/Support/type_traits.h"
2223
#include <cstddef>
@@ -78,6 +79,10 @@ class DenseSetImpl {
7879
insert(Elems.begin(), Elems.end());
7980
}
8081

82+
template <typename Range>
83+
DenseSetImpl(llvm::from_range_t, Range &&R)
84+
: DenseSetImpl(adl_begin(R), adl_end(R)) {}
85+
8186
bool empty() const { return TheMap.empty(); }
8287
size_type size() const { return TheMap.size(); }
8388
size_t getMemorySize() const { return TheMap.getMemorySize(); }

llvm/include/llvm/ADT/STLForwardCompat.h

+6
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,12 @@ template <typename Enum>
6767
return static_cast<std::underlying_type_t<Enum>>(E);
6868
}
6969

70+
// A tag for constructors accepting ranges.
71+
struct from_range_t {
72+
explicit from_range_t() = default;
73+
};
74+
inline constexpr from_range_t from_range{};
75+
7076
} // namespace llvm
7177

7278
#endif // LLVM_ADT_STLFORWARDCOMPAT_H

llvm/unittests/ADT/DenseSetTest.cpp

+18
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,24 @@ TEST(DenseSetTest, DoubleEntrySetTest) {
3333
EXPECT_EQ(0u, set.count(2));
3434
}
3535

36+
TEST(DenseSetTest, CtorRange) {
37+
constexpr unsigned Args[] = {3, 1, 2};
38+
llvm::DenseSet<unsigned> set(llvm::from_range, Args);
39+
EXPECT_THAT(set, ::testing::UnorderedElementsAre(1, 2, 3));
40+
}
41+
42+
TEST(DenseSetTest, CtorRangeImplicitConversion) {
43+
constexpr char Args[] = {3, 1, 2};
44+
llvm::DenseSet<unsigned> set(llvm::from_range, Args);
45+
EXPECT_THAT(set, ::testing::UnorderedElementsAre(1, 2, 3));
46+
}
47+
48+
TEST(SmallDenseSetTest, CtorRange) {
49+
constexpr unsigned Args[] = {9, 7, 8};
50+
llvm::SmallDenseSet<unsigned> set(llvm::from_range, Args);
51+
EXPECT_THAT(set, ::testing::UnorderedElementsAre(7, 8, 9));
52+
}
53+
3654
TEST(DenseSetTest, InsertRange) {
3755
llvm::DenseSet<unsigned> set;
3856
constexpr unsigned Args[] = {3, 1, 2};

0 commit comments

Comments
 (0)