From da6e660e1bbdce9a3ba85ac27772c1276c02c5cc Mon Sep 17 00:00:00 2001 From: Dean Michael Berris Date: Tue, 24 Jan 2017 04:11:18 +0000 Subject: [PATCH] Allow DenseSet::iterators to be conveted to and compared with const_iterator 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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@292879 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/ADT/DenseSet.h | 13 +++++++++++-- unittests/ADT/DenseSetTest.cpp | 9 +++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/include/llvm/ADT/DenseSet.h b/include/llvm/ADT/DenseSet.h index 0e26a9d42e8..b1345f7da73 100644 --- a/include/llvm/ADT/DenseSet.h +++ b/include/llvm/ADT/DenseSet.h @@ -90,9 +90,12 @@ public: // 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 @@ public: 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 @@ public: 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 @@ public: 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(); } diff --git a/unittests/ADT/DenseSetTest.cpp b/unittests/ADT/DenseSetTest.cpp index 4d5a82902f0..4b159744eba 100644 --- a/unittests/ADT/DenseSetTest.cpp +++ b/unittests/ADT/DenseSetTest.cpp @@ -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()); -- 2.40.0