@@ -339,62 +339,92 @@ cpp20_random_access_iterator(It) -> cpp20_random_access_iterator<It>;
339
339
340
340
static_assert (std::random_access_iterator<cpp20_random_access_iterator<int *>>);
341
341
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_;
346
345
347
- It it_;
346
+ template <std::contiguous_iterator U>
347
+ friend class contiguous_iterator ;
348
348
349
- template <class U > friend class contiguous_iterator ;
350
349
public:
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 ;
357
356
358
- TEST_CONSTEXPR_CXX14 It base () const {return it_;}
357
+ constexpr It base () const { return it_; }
359
358
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) {}
362
361
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_) {}
365
364
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
+ }
368
369
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
+ }
391
421
392
422
// Note no operator<=>, use three_way_contiguous_iterator for testing operator<=>
393
423
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_ ; }
395
425
396
- template <class T >
397
- void operator ,(T const &) = delete ;
426
+ template <class T >
427
+ void operator ,(T const &) = delete ;
398
428
};
399
429
template <class It >
400
430
contiguous_iterator (It) -> contiguous_iterator<It>;
0 commit comments