//===----------------------------------------------------------------------===// // // 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 // constexpr auto begin() requires (!simple-view) // { return ranges::begin(base_); } // // constexpr auto begin() const // requires range && // indirect_unary_predicate> // { return ranges::begin(base_); } #include #include #include #include #include "types.h" // Test Constraints template concept HasConstBegin = requires(const T& ct) { ct.begin(); }; template concept HasBegin = requires(T& t) { t.begin(); }; template concept HasConstAndNonConstBegin = HasConstBegin && requires(T& t, const T& ct) { requires !std::same_as; }; template concept HasOnlyNonConstBegin = HasBegin && !HasConstBegin; template concept HasOnlyConstBegin = HasConstBegin && !HasConstAndNonConstBegin; struct Pred { constexpr bool operator()(int i) const { return i > 5; } }; static_assert(HasOnlyConstBegin>); static_assert(HasOnlyNonConstBegin>); static_assert(HasConstAndNonConstBegin>); struct NotPredForConst { constexpr bool operator()(int& i) const { return i > 5; } }; static_assert(HasOnlyNonConstBegin>); constexpr bool test() { // simple-view { int buffer[] = {1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1}; SimpleView v{buffer}; std::ranges::take_while_view twv(v, Pred{}); std::same_as decltype(auto) it1 = twv.begin(); assert(it1 == buffer); std::same_as decltype(auto) it2 = std::as_const(twv).begin(); assert(it2 == buffer); } // const not range { int buffer[] = {1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1}; ConstNotRange v{buffer}; std::ranges::take_while_view twv(v, Pred{}); std::same_as decltype(auto) it1 = twv.begin(); assert(it1 == buffer); } // NonSimple { int buffer[] = {1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1}; NonSimple v{buffer}; std::ranges::take_while_view twv(v, Pred{}); std::same_as decltype(auto) it1 = twv.begin(); assert(it1 == buffer); std::same_as decltype(auto) it2 = std::as_const(twv).begin(); assert(it2 == buffer); } // NotPredForConst // LWG 3450: The const overloads of `take_while_view::begin/end` are underconstrained { int buffer[] = {1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1}; NonSimple v{buffer}; std::ranges::take_while_view twv(v, NotPredForConst{}); std::same_as decltype(auto) it1 = twv.begin(); assert(it1 == buffer); } return true; } int main(int, char**) { test(); static_assert(test()); return 0; }