xref: /llvm-project/libcxx/test/std/ranges/range.adaptors/range.reverse/base.pass.cpp (revision b8cb1dc9ea87faa8e8e9ab7a31710a8c0bb8b084)
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