using std::same_as;
using C = test_contiguous_range<char>;
+using R = test_random_access_range<char>;
using I = test_input_range<char>;
using O = test_output_range<char>;
static_assert( same_as<std::ranges::sentinel_t<O>,
decltype(std::declval<O&>().end())> );
-static_assert( same_as<std::ranges::range_difference_t<C>,
+static_assert( ! same_as<std::ranges::range_difference_t<C>,
+ std::ptrdiff_t> ); // __detail::__max_diff_type
+static_assert( same_as<std::ranges::range_difference_t<R>,
std::ptrdiff_t> );
static_assert( same_as<std::ranges::range_difference_t<O>,
std::ptrdiff_t> );
#include <bits/move.h>
#endif
+#if __cplusplus > 201703L
+#include <bits/max_size_type.h>
+#endif
+
#ifndef _TESTSUITE_ITERATORS
#define _TESTSUITE_ITERATORS
using iterator_concept = std::contiguous_iterator_tag;
+ // Use an integer-class type to try and break the library code.
+ using difference_type = std::ranges::__detail::__max_diff_type;
+
contiguous_iterator_wrapper&
operator++()
{
}
contiguous_iterator_wrapper&
- operator+=(std::ptrdiff_t n)
+ operator+=(difference_type n)
{
- random_access_iterator_wrapper<T>::operator+=(n);
+ auto d = static_cast<std::ptrdiff_t>(n);
+ random_access_iterator_wrapper<T>::operator+=(d);
return *this;
}
friend contiguous_iterator_wrapper
- operator+(contiguous_iterator_wrapper iter, std::ptrdiff_t n)
+ operator+(contiguous_iterator_wrapper iter, difference_type n)
{ return iter += n; }
friend contiguous_iterator_wrapper
- operator+(std::ptrdiff_t n, contiguous_iterator_wrapper iter)
+ operator+(difference_type n, contiguous_iterator_wrapper iter)
{ return iter += n; }
contiguous_iterator_wrapper&
- operator-=(std::ptrdiff_t n)
+ operator-=(difference_type n)
{ return *this += -n; }
friend contiguous_iterator_wrapper
- operator-(contiguous_iterator_wrapper iter, std::ptrdiff_t n)
+ operator-(contiguous_iterator_wrapper iter, difference_type n)
{ return iter -= n; }
+
+ friend difference_type
+ operator-(contiguous_iterator_wrapper l, contiguous_iterator_wrapper r)
+ {
+ const random_access_iterator_wrapper<T>& lbase = l;
+ const random_access_iterator_wrapper<T>& rbase = r;
+ return static_cast<difference_type>(lbase - rbase);
+ }
+
+ decltype(auto) operator[](difference_type n) const
+ {
+ auto d = static_cast<std::ptrdiff_t>(n);
+ return random_access_iterator_wrapper<T>::operator[](d);
+ }
};
template<typename T>
friend auto operator-(const sentinel& s, const I& i) noexcept
requires std::random_access_iterator<I>
- { return s.end - i.ptr; }
+ { return std::iter_difference_t<I>(s.end - i.ptr); }
friend auto operator-(const I& i, const sentinel& s) noexcept
requires std::random_access_iterator<I>
- { return i.ptr - s.end; }
+ { return std::iter_difference_t<I>(i.ptr - s.end); }
};
protected:
friend std::iter_difference_t<I>
operator-(const sentinel& s, const I& i) noexcept
- { return s.end - i.ptr; }
+ { return std::iter_difference_t<I>(s.end - i.ptr); }
friend std::iter_difference_t<I>
operator-(const I& i, const sentinel& s) noexcept
- { return i.ptr - s.end; }
+ { return std::iter_difference_t<I>(i.ptr - s.end); }
};
auto end() &