//===----------------------------------------------------------------------===// // // 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 end() requires (!simple-view) // { return sentinel(ranges::end(base_), addressof(*pred_)); } // constexpr auto end() const // requires range && // indirect_unary_predicate> // { return sentinel(ranges::end(base_), addressof(*pred_)); } #include #include #include #include #include "types.h" // Test Constraints template concept HasConstEnd = requires(const T& ct) { ct.end(); }; template concept HasEnd = requires(T& t) { t.end(); }; template concept HasConstAndNonConstEnd = HasConstEnd && requires(T& t, const T& ct) { requires !std::same_as; }; template concept HasOnlyNonConstEnd = HasEnd && !HasConstEnd; template concept HasOnlyConstEnd = HasConstEnd && !HasConstAndNonConstEnd; struct Pred { constexpr bool operator()(int i) const { return i < 5; } }; static_assert(HasOnlyConstEnd>); static_assert(HasOnlyNonConstEnd>); static_assert(HasConstAndNonConstEnd>); struct NotPredForConst { constexpr bool operator()(int& i) const { return i > 5; } }; static_assert(HasOnlyNonConstEnd>); 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{}); decltype(auto) it1 = twv.end(); assert(it1 == buffer + 4); decltype(auto) it2 = std::as_const(twv).end(); assert(it2 == buffer + 4); static_assert(std::same_as); } // 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{}); decltype(auto) it1 = twv.end(); assert(it1 == buffer + 4); } // 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{}); decltype(auto) it1 = twv.end(); assert(it1 == buffer + 4); decltype(auto) it2 = std::as_const(twv).end(); assert(it2 == buffer + 4); static_assert(!std::same_as); } // 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{}); decltype(auto) it1 = twv.end(); assert(it1 == buffer); } return true; } int main(int, char**) { test(); static_assert(test()); return 0; }