19d982c67Szoecarver //===----------------------------------------------------------------------===//
29d982c67Szoecarver //
39d982c67Szoecarver // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
49d982c67Szoecarver // See https://llvm.org/LICENSE.txt for license information.
59d982c67Szoecarver // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
69d982c67Szoecarver //
79d982c67Szoecarver //===----------------------------------------------------------------------===//
89d982c67Szoecarver
99d982c67Szoecarver // UNSUPPORTED: c++03, c++11, c++14, c++17
109d982c67Szoecarver // UNSUPPORTED: libcpp-has-no-incomplete-ranges
119d982c67Szoecarver
129d982c67Szoecarver // constexpr V base() const& requires copy_constructible<V> { return base_; }
139d982c67Szoecarver // constexpr V base() && { return std::move(base_); }
149d982c67Szoecarver
159d982c67Szoecarver #include <ranges>
169d982c67Szoecarver
17*a6406ce1SLouis Dionne #include <cassert>
18*a6406ce1SLouis Dionne #include <concepts>
19*a6406ce1SLouis Dionne
209d982c67Szoecarver #include "types.h"
219d982c67Szoecarver
test()229d982c67Szoecarver constexpr bool test() {
239d982c67Szoecarver int buffer[8] = {1, 2, 3, 4, 5, 6, 7, 8};
249d982c67Szoecarver
259d982c67Szoecarver // Test common ranges.
269d982c67Szoecarver {
279d982c67Szoecarver // Test non-const.
289d982c67Szoecarver {
29*a6406ce1SLouis Dionne auto rev = std::ranges::reverse_view(BidirRange{buffer, buffer + 8});
309d982c67Szoecarver
31*a6406ce1SLouis Dionne std::same_as<BidirRange> auto base = rev.base();
32*a6406ce1SLouis Dionne assert(base.begin_ == buffer);
33*a6406ce1SLouis Dionne assert(base.end_ == buffer + 8);
34*a6406ce1SLouis Dionne
35*a6406ce1SLouis Dionne std::same_as<BidirRange> auto moved = std::move(rev).base();
36*a6406ce1SLouis Dionne assert(moved.begin_ == buffer);
37*a6406ce1SLouis Dionne assert(moved.end_ == buffer + 8);
389d982c67Szoecarver }
399d982c67Szoecarver // Test const.
409d982c67Szoecarver {
41*a6406ce1SLouis Dionne const auto rev = std::ranges::reverse_view(BidirRange{buffer, buffer + 8});
429d982c67Szoecarver
43*a6406ce1SLouis Dionne std::same_as<BidirRange> auto base = rev.base();
44*a6406ce1SLouis Dionne assert(base.begin_ == buffer);
45*a6406ce1SLouis Dionne assert(base.end_ == buffer + 8);
46*a6406ce1SLouis Dionne
47*a6406ce1SLouis Dionne std::same_as<BidirRange> auto moved = std::move(rev).base();
48*a6406ce1SLouis Dionne assert(moved.begin_ == buffer);
49*a6406ce1SLouis Dionne assert(moved.end_ == buffer + 8);
509d982c67Szoecarver }
519d982c67Szoecarver }
529d982c67Szoecarver // Test non-common ranges.
539d982c67Szoecarver {
549d982c67Szoecarver // Test non-const (also move only).
559d982c67Szoecarver {
56*a6406ce1SLouis Dionne auto rev = std::ranges::reverse_view(BidirSentRange<MoveOnly>{buffer, buffer + 8});
57*a6406ce1SLouis Dionne std::same_as<BidirSentRange<MoveOnly>> auto base = std::move(rev).base();
58*a6406ce1SLouis Dionne assert(base.begin_ == buffer);
59*a6406ce1SLouis Dionne assert(base.end_ == buffer + 8);
609d982c67Szoecarver }
619d982c67Szoecarver // Test const.
629d982c67Szoecarver {
63*a6406ce1SLouis Dionne const auto rev = std::ranges::reverse_view(BidirSentRange<Copyable>{buffer, buffer + 8});
649d982c67Szoecarver
65*a6406ce1SLouis Dionne std::same_as<BidirSentRange<Copyable>> auto base = rev.base();
66*a6406ce1SLouis Dionne assert(base.begin_ == buffer);
67*a6406ce1SLouis Dionne assert(base.end_ == buffer + 8);
68*a6406ce1SLouis Dionne
69*a6406ce1SLouis Dionne std::same_as<BidirSentRange<Copyable>> auto moved = std::move(rev).base();
70*a6406ce1SLouis Dionne assert(moved.begin_ == buffer);
71*a6406ce1SLouis Dionne assert(moved.end_ == buffer + 8);
729d982c67Szoecarver }
739d982c67Szoecarver }
749d982c67Szoecarver
759d982c67Szoecarver return true;
769d982c67Szoecarver }
779d982c67Szoecarver
main(int,char **)789d982c67Szoecarver int main(int, char**) {
799d982c67Szoecarver test();
809d982c67Szoecarver static_assert(test());
819d982c67Szoecarver
829d982c67Szoecarver return 0;
839d982c67Szoecarver }
84