xref: /llvm-project/libcxx/test/std/ranges/range.adaptors/range.lazy.split/ctad.compile.pass.cpp (revision b8cb1dc9ea87faa8e8e9ab7a31710a8c0bb8b084)
1*e53c461bSKonstantin Varlamov //===----------------------------------------------------------------------===//
2*e53c461bSKonstantin Varlamov //
3*e53c461bSKonstantin Varlamov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*e53c461bSKonstantin Varlamov // See https://llvm.org/LICENSE.txt for license information.
5*e53c461bSKonstantin Varlamov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*e53c461bSKonstantin Varlamov //
7*e53c461bSKonstantin Varlamov //===----------------------------------------------------------------------===//
8*e53c461bSKonstantin Varlamov 
9*e53c461bSKonstantin Varlamov // UNSUPPORTED: c++03, c++11, c++14, c++17
10*e53c461bSKonstantin Varlamov 
11*e53c461bSKonstantin Varlamov // template <class R, class P>
12*e53c461bSKonstantin Varlamov // lazy_split_view(R&&, P&&) -> lazy_split_view<views::all_t<R>, views::all_t<P>>;
13*e53c461bSKonstantin Varlamov //
14*e53c461bSKonstantin Varlamov // template <input_range R>
15*e53c461bSKonstantin Varlamov // lazy_split_view(R&&, range_value_t<R>) -> lazy_split_view<views::all_t<R>, single_view<range_value_t<R>>>;
16*e53c461bSKonstantin Varlamov 
17*e53c461bSKonstantin Varlamov #include <ranges>
18*e53c461bSKonstantin Varlamov 
19*e53c461bSKonstantin Varlamov #include <concepts>
20*e53c461bSKonstantin Varlamov #include <type_traits>
21*e53c461bSKonstantin Varlamov #include <utility>
22*e53c461bSKonstantin Varlamov #include "types.h"
23*e53c461bSKonstantin Varlamov 
24*e53c461bSKonstantin Varlamov struct ForwardRange {
25*e53c461bSKonstantin Varlamov   forward_iterator<const char*> begin() const;
26*e53c461bSKonstantin Varlamov   forward_iterator<const char*> end() const;
27*e53c461bSKonstantin Varlamov };
28*e53c461bSKonstantin Varlamov static_assert( std::ranges::forward_range<ForwardRange>);
29*e53c461bSKonstantin Varlamov 
30*e53c461bSKonstantin Varlamov struct InputRange {
31*e53c461bSKonstantin Varlamov   cpp20_input_iterator<const char*> begin() const;
32*e53c461bSKonstantin Varlamov   sentinel_wrapper<cpp20_input_iterator<const char*>> end() const;
33*e53c461bSKonstantin Varlamov };
34*e53c461bSKonstantin Varlamov static_assert(std::ranges::input_range<InputRange>);
35*e53c461bSKonstantin Varlamov 
36*e53c461bSKonstantin Varlamov template <class I1, class I2, class ExpectedView, class ExpectedPattern>
test()37*e53c461bSKonstantin Varlamov constexpr void test() {
38*e53c461bSKonstantin Varlamov   I1 i1{};
39*e53c461bSKonstantin Varlamov   I2 i2{};
40*e53c461bSKonstantin Varlamov 
41*e53c461bSKonstantin Varlamov   std::ranges::lazy_split_view v(std::move(i1), std::move(i2));
42*e53c461bSKonstantin Varlamov   static_assert(std::same_as<decltype(v), std::ranges::lazy_split_view<ExpectedView, ExpectedPattern>>);
43*e53c461bSKonstantin Varlamov   using O = decltype(std::move(v).base());
44*e53c461bSKonstantin Varlamov   static_assert(std::same_as<O, ExpectedView>);
45*e53c461bSKonstantin Varlamov }
46*e53c461bSKonstantin Varlamov 
testCtad()47*e53c461bSKonstantin Varlamov constexpr void testCtad() {
48*e53c461bSKonstantin Varlamov   // (Range, Pattern)
49*e53c461bSKonstantin Varlamov   test<ForwardView, ForwardView, ForwardView, ForwardView>();
50*e53c461bSKonstantin Varlamov   test<ForwardRange, ForwardRange, std::ranges::views::all_t<ForwardRange>, std::ranges::views::all_t<ForwardRange>>();
51*e53c461bSKonstantin Varlamov 
52*e53c461bSKonstantin Varlamov   // (Range, RangeElement)
53*e53c461bSKonstantin Varlamov   test<ForwardRange, char, std::ranges::views::all_t<ForwardRange>, std::ranges::single_view<char>>();
54*e53c461bSKonstantin Varlamov   test<InputRange, char, std::ranges::views::all_t<InputRange>, std::ranges::single_view<char>>();
55*e53c461bSKonstantin Varlamov 
56*e53c461bSKonstantin Varlamov   // (Range, RangeElement) with implicit conversion.
57*e53c461bSKonstantin Varlamov   test<ForwardRange, bool, std::ranges::views::all_t<ForwardRange>, std::ranges::single_view<char>>();
58*e53c461bSKonstantin Varlamov   test<InputRange, bool, std::ranges::views::all_t<InputRange>, std::ranges::single_view<char>>();
59*e53c461bSKonstantin Varlamov 
60*e53c461bSKonstantin Varlamov   // Note: CTAD from (InputRange, ForwardTinyRange) doesn't work -- the deduction guide wraps the pattern in
61*e53c461bSKonstantin Varlamov   // `views::all_t`, resulting in `views::owning_view<ForwardTinyRange>`. That type would never satisfy `tiny-range`
62*e53c461bSKonstantin Varlamov   // because `views::owning_view` contains a member function `size()` that shadows the static `size()` in
63*e53c461bSKonstantin Varlamov   // `ForwardTinyRange`.
64*e53c461bSKonstantin Varlamov }
65