Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions llvm/include/llvm/ADT/DenseSet.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include "llvm/ADT/ADL.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/DenseMapInfo.h"
#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/type_traits.h"
#include <cstddef>
Expand Down Expand Up @@ -78,6 +79,10 @@ class DenseSetImpl {
insert(Elems.begin(), Elems.end());
}

template <typename Range>
DenseSetImpl(llvm::from_range_t, Range &&R)
: DenseSetImpl(adl_begin(R), adl_end(R)) {}

bool empty() const { return TheMap.empty(); }
size_type size() const { return TheMap.size(); }
size_t getMemorySize() const { return TheMap.getMemorySize(); }
Expand Down
6 changes: 6 additions & 0 deletions llvm/include/llvm/ADT/STLForwardCompat.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,12 @@ template <typename Enum>
return static_cast<std::underlying_type_t<Enum>>(E);
}

// A tag for constructors accepting ranges.
struct from_range_t {
explicit from_range_t() = default;
};
inline constexpr from_range_t from_range{};

} // namespace llvm

#endif // LLVM_ADT_STLFORWARDCOMPAT_H
12 changes: 12 additions & 0 deletions llvm/unittests/ADT/DenseSetTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,18 @@ TEST(DenseSetTest, DoubleEntrySetTest) {
EXPECT_EQ(0u, set.count(2));
}

TEST(DenseSetTest, CtorRange) {
constexpr unsigned Args[] = {3, 1, 2};
llvm::DenseSet<unsigned> set(llvm::from_range, Args);
EXPECT_THAT(set, ::testing::UnorderedElementsAre(1, 2, 3));
}

TEST(SmallDenseSetTest, CtorRange) {
constexpr unsigned Args[] = {9, 7, 8};
llvm::SmallDenseSet<unsigned> set(llvm::from_range, Args);
EXPECT_THAT(set, ::testing::UnorderedElementsAre(7, 8, 9));
}

TEST(DenseSetTest, InsertRange) {
llvm::DenseSet<unsigned> set;
constexpr unsigned Args[] = {3, 1, 2};
Expand Down
Loading