@@ -339,62 +339,92 @@ cpp20_random_access_iterator(It) -> cpp20_random_access_iterator<It>;
339339
340340static_assert (std::random_access_iterator<cpp20_random_access_iterator<int *>>);
341341
342- template <class It >
343- class contiguous_iterator
344- {
345- static_assert (std::is_pointer_v<It>, " Things probably break in this case" );
342+ template <std::contiguous_iterator It>
343+ class contiguous_iterator {
344+ It it_;
346345
347- It it_;
346+ template <std::contiguous_iterator U>
347+ friend class contiguous_iterator ;
348348
349- template <class U > friend class contiguous_iterator ;
350349public:
351- typedef std::contiguous_iterator_tag iterator_category ;
352- typedef typename std::iterator_traits<It>::value_type value_type;
353- typedef typename std::iterator_traits<It>::difference_type difference_type;
354- typedef It pointer;
355- typedef typename std::iterator_traits<It>::reference reference;
356- typedef typename std::remove_pointer<It>::type element_type ;
350+ using iterator_category = std::contiguous_iterator_tag;
351+ using value_type = typename std::iterator_traits<It>::value_type;
352+ using difference_type = typename std::iterator_traits<It>::difference_type;
353+ using pointer = typename std::iterator_traits<It>:: pointer;
354+ using reference = typename std::iterator_traits<It>::reference;
355+ using element_type = value_type ;
357356
358- TEST_CONSTEXPR_CXX14 It base () const {return it_;}
357+ constexpr It base () const { return it_; }
359358
360- TEST_CONSTEXPR_CXX14 contiguous_iterator () : it_() {}
361- TEST_CONSTEXPR_CXX14 explicit contiguous_iterator (It it) : it_(it) {}
359+ constexpr contiguous_iterator () : it_() {}
360+ constexpr explicit contiguous_iterator (It it) : it_(it) {}
362361
363- template <class U >
364- TEST_CONSTEXPR_CXX14 contiguous_iterator (const contiguous_iterator<U>& u) : it_(u.it_) {}
362+ template <class U >
363+ constexpr contiguous_iterator (const contiguous_iterator<U>& u) : it_(u.it_) {}
365364
366- template <class U , class = typename std::enable_if<std::is_default_constructible<U>::value>::type>
367- constexpr contiguous_iterator (contiguous_iterator<U>&& u) : it_(u.it_) { u.it_ = U (); }
365+ template <class U , class = typename std::enable_if<std::is_default_constructible<U>::value>::type>
366+ constexpr contiguous_iterator (contiguous_iterator<U>&& u) : it_(u.it_) {
367+ u.it_ = U ();
368+ }
368369
369- TEST_CONSTEXPR reference operator *() const {return *it_;}
370- TEST_CONSTEXPR pointer operator ->() const {return it_;}
371- TEST_CONSTEXPR reference operator [](difference_type n) const {return it_[n];}
372-
373- TEST_CONSTEXPR_CXX14 contiguous_iterator& operator ++() {++it_; return *this ;}
374- TEST_CONSTEXPR_CXX14 contiguous_iterator& operator --() {--it_; return *this ;}
375- TEST_CONSTEXPR_CXX14 contiguous_iterator operator ++(int ) {return contiguous_iterator (it_++);}
376- TEST_CONSTEXPR_CXX14 contiguous_iterator operator --(int ) {return contiguous_iterator (it_--);}
377-
378- TEST_CONSTEXPR_CXX14 contiguous_iterator& operator +=(difference_type n) {it_ += n; return *this ;}
379- TEST_CONSTEXPR_CXX14 contiguous_iterator& operator -=(difference_type n) {it_ -= n; return *this ;}
380- friend TEST_CONSTEXPR_CXX14 contiguous_iterator operator +(contiguous_iterator x, difference_type n) {x += n; return x;}
381- friend TEST_CONSTEXPR_CXX14 contiguous_iterator operator +(difference_type n, contiguous_iterator x) {x += n; return x;}
382- friend TEST_CONSTEXPR_CXX14 contiguous_iterator operator -(contiguous_iterator x, difference_type n) {x -= n; return x;}
383- friend TEST_CONSTEXPR difference_type operator -(contiguous_iterator x, contiguous_iterator y) {return x.it_ - y.it_ ;}
384-
385- friend TEST_CONSTEXPR bool operator ==(const contiguous_iterator& x, const contiguous_iterator& y) {return x.it_ == y.it_ ;}
386- friend TEST_CONSTEXPR bool operator !=(const contiguous_iterator& x, const contiguous_iterator& y) {return x.it_ != y.it_ ;}
387- friend TEST_CONSTEXPR bool operator < (const contiguous_iterator& x, const contiguous_iterator& y) {return x.it_ < y.it_ ;}
388- friend TEST_CONSTEXPR bool operator <=(const contiguous_iterator& x, const contiguous_iterator& y) {return x.it_ <= y.it_ ;}
389- friend TEST_CONSTEXPR bool operator > (const contiguous_iterator& x, const contiguous_iterator& y) {return x.it_ > y.it_ ;}
390- friend TEST_CONSTEXPR bool operator >=(const contiguous_iterator& x, const contiguous_iterator& y) {return x.it_ >= y.it_ ;}
370+ constexpr reference operator *() const { return *it_; }
371+ constexpr pointer operator ->() const { return it_; }
372+ constexpr reference operator [](difference_type n) const { return it_[n]; }
373+
374+ constexpr contiguous_iterator& operator ++() {
375+ ++it_;
376+ return *this ;
377+ }
378+ constexpr contiguous_iterator& operator --() {
379+ --it_;
380+ return *this ;
381+ }
382+ constexpr contiguous_iterator operator ++(int ) { return contiguous_iterator (it_++); }
383+ constexpr contiguous_iterator operator --(int ) { return contiguous_iterator (it_--); }
384+
385+ constexpr contiguous_iterator& operator +=(difference_type n) {
386+ it_ += n;
387+ return *this ;
388+ }
389+ constexpr contiguous_iterator& operator -=(difference_type n) {
390+ it_ -= n;
391+ return *this ;
392+ }
393+ friend constexpr contiguous_iterator operator +(contiguous_iterator x, difference_type n) {
394+ x += n;
395+ return x;
396+ }
397+ friend constexpr contiguous_iterator operator +(difference_type n, contiguous_iterator x) {
398+ x += n;
399+ return x;
400+ }
401+ friend constexpr contiguous_iterator operator -(contiguous_iterator x, difference_type n) {
402+ x -= n;
403+ return x;
404+ }
405+ friend constexpr difference_type operator -(contiguous_iterator x, contiguous_iterator y) { return x.it_ - y.it_ ; }
406+
407+ friend constexpr bool operator ==(const contiguous_iterator& x, const contiguous_iterator& y) {
408+ return x.it_ == y.it_ ;
409+ }
410+ friend constexpr bool operator !=(const contiguous_iterator& x, const contiguous_iterator& y) {
411+ return x.it_ != y.it_ ;
412+ }
413+ friend constexpr bool operator <(const contiguous_iterator& x, const contiguous_iterator& y) { return x.it_ < y.it_ ; }
414+ friend constexpr bool operator <=(const contiguous_iterator& x, const contiguous_iterator& y) {
415+ return x.it_ <= y.it_ ;
416+ }
417+ friend constexpr bool operator >(const contiguous_iterator& x, const contiguous_iterator& y) { return x.it_ > y.it_ ; }
418+ friend constexpr bool operator >=(const contiguous_iterator& x, const contiguous_iterator& y) {
419+ return x.it_ >= y.it_ ;
420+ }
391421
392422 // Note no operator<=>, use three_way_contiguous_iterator for testing operator<=>
393423
394- friend TEST_CONSTEXPR It base (const contiguous_iterator& i) { return i.it_ ; }
424+ friend constexpr It base (const contiguous_iterator& i) { return i.it_ ; }
395425
396- template <class T >
397- void operator ,(T const &) = delete ;
426+ template <class T >
427+ void operator ,(T const &) = delete ;
398428};
399429template <class It >
400430contiguous_iterator (It) -> contiguous_iterator<It>;
0 commit comments