1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9// UNSUPPORTED: c++03, c++11, c++14, c++17
10
11// constexpr outer-iterator(outer-iterator<!Const> i)
12// requires Const && convertible_to<iterator_t<View>, iterator_t<Base>>
13
14#include <ranges>
15
16#include <string_view>
17#include <type_traits>
18#include <utility>
19#include "../types.h"
20
21// outer-iterator<Const = true>
22
23template <class Iter>
24concept IsConstOuterIter = requires (Iter i) {
25 { *(*i).begin() } -> std::same_as<const char&>;
26};
27static_assert( IsConstOuterIter<OuterIterConst>);
28
29static_assert( std::convertible_to<
30 std::ranges::iterator_t<SplitViewDiff>, std::ranges::iterator_t<const SplitViewDiff>>);
31
32// outer-iterator<Const = false>
33
34template <class Iter>
35concept IsNonConstOuterIter = requires (Iter i) {
36 { *(*i).begin() } -> std::same_as<char&>;
37};
38static_assert( IsNonConstOuterIter<OuterIterNonConst>);
39
40static_assert(!std::is_constructible_v<OuterIterNonConst, OuterIterConst>);
41
42constexpr bool test() {
43 [[maybe_unused]] OuterIterConst i(OuterIterNonConst{});
44
45 return true;
46}
47
48int main(int, char**) {
49 test();
50 static_assert(test());
51
52 return 0;
53}
54

source code of libcxx/test/std/ranges/range.adaptors/range.lazy.split/range.lazy.split.outer/ctor.copy.pass.cpp