Skip to content

Commit

Permalink
Allow DenseSet::iterators to be conveted to and compared with const_i…
Browse files Browse the repository at this point in the history
…terator

Summary:
This seemed to be an oversight seeing as DenseMap has these conversions.

This patch does the following:
- Adds a default constructor to the iterators.
- Allows DenseSet::ConstIterators to be copy constructed from DenseSet::Iterators
- Allows mutual comparison between Iterators and ConstIterators.

All of these are available in the DenseMap implementation, so the implementation here is trivial.

Reviewers: dblaikie, dberris

Reviewed By: dberris

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D28999

llvm-svn: 292879
  • Loading branch information
deanberris committed Jan 24, 2017
1 parent b2a23cf commit 227c6eb
Showing 2 changed files with 20 additions and 2 deletions.
13 changes: 11 additions & 2 deletions llvm/include/llvm/ADT/DenseSet.h
Original file line number Diff line number Diff line change
@@ -90,9 +90,12 @@ class DenseSetImpl {

// Iterators.

class ConstIterator;

class Iterator {
typename MapTy::iterator I;
friend class DenseSetImpl;
friend class ConstIterator;

public:
typedef typename MapTy::iterator::difference_type difference_type;
@@ -101,6 +104,7 @@ class DenseSetImpl {
typedef value_type &reference;
typedef std::forward_iterator_tag iterator_category;

Iterator() = default;
Iterator(const typename MapTy::iterator &i) : I(i) {}

ValueT &operator*() { return I->getFirst(); }
@@ -110,13 +114,14 @@ class DenseSetImpl {

Iterator& operator++() { ++I; return *this; }
Iterator operator++(int) { auto T = *this; ++I; return T; }
bool operator==(const Iterator& X) const { return I == X.I; }
bool operator!=(const Iterator& X) const { return I != X.I; }
bool operator==(const ConstIterator& X) const { return I == X.I; }
bool operator!=(const ConstIterator& X) const { return I != X.I; }
};

class ConstIterator {
typename MapTy::const_iterator I;
friend class DenseSet;
friend class Iterator;

public:
typedef typename MapTy::const_iterator::difference_type difference_type;
@@ -125,6 +130,10 @@ class DenseSetImpl {
typedef value_type &reference;
typedef std::forward_iterator_tag iterator_category;

ConstIterator(const Iterator &B) : I(B.I) {}

ConstIterator() = default;

ConstIterator(const typename MapTy::const_iterator &i) : I(i) {}

const ValueT &operator*() const { return I->getFirst(); }
9 changes: 9 additions & 0 deletions llvm/unittests/ADT/DenseSetTest.cpp
Original file line number Diff line number Diff line change
@@ -73,6 +73,15 @@ TYPED_TEST(DenseSetTest, InitializerList) {
EXPECT_EQ(0u, set.count(3));
}

TYPED_TEST(DenseSetTest, ConstIteratorComparison){
TypeParam set({1});
const TypeParam &cset = set;
EXPECT_EQ(set.begin(), cset.begin());
EXPECT_EQ(set.end(), cset.end());
EXPECT_NE(set.end(), cset.begin());
EXPECT_NE(set.begin(), cset.end());
}

TYPED_TEST(DenseSetTest, EmptyInitializerList) {
TypeParam set({});
EXPECT_EQ(0u, set.size());

0 comments on commit 227c6eb

Please sign in to comment.