//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // REQUIRES: std-at-least-c++23 // // template // join_with_view(R&&, P&&) -> join_with_view, views::all_t

>; // // template // join_with_view(R&&, range_value_t>) // -> join_with_view, single_view>>>; #include #include #include #include "test_iterators.h" struct View : std::ranges::view_base { using It = cpp20_input_iterator*>; View() = default; It begin() const; sentinel_wrapper end() const; }; static_assert(std::ranges::input_range); static_assert(std::ranges::view); struct Pattern : std::ranges::view_base { Pattern() = default; forward_iterator begin(); forward_iterator end(); }; static_assert(std::ranges::forward_range); static_assert(std::ranges::view); // A range that is not a view struct Range { using It = cpp20_input_iterator*>; Range() = default; It begin() const; sentinel_wrapper end() const; }; static_assert(std::ranges::input_range); static_assert(!std::ranges::view); // A pattern that is not a view struct RangePattern { RangePattern() = default; forward_iterator begin(); forward_iterator end(); }; static_assert(std::ranges::forward_range); static_assert(!std::ranges::view); void test_range_and_pattern_deduction_guide() { { // Both `v` and `pat` model `std::ranges::view`. { View v; Pattern pat; std::ranges::join_with_view view(v, pat); static_assert(std::is_same_v>); } { View v; std::ranges::join_with_view view(v, Pattern{}); static_assert(std::is_same_v>); } { Pattern pat; std::ranges::join_with_view view(View{}, pat); static_assert(std::is_same_v>); } { std::ranges::join_with_view view(View{}, Pattern{}); static_assert(std::is_same_v>); } } { // Only `pat` models `std::ranges::view`. { Range v; Pattern pat; std::ranges::join_with_view view(v, pat); static_assert(std::is_same_v, Pattern>>); } { Range v; std::ranges::join_with_view view(v, Pattern{}); static_assert(std::is_same_v, Pattern>>); } { Pattern pat; std::ranges::join_with_view view(Range{}, pat); static_assert( std::is_same_v, Pattern>>); } { std::ranges::join_with_view view(Range{}, Pattern{}); static_assert( std::is_same_v, Pattern>>); } } { // Only `v` models `std::ranges::view`. { View v; RangePattern pat; std::ranges::join_with_view view(v, pat); static_assert( std::is_same_v>>); } { View v; std::ranges::join_with_view view(v, RangePattern{}); static_assert( std::is_same_v>>); } { RangePattern pat; std::ranges::join_with_view view(View{}, pat); static_assert( std::is_same_v>>); } { std::ranges::join_with_view view(View{}, RangePattern{}); static_assert( std::is_same_v>>); } } { // Both `v` and `pat` don't model `std::ranges::view`. { Range r; RangePattern pat; std::ranges::join_with_view view(r, pat); static_assert(std::is_same_v< decltype(view), std::ranges::join_with_view, std::ranges::ref_view>>); } { Range r; std::ranges::join_with_view view(r, RangePattern{}); static_assert(std::is_same_v< decltype(view), std::ranges::join_with_view, std::ranges::owning_view>>); } { RangePattern pat; std::ranges::join_with_view view(Range{}, pat); static_assert(std::is_same_v< decltype(view), std::ranges::join_with_view, std::ranges::ref_view>>); } { std::ranges::join_with_view view(Range{}, RangePattern{}); static_assert( std::is_same_v< decltype(view), std::ranges::join_with_view, std::ranges::owning_view>>); } } } void test_range_and_element_deduction_guide() { { // Element is lvalue int elem = 0; { View v; std::ranges::join_with_view view(v, elem); static_assert(std::is_same_v>>); } { std::ranges::join_with_view view(View{}, elem); static_assert(std::is_same_v>>); } { Range r; std::ranges::join_with_view view(r, elem); static_assert( std::is_same_v, std::ranges::single_view>>); } { std::ranges::join_with_view view(Range{}, elem); static_assert( std::is_same_v, std::ranges::single_view>>); } } { // Element is rvalue { View v; std::ranges::join_with_view view(v, 1); static_assert(std::is_same_v>>); } { std::ranges::join_with_view view(View{}, 1); static_assert(std::is_same_v>>); } { Range r; std::ranges::join_with_view view(r, 1); static_assert( std::is_same_v, std::ranges::single_view>>); } { std::ranges::join_with_view view(Range{}, 1); static_assert( std::is_same_v, std::ranges::single_view>>); } } }