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