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