1*f73050e7SLouis Dionne //===----------------------------------------------------------------------===// 2*f73050e7SLouis Dionne // 3*f73050e7SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*f73050e7SLouis Dionne // See https://llvm.org/LICENSE.txt for license information. 5*f73050e7SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*f73050e7SLouis Dionne // 7*f73050e7SLouis Dionne //===----------------------------------------------------------------------===// 8*f73050e7SLouis Dionne 9*f73050e7SLouis Dionne // UNSUPPORTED: c++03, c++11, c++14, c++17 10*f73050e7SLouis Dionne 11*f73050e7SLouis Dionne // class std::ranges::subrange; 12*f73050e7SLouis Dionne 13*f73050e7SLouis Dionne #include <ranges> 14*f73050e7SLouis Dionne #include <cassert> 15*f73050e7SLouis Dionne #include <iterator> 16*f73050e7SLouis Dionne 17*f73050e7SLouis Dionne #include "test_iterators.h" 18*f73050e7SLouis Dionne #include "type_algorithms.h" 19*f73050e7SLouis Dionne 20*f73050e7SLouis Dionne template <class Iterator, class Sentinel> 21*f73050e7SLouis Dionne constexpr bool test() { 22*f73050e7SLouis Dionne using Subrange = std::ranges::subrange<Iterator, Sentinel>; 23*f73050e7SLouis Dionne 24*f73050e7SLouis Dionne // Empty subrange 25*f73050e7SLouis Dionne { 26*f73050e7SLouis Dionne int array[10] = {}; 27*f73050e7SLouis Dionne Subrange rng(Iterator(std::begin(array)), Sentinel(Iterator(std::begin(array)))); 28*f73050e7SLouis Dionne std::same_as<Iterator> decltype(auto) beg = rng.begin(); 29*f73050e7SLouis Dionne std::same_as<Sentinel> decltype(auto) end = rng.end(); 30*f73050e7SLouis Dionne assert(beg == Iterator(std::begin(array))); 31*f73050e7SLouis Dionne assert(end == Iterator(std::begin(array))); 32*f73050e7SLouis Dionne } 33*f73050e7SLouis Dionne 34*f73050e7SLouis Dionne // Non-empty subrange 35*f73050e7SLouis Dionne { 36*f73050e7SLouis Dionne int array[10] = {}; 37*f73050e7SLouis Dionne Subrange rng(Iterator(std::begin(array)), Sentinel(Iterator(std::end(array) - 3))); 38*f73050e7SLouis Dionne std::same_as<Iterator> decltype(auto) beg = rng.begin(); 39*f73050e7SLouis Dionne std::same_as<Sentinel> decltype(auto) end = rng.end(); 40*f73050e7SLouis Dionne assert(beg == Iterator(std::begin(array))); 41*f73050e7SLouis Dionne assert(end == Iterator(std::end(array) - 3)); 42*f73050e7SLouis Dionne } 43*f73050e7SLouis Dionne 44*f73050e7SLouis Dionne return true; 45*f73050e7SLouis Dionne } 46*f73050e7SLouis Dionne 47*f73050e7SLouis Dionne int main(int, char**) { 48*f73050e7SLouis Dionne types::for_each(types::forward_iterator_list<int*>{}, []<class Iterator> { 49*f73050e7SLouis Dionne test<Iterator, sentinel_wrapper<Iterator>>(); 50*f73050e7SLouis Dionne static_assert(test<Iterator, sentinel_wrapper<Iterator>>()); 51*f73050e7SLouis Dionne }); 52*f73050e7SLouis Dionne 53*f73050e7SLouis Dionne return 0; 54*f73050e7SLouis Dionne } 55