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
119d982c67Szoecarver // constexpr V base() const& requires copy_constructible<V> { return base_; }
129d982c67Szoecarver // constexpr V base() && { return std::move(base_); }
139d982c67Szoecarver
149d982c67Szoecarver #include <ranges>
159d982c67Szoecarver
16*a6406ce1SLouis Dionne #include <cassert>
17*a6406ce1SLouis Dionne #include <concepts>
18*a6406ce1SLouis Dionne
199d982c67Szoecarver #include "types.h"
209d982c67Szoecarver
test()219d982c67Szoecarver constexpr bool test() {
229d982c67Szoecarver int buffer[8] = {1, 2, 3, 4, 5, 6, 7, 8};
239d982c67Szoecarver
249d982c67Szoecarver // Test common ranges.
259d982c67Szoecarver {
269d982c67Szoecarver // Test non-const.
279d982c67Szoecarver {
28*a6406ce1SLouis Dionne auto rev = std::ranges::reverse_view(BidirRange{buffer, buffer + 8});
299d982c67Szoecarver
30*a6406ce1SLouis Dionne std::same_as<BidirRange> auto base = rev.base();
31*a6406ce1SLouis Dionne assert(base.begin_ == buffer);
32*a6406ce1SLouis Dionne assert(base.end_ == buffer + 8);
33*a6406ce1SLouis Dionne
34*a6406ce1SLouis Dionne std::same_as<BidirRange> auto moved = std::move(rev).base();
35*a6406ce1SLouis Dionne assert(moved.begin_ == buffer);
36*a6406ce1SLouis Dionne assert(moved.end_ == buffer + 8);
379d982c67Szoecarver }
389d982c67Szoecarver // Test const.
399d982c67Szoecarver {
40*a6406ce1SLouis Dionne const auto rev = std::ranges::reverse_view(BidirRange{buffer, buffer + 8});
419d982c67Szoecarver
42*a6406ce1SLouis Dionne std::same_as<BidirRange> auto base = rev.base();
43*a6406ce1SLouis Dionne assert(base.begin_ == buffer);
44*a6406ce1SLouis Dionne assert(base.end_ == buffer + 8);
45*a6406ce1SLouis Dionne
46*a6406ce1SLouis Dionne std::same_as<BidirRange> auto moved = std::move(rev).base();
47*a6406ce1SLouis Dionne assert(moved.begin_ == buffer);
48*a6406ce1SLouis Dionne assert(moved.end_ == buffer + 8);
499d982c67Szoecarver }
509d982c67Szoecarver }
519d982c67Szoecarver // Test non-common ranges.
529d982c67Szoecarver {
539d982c67Szoecarver // Test non-const (also move only).
549d982c67Szoecarver {
55*a6406ce1SLouis Dionne auto rev = std::ranges::reverse_view(BidirSentRange<MoveOnly>{buffer, buffer + 8});
56*a6406ce1SLouis Dionne std::same_as<BidirSentRange<MoveOnly>> auto base = std::move(rev).base();
57*a6406ce1SLouis Dionne assert(base.begin_ == buffer);
58*a6406ce1SLouis Dionne assert(base.end_ == buffer + 8);
599d982c67Szoecarver }
609d982c67Szoecarver // Test const.
619d982c67Szoecarver {
62*a6406ce1SLouis Dionne const auto rev = std::ranges::reverse_view(BidirSentRange<Copyable>{buffer, buffer + 8});
639d982c67Szoecarver
64*a6406ce1SLouis Dionne std::same_as<BidirSentRange<Copyable>> auto base = rev.base();
65*a6406ce1SLouis Dionne assert(base.begin_ == buffer);
66*a6406ce1SLouis Dionne assert(base.end_ == buffer + 8);
67*a6406ce1SLouis Dionne
68*a6406ce1SLouis Dionne std::same_as<BidirSentRange<Copyable>> auto moved = std::move(rev).base();
69*a6406ce1SLouis Dionne assert(moved.begin_ == buffer);
70*a6406ce1SLouis Dionne assert(moved.end_ == buffer + 8);
719d982c67Szoecarver }
729d982c67Szoecarver }
739d982c67Szoecarver
749d982c67Szoecarver return true;
759d982c67Szoecarver }
769d982c67Szoecarver
main(int,char **)779d982c67Szoecarver int main(int, char**) {
789d982c67Szoecarver test();
799d982c67Szoecarver static_assert(test());
809d982c67Szoecarver
819d982c67Szoecarver return 0;
829d982c67Szoecarver }
83