libstdc++: Add a testsuite range type that has a sized sentinel

This adds a testsuite range type whose end() is a sized sentinel to
<testsuite_iterators.h>, which will be used in the tests that verify LWG 3355.

libstdc++-v3/ChangeLog:

	* testsuite/util/testsuite_iterators.h (test_range::get_iterator): Make
	protected instead of private.
	(test_sized_range_sized_sent): New.
This commit is contained in:
Patrick Palka 2020-03-02 22:32:22 -05:00
parent d6d4b339f5
commit 26af9cd8af
2 changed files with 36 additions and 0 deletions

View File

@ -1,5 +1,9 @@
2020-03-04 Patrick Palka <ppalka@redhat.com>
* testsuite/util/testsuite_iterators.h (test_range::get_iterator): Make
protected instead of private.
(test_sized_range_sized_sent): New.
* testsuite/util/testsuite_iterators.h (input_iterator_wrapper_nocopy):
New testsuite iterator.
* testsuite/24_iterators/counted_iterator/lwg3389.cc: use it.

View File

@ -735,6 +735,7 @@ namespace __gnu_test
{ return i.ptr - s.end; }
};
protected:
auto
get_iterator(T* p)
{
@ -812,6 +813,37 @@ namespace __gnu_test
using test_output_sized_range
= test_sized_range<T, output_iterator_wrapper>;
// A type meeting the minimum std::sized_range requirements, and whose end()
// returns a sized sentinel.
template<typename T, template<typename> class Iter>
struct test_sized_range_sized_sent : test_sized_range<T, Iter>
{
using test_sized_range<T, Iter>::test_sized_range;
template<typename I>
struct sentinel
{
T* end;
friend bool operator==(const sentinel& s, const I& i) noexcept
{ return s.end == i.ptr; }
friend std::iter_difference_t<I>
operator-(const sentinel& s, const I& i) noexcept
{ return s.end - i.ptr; }
friend std::iter_difference_t<I>
operator-(const I& i, const sentinel& s) noexcept
{ return i.ptr - s.end; }
};
auto end() &
{
using I = decltype(this->get_iterator(this->bounds.last));
return sentinel<I>{this->bounds.last};
}
};
// test_range and test_sized_range do not own their elements, so they model
// std::ranges::borrowed_range. This file does not define specializations of
// std::ranges::enable_borrowed_range, so that individual tests can decide