xref: /llvm-project/libcxx/test/std/ranges/range.factories/range.single.view/begin.pass.cpp (revision b8cb1dc9ea87faa8e8e9ab7a31710a8c0bb8b084)
1*481ad59bSzoecarver //===----------------------------------------------------------------------===//
2*481ad59bSzoecarver //
3*481ad59bSzoecarver // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*481ad59bSzoecarver // See https://llvm.org/LICENSE.txt for license information.
5*481ad59bSzoecarver // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*481ad59bSzoecarver //
7*481ad59bSzoecarver //===----------------------------------------------------------------------===//
8*481ad59bSzoecarver 
9*481ad59bSzoecarver // UNSUPPORTED: c++03, c++11, c++14, c++17
10*481ad59bSzoecarver 
11*481ad59bSzoecarver // constexpr T* begin() noexcept;
12*481ad59bSzoecarver // constexpr const T* begin() const noexcept;
13*481ad59bSzoecarver 
14*481ad59bSzoecarver #include <ranges>
15*481ad59bSzoecarver #include <cassert>
16*481ad59bSzoecarver 
17*481ad59bSzoecarver #include "test_macros.h"
18*481ad59bSzoecarver 
19*481ad59bSzoecarver struct Empty {};
20*481ad59bSzoecarver struct BigType { char buffer[64] = {10}; };
21*481ad59bSzoecarver 
test()22*481ad59bSzoecarver constexpr bool test() {
23*481ad59bSzoecarver   {
24*481ad59bSzoecarver     auto sv = std::ranges::single_view<int>(42);
25*481ad59bSzoecarver     assert(*sv.begin() == 42);
26*481ad59bSzoecarver 
27*481ad59bSzoecarver     ASSERT_SAME_TYPE(decltype(sv.begin()), int*);
28*481ad59bSzoecarver     static_assert(noexcept(sv.begin()));
29*481ad59bSzoecarver   }
30*481ad59bSzoecarver   {
31*481ad59bSzoecarver     const auto sv = std::ranges::single_view<int>(42);
32*481ad59bSzoecarver     assert(*sv.begin() == 42);
33*481ad59bSzoecarver 
34*481ad59bSzoecarver     ASSERT_SAME_TYPE(decltype(sv.begin()), const int*);
35*481ad59bSzoecarver     static_assert(noexcept(sv.begin()));
36*481ad59bSzoecarver   }
37*481ad59bSzoecarver 
38*481ad59bSzoecarver   {
39*481ad59bSzoecarver     auto sv = std::ranges::single_view<Empty>(Empty());
40*481ad59bSzoecarver     assert(sv.begin() != nullptr);
41*481ad59bSzoecarver 
42*481ad59bSzoecarver     ASSERT_SAME_TYPE(decltype(sv.begin()), Empty*);
43*481ad59bSzoecarver   }
44*481ad59bSzoecarver   {
45*481ad59bSzoecarver     const auto sv = std::ranges::single_view<Empty>(Empty());
46*481ad59bSzoecarver     assert(sv.begin() != nullptr);
47*481ad59bSzoecarver 
48*481ad59bSzoecarver     ASSERT_SAME_TYPE(decltype(sv.begin()), const Empty*);
49*481ad59bSzoecarver   }
50*481ad59bSzoecarver 
51*481ad59bSzoecarver   {
52*481ad59bSzoecarver     auto sv = std::ranges::single_view<BigType>(BigType());
53*481ad59bSzoecarver     assert(sv.begin()->buffer[0] == 10);
54*481ad59bSzoecarver 
55*481ad59bSzoecarver     ASSERT_SAME_TYPE(decltype(sv.begin()), BigType*);
56*481ad59bSzoecarver   }
57*481ad59bSzoecarver   {
58*481ad59bSzoecarver     const auto sv = std::ranges::single_view<BigType>(BigType());
59*481ad59bSzoecarver     assert(sv.begin()->buffer[0] == 10);
60*481ad59bSzoecarver 
61*481ad59bSzoecarver     ASSERT_SAME_TYPE(decltype(sv.begin()), const BigType*);
62*481ad59bSzoecarver   }
63*481ad59bSzoecarver 
64*481ad59bSzoecarver   return true;
65*481ad59bSzoecarver }
66*481ad59bSzoecarver 
main(int,char **)67*481ad59bSzoecarver int main(int, char**) {
68*481ad59bSzoecarver   test();
69*481ad59bSzoecarver   static_assert(test());
70*481ad59bSzoecarver 
71*481ad59bSzoecarver   return 0;
72*481ad59bSzoecarver }
73