//===----------------------------------------------------------------------===// // // 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 // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14, c++17 // UNSUPPORTED: libcpp-no-concepts // UNSUPPORTED: libcpp-has-no-incomplete-ranges // template // concept viewable_range; #include #include #include "test_iterators.h" #include "test_range.h" // The constraints we have in viewable_range are: // range // view> // constructible_from, T> // borrowed_range // // We test all the relevant combinations of satisfying/not satisfying those constraints. // viewable_range is not satisfied for (range=false, view=*, constructible_from=*, borrowed_range=*) struct T1 { }; static_assert(!std::ranges::range); static_assert(!std::ranges::viewable_range); static_assert(!std::ranges::viewable_range); static_assert(!std::ranges::viewable_range); static_assert(!std::ranges::viewable_range); // viewable_range is satisfied for (range=true, view=true, constructible_from=true, borrowed_range=true) struct T2 : test_range, std::ranges::view_base { T2(T2 const&) = default; }; template<> constexpr bool std::ranges::enable_borrowed_range = true; static_assert(std::ranges::range); static_assert(std::ranges::view); static_assert(std::constructible_from); static_assert(std::ranges::borrowed_range); static_assert(std::ranges::viewable_range); static_assert(std::ranges::viewable_range); static_assert(std::ranges::viewable_range); static_assert(std::ranges::viewable_range); // viewable_range is satisfied for (range=true, view=true, constructible_from=true, borrowed_range=false) struct T3 : test_range, std::ranges::view_base { T3(T3 const&) = default; }; template<> constexpr bool std::ranges::enable_borrowed_range = false; static_assert(std::ranges::range); static_assert(std::ranges::view); static_assert(std::constructible_from); static_assert(!std::ranges::borrowed_range); static_assert(std::ranges::viewable_range); static_assert(std::ranges::viewable_range); static_assert(std::ranges::viewable_range); static_assert(std::ranges::viewable_range); // viewable_range is not satisfied for (range=true, view=true, constructible_from=false, borrowed_range=true) struct T4 : test_range, std::ranges::view_base { T4(T4 const&) = delete; T4(T4&&) = default; // necessary to model view T4& operator=(T4&&) = default; // necessary to model view }; static_assert(std::ranges::range); static_assert(std::ranges::view>); static_assert(!std::constructible_from, T4 const&>); static_assert(std::ranges::borrowed_range); static_assert(!std::ranges::viewable_range); // A type that satisfies (range=true, view=true, constructible_from=false, borrowed_range=false) can't be formed // viewable_range is satisfied for (range=true, view=false, constructible_from=true, borrowed_range=true) struct T5 : test_range { }; template<> constexpr bool std::ranges::enable_borrowed_range = true; static_assert(std::ranges::range); static_assert(!std::ranges::view); static_assert(std::constructible_from); static_assert(std::ranges::borrowed_range); static_assert(std::ranges::viewable_range); // viewable_range is not satisfied for (range=true, view=false, constructible_from=true, borrowed_range=false) struct T6 : test_range { }; template<> constexpr bool std::ranges::enable_borrowed_range = false; static_assert(std::ranges::range); static_assert(!std::ranges::view); static_assert(std::constructible_from); static_assert(!std::ranges::borrowed_range); static_assert(!std::ranges::viewable_range); // viewable_range is satisfied for (range=true, view=false, constructible_from=false, borrowed_range=true) struct T7 : test_range { T7(T7 const&) = delete; }; static_assert(std::ranges::range); static_assert(!std::ranges::view>); static_assert(!std::constructible_from, T7&>); static_assert(std::ranges::borrowed_range); static_assert(std::ranges::viewable_range); // A type that satisfies (range=true, view=false, constructible_from=false, borrowed_range=false) can't be formed struct T8 : test_range { T8(T8 const&) = delete; }; static_assert(std::ranges::range); static_assert(!std::ranges::view); static_assert(!std::constructible_from); static_assert(!std::ranges::borrowed_range); static_assert(!std::ranges::viewable_range); // Test with a few degenerate types static_assert(!std::ranges::viewable_range); static_assert(!std::ranges::viewable_range); static_assert(!std::ranges::viewable_range); static_assert(!std::ranges::viewable_range); static_assert(!std::ranges::viewable_range); static_assert(!std::ranges::viewable_range); // unbounded array is not a range static_assert( std::ranges::viewable_range);