diff options
Diffstat (limited to 'libcxx/include/__iterator/reverse_iterator.h')
| -rw-r--r-- | libcxx/include/__iterator/reverse_iterator.h | 107 | 
1 files changed, 56 insertions, 51 deletions
| diff --git a/libcxx/include/__iterator/reverse_iterator.h b/libcxx/include/__iterator/reverse_iterator.h index 5c344c2ee310..f272e03c17a6 100644 --- a/libcxx/include/__iterator/reverse_iterator.h +++ b/libcxx/include/__iterator/reverse_iterator.h @@ -25,12 +25,20 @@  #include <__iterator/next.h>  #include <__iterator/prev.h>  #include <__iterator/readable_traits.h> +#include <__iterator/segmented_iterator.h>  #include <__memory/addressof.h>  #include <__ranges/access.h>  #include <__ranges/concepts.h>  #include <__ranges/subrange.h> +#include <__type_traits/conditional.h> +#include <__type_traits/enable_if.h> +#include <__type_traits/is_assignable.h> +#include <__type_traits/is_convertible.h> +#include <__type_traits/is_nothrow_copy_constructible.h> +#include <__type_traits/is_pointer.h> +#include <__type_traits/is_same.h> +#include <__utility/declval.h>  #include <__utility/move.h> -#include <type_traits>  #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)  #  pragma GCC system_header @@ -52,7 +60,7 @@ class _LIBCPP_TEMPLATE_VIS reverse_iterator  _LIBCPP_SUPPRESS_DEPRECATED_POP  private:  #ifndef _LIBCPP_ABI_NO_ITERATOR_BASES -    _Iter __t; // no longer used as of LWG #2360, not removed due to ABI break +    _Iter __t_; // no longer used as of LWG #2360, not removed due to ABI break  #endif  #if _LIBCPP_STD_VER > 17 @@ -70,9 +78,7 @@ public:                                    typename iterator_traits<_Iter>::iterator_category>;      using pointer = typename iterator_traits<_Iter>::pointer;  #if _LIBCPP_STD_VER > 17 -    using iterator_concept = _If<__is_cpp17_random_access_iterator<_Iter>::value, -                                  random_access_iterator_tag, -                                  bidirectional_iterator_tag>; +    using iterator_concept = _If<random_access_iterator<_Iter>, random_access_iterator_tag, bidirectional_iterator_tag>;      using value_type = iter_value_t<_Iter>;      using difference_type = iter_difference_t<_Iter>;      using reference = iter_reference_t<_Iter>; @@ -83,18 +89,18 @@ public:  #endif  #ifndef _LIBCPP_ABI_NO_ITERATOR_BASES -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 -    reverse_iterator() : __t(), current() {} +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 +    reverse_iterator() : __t_(), current() {} -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 -    explicit reverse_iterator(_Iter __x) : __t(__x), current(__x) {} +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 +    explicit reverse_iterator(_Iter __x) : __t_(__x), current(__x) {}      template <class _Up, class = __enable_if_t<          !is_same<_Up, _Iter>::value && is_convertible<_Up const&, _Iter>::value      > > -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17      reverse_iterator(const reverse_iterator<_Up>& __u) -        : __t(__u.base()), current(__u.base()) +        : __t_(__u.base()), current(__u.base())      { }      template <class _Up, class = __enable_if_t< @@ -102,22 +108,22 @@ public:          is_convertible<_Up const&, _Iter>::value &&          is_assignable<_Iter&, _Up const&>::value      > > -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17      reverse_iterator& operator=(const reverse_iterator<_Up>& __u) { -        __t = current = __u.base(); +        __t_ = current = __u.base();          return *this;      }  #else -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17      reverse_iterator() : current() {} -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17      explicit reverse_iterator(_Iter __x) : current(__x) {}      template <class _Up, class = __enable_if_t<          !is_same<_Up, _Iter>::value && is_convertible<_Up const&, _Iter>::value      > > -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17      reverse_iterator(const reverse_iterator<_Up>& __u)          : current(__u.base())      { } @@ -127,15 +133,15 @@ public:          is_convertible<_Up const&, _Iter>::value &&          is_assignable<_Iter&, _Up const&>::value      > > -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17      reverse_iterator& operator=(const reverse_iterator<_Up>& __u) {          current = __u.base();          return *this;      }  #endif -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17      _Iter base() const {return current;} -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17      reference operator*() const {_Iter __tmp = current; return *--__tmp;}  #if _LIBCPP_STD_VER > 17 @@ -150,36 +156,36 @@ public:        }      }  #else -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17      pointer operator->() const {        return std::addressof(operator*());      }  #endif // _LIBCPP_STD_VER > 17 -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17      reverse_iterator& operator++() {--current; return *this;} -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17      reverse_iterator operator++(int) {reverse_iterator __tmp(*this); --current; return __tmp;} -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17      reverse_iterator& operator--() {++current; return *this;} -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17      reverse_iterator operator--(int) {reverse_iterator __tmp(*this); ++current; return __tmp;} -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17      reverse_iterator operator+(difference_type __n) const {return reverse_iterator(current - __n);} -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17      reverse_iterator& operator+=(difference_type __n) {current -= __n; return *this;} -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17      reverse_iterator operator-(difference_type __n) const {return reverse_iterator(current + __n);} -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17      reverse_iterator& operator-=(difference_type __n) {current += __n; return *this;} -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17      reference operator[](difference_type __n) const {return *(*this + __n);}  #if _LIBCPP_STD_VER > 17      _LIBCPP_HIDE_FROM_ABI friend constexpr      iter_rvalue_reference_t<_Iter> iter_move(const reverse_iterator& __i)        noexcept(is_nothrow_copy_constructible_v<_Iter> && -          noexcept(ranges::iter_move(--declval<_Iter&>()))) { +          noexcept(ranges::iter_move(--std::declval<_Iter&>()))) {        auto __tmp = __i.base();        return ranges::iter_move(--__tmp);      } @@ -189,7 +195,7 @@ public:      void iter_swap(const reverse_iterator& __x, const reverse_iterator<_Iter2>& __y)        noexcept(is_nothrow_copy_constructible_v<_Iter> &&            is_nothrow_copy_constructible_v<_Iter2> && -          noexcept(ranges::iter_swap(--declval<_Iter&>(), --declval<_Iter2&>()))) { +          noexcept(ranges::iter_swap(--std::declval<_Iter&>(), --std::declval<_Iter2&>()))) {        auto __xtmp = __x.base();        auto __ytmp = __y.base();        ranges::iter_swap(--__xtmp, --__ytmp); @@ -197,14 +203,8 @@ public:  #endif // _LIBCPP_STD_VER > 17  }; -template <class _Iter> -struct __is_reverse_iterator : false_type {}; - -template <class _Iter> -struct __is_reverse_iterator<reverse_iterator<_Iter> > : true_type {}; -  template <class _Iter1, class _Iter2> -inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17  bool  operator==(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)  #if _LIBCPP_STD_VER > 17 @@ -217,7 +217,7 @@ operator==(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>&  }  template <class _Iter1, class _Iter2> -inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17  bool  operator<(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)  #if _LIBCPP_STD_VER > 17 @@ -230,7 +230,7 @@ operator<(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& _  }  template <class _Iter1, class _Iter2> -inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17  bool  operator!=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)  #if _LIBCPP_STD_VER > 17 @@ -243,7 +243,7 @@ operator!=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>&  }  template <class _Iter1, class _Iter2> -inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17  bool  operator>(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)  #if _LIBCPP_STD_VER > 17 @@ -256,7 +256,7 @@ operator>(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& _  }  template <class _Iter1, class _Iter2> -inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17  bool  operator>=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)  #if _LIBCPP_STD_VER > 17 @@ -269,7 +269,7 @@ operator>=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>&  }  template <class _Iter1, class _Iter2> -inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17  bool  operator<=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)  #if _LIBCPP_STD_VER > 17 @@ -293,7 +293,7 @@ operator<=>(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>&  #ifndef _LIBCPP_CXX03_LANG  template <class _Iter1, class _Iter2> -inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17  auto  operator-(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)  -> decltype(__y.base() - __x.base()) @@ -311,7 +311,7 @@ operator-(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& _  #endif  template <class _Iter> -inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17  reverse_iterator<_Iter>  operator+(typename reverse_iterator<_Iter>::difference_type __n, const reverse_iterator<_Iter>& __x)  { @@ -326,7 +326,7 @@ inline constexpr bool disable_sized_sentinel_for<reverse_iterator<_Iter1>, rever  #if _LIBCPP_STD_VER > 11  template <class _Iter> -inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17  reverse_iterator<_Iter> make_reverse_iterator(_Iter __i)  {      return reverse_iterator<_Iter>(__i); @@ -365,7 +365,7 @@ class __unconstrained_reverse_iterator {    _Iter __iter_;  public: -  static_assert(__is_cpp17_bidirectional_iterator<_Iter>::value); +  static_assert(__is_cpp17_bidirectional_iterator<_Iter>::value || bidirectional_iterator<_Iter>);    using iterator_type = _Iter;    using iterator_category = @@ -393,6 +393,14 @@ public:      }    } +  _LIBCPP_HIDE_FROM_ABI friend constexpr +  iter_rvalue_reference_t<_Iter> iter_move(const __unconstrained_reverse_iterator& __i) +    noexcept(is_nothrow_copy_constructible_v<_Iter> && +        noexcept(ranges::iter_move(--std::declval<_Iter&>()))) { +    auto __tmp = __i.base(); +    return ranges::iter_move(--__tmp); +  } +    _LIBCPP_HIDE_FROM_ABI constexpr __unconstrained_reverse_iterator& operator++() {      --__iter_;      return *this; @@ -472,9 +480,6 @@ public:    }  }; -template <class _Iter> -struct __is_reverse_iterator<__unconstrained_reverse_iterator<_Iter>> : true_type {}; -  #endif // _LIBCPP_STD_VER <= 17  template <template <class> class _RevIter1, template <class> class _RevIter2, class _Iter> @@ -493,7 +498,7 @@ struct __unwrap_reverse_iter_impl {    }  }; -#if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_RANGES) +#if _LIBCPP_STD_VER > 17  template <ranges::bidirectional_range _Range>  _LIBCPP_HIDE_FROM_ABI constexpr ranges::      subrange<reverse_iterator<ranges::iterator_t<_Range>>, reverse_iterator<ranges::iterator_t<_Range>>> | 
