On Tue, Sep 16, 2014 at 1:38 PM, Marshall Clow <[email protected]> wrote:
> Author: marshall > Date: Tue Sep 16 15:38:11 2014 > New Revision: 217902 > > URL: http://llvm.org/viewvc/llvm-project?rev=217902&view=rev > Log: > Create a 'comma_iterator' class that overloads operator, and asserts when > it's called. Add tests to mismatch to make sure it can't be blindsided by > such an evil iterator. More tests for other algorithms forthcoming. Thanks > to STL for pointing this out at CppCon and Yakov Galka for opening LWG > issue #2133 > Could it use "= delete" to make this test fail at compile-time? > > Modified: > > libcxx/trunk/test/algorithms/alg.nonmodifying/mismatch/mismatch.pass.cpp > > libcxx/trunk/test/algorithms/alg.nonmodifying/mismatch/mismatch_pred.pass.cpp > libcxx/trunk/test/support/test_iterators.h > > Modified: > libcxx/trunk/test/algorithms/alg.nonmodifying/mismatch/mismatch.pass.cpp > URL: > http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/algorithms/alg.nonmodifying/mismatch/mismatch.pass.cpp?rev=217902&r1=217901&r2=217902&view=diff > > ============================================================================== > --- > libcxx/trunk/test/algorithms/alg.nonmodifying/mismatch/mismatch.pass.cpp > (original) > +++ > libcxx/trunk/test/algorithms/alg.nonmodifying/mismatch/mismatch.pass.cpp > Tue Sep 16 15:38:11 2014 > @@ -36,6 +36,14 @@ int main() > input_iterator<const int*>(ia+3), > input_iterator<const int*>(ib+3)))); > > + assert(std::mismatch(comma_iterator<const int*>(ia), > + comma_iterator<const int*>(ia + sa), > + comma_iterator<const int*>(ib)) == > + (std::pair<comma_iterator<const int*>, > + comma_iterator<const int*> >( > + comma_iterator<const int*>(ia+3), > + comma_iterator<const int*>(ib+3)))); > + > #ifdef HAS_FOUR_ITERATOR_VERSION > assert(std::mismatch(input_iterator<const int*>(ia), > input_iterator<const int*>(ia + sa), > > Modified: > libcxx/trunk/test/algorithms/alg.nonmodifying/mismatch/mismatch_pred.pass.cpp > URL: > http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/algorithms/alg.nonmodifying/mismatch/mismatch_pred.pass.cpp?rev=217902&r1=217901&r2=217902&view=diff > > ============================================================================== > --- > libcxx/trunk/test/algorithms/alg.nonmodifying/mismatch/mismatch_pred.pass.cpp > (original) > +++ > libcxx/trunk/test/algorithms/alg.nonmodifying/mismatch/mismatch_pred.pass.cpp > Tue Sep 16 15:38:11 2014 > @@ -39,6 +39,14 @@ int main() > input_iterator<const int*> >( > input_iterator<const int*>(ia+3), > input_iterator<const int*>(ib+3)))); > + assert(std::mismatch(comma_iterator<const int*>(ia), > + comma_iterator<const int*>(ia + sa), > + comma_iterator<const int*>(ib), > + std::equal_to<int>()) == > + (std::pair<comma_iterator<const int*>, > + comma_iterator<const int*> >( > + comma_iterator<const int*>(ia+3), > + comma_iterator<const int*>(ib+3)))); > #ifdef HAS_FOUR_ITERATOR_VERSION > assert(std::mismatch(input_iterator<const int*>(ia), > input_iterator<const int*>(ia + sa), > > Modified: libcxx/trunk/test/support/test_iterators.h > URL: > http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/support/test_iterators.h?rev=217902&r1=217901&r2=217902&view=diff > > ============================================================================== > --- libcxx/trunk/test/support/test_iterators.h (original) > +++ libcxx/trunk/test/support/test_iterators.h Tue Sep 16 15:38:11 2014 > @@ -284,6 +284,108 @@ operator-(const random_access_iterator<T > return x.base() - y.base(); > } > > +template <class It> > +class comma_iterator > +{ > + It it_; > + > + template <class U> friend class comma_iterator; > +public: > + typedef std::random_access_iterator_tag > iterator_category; > + typedef typename std::iterator_traits<It>::value_type value_type; > + typedef typename std::iterator_traits<It>::difference_type > difference_type; > + typedef It pointer; > + typedef typename std::iterator_traits<It>::reference reference; > + > + It base() const {return it_;} > + > + comma_iterator() : it_() {} > + explicit comma_iterator(It it) : it_(it) {} > + template <class U> > + comma_iterator(const comma_iterator<U>& u) :it_(u.it_) {} > + > + reference operator*() const {return *it_;} > + pointer operator->() const {return it_;} > + > + comma_iterator& operator++() {++it_; return *this;} > + comma_iterator operator++(int) > + {comma_iterator tmp(*this); ++(*this); return tmp;} > + > + comma_iterator& operator--() {--it_; return *this;} > + comma_iterator operator--(int) > + {comma_iterator tmp(*this); --(*this); return tmp;} > + > + comma_iterator& operator+=(difference_type n) {it_ += n; return > *this;} > + comma_iterator operator+(difference_type n) const > + {comma_iterator tmp(*this); tmp += n; return tmp;} > + friend comma_iterator operator+(difference_type n, comma_iterator x) > + {x += n; return x;} > + comma_iterator& operator-=(difference_type n) {return *this += -n;} > + comma_iterator operator-(difference_type n) const > + {comma_iterator tmp(*this); tmp -= n; return tmp;} > + > + reference operator[](difference_type n) const {return it_[n];} > + template <typename T> > + void operator,(const T &) { assert(false); } > +}; > + > +template <class T, class U> > +inline > +bool > +operator==(const comma_iterator<T>& x, const comma_iterator<U>& y) > +{ > + return x.base() == y.base(); > +} > + > +template <class T, class U> > +inline > +bool > +operator!=(const comma_iterator<T>& x, const comma_iterator<U>& y) > +{ > + return !(x == y); > +} > + > +template <class T, class U> > +inline > +bool > +operator<(const comma_iterator<T>& x, const comma_iterator<U>& y) > +{ > + return x.base() < y.base(); > +} > + > +template <class T, class U> > +inline > +bool > +operator<=(const comma_iterator<T>& x, const comma_iterator<U>& y) > +{ > + return !(y < x); > +} > + > +template <class T, class U> > +inline > +bool > +operator>(const comma_iterator<T>& x, const comma_iterator<U>& y) > +{ > + return y < x; > +} > + > +template <class T, class U> > +inline > +bool > +operator>=(const comma_iterator<T>& x, const comma_iterator<U>& y) > +{ > + return !(x < y); > +} > + > +template <class T, class U> > +inline > +typename std::iterator_traits<T>::difference_type > +operator-(const comma_iterator<T>& x, const comma_iterator<U>& y) > +{ > + return x.base() - y.base(); > +} > + > + > template <class Iter> > inline Iter base(output_iterator<Iter> i) { return i.base(); } > > @@ -299,6 +401,9 @@ inline Iter base(bidirectional_iterator< > template <class Iter> > inline Iter base(random_access_iterator<Iter> i) { return i.base(); } > > +template <class Iter> > +inline Iter base(comma_iterator<Iter> i) { return i.base(); } > + > template <class Iter> // everything else > inline Iter base(Iter i) { return i; } > > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
