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*d31a2e75Szoecarverconstexpr 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*d31a2e75Szoecarverconstexpr 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*d31a2e75Szoecarverint main(int, char**) { 62*d31a2e75Szoecarver test(); 63*d31a2e75Szoecarver static_assert(test()); 64*d31a2e75Szoecarver 65*d31a2e75Szoecarver return 0; 66*d31a2e75Szoecarver } 67