118 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++03, c++11, c++14, c++1710 11// constexpr bool empty() const;12 13#include <cassert>14#include <concepts>15#include <ranges>16#include <utility>17#include <vector>18 19#include "types.h"20 21template <typename R>22concept HasEmpty = requires(const R r) {23 std::ranges::empty(r);24 { r.empty() } -> std::same_as<bool>;25};26 27constexpr void test_empty_iota_sfinae() {28 std::vector<int> ev;29 30 auto iv = std::views::iota(std::ranges::begin(ev), std::ranges::end(ev));31 32 static_assert(HasEmpty<decltype(iv)>);33 static_assert(HasEmpty<decltype(std::as_const(iv))>);34}35 36constexpr void test_nonempty_iota_sfinae() {37 // Default ctr38 {39 std::ranges::iota_view<Int42<DefaultTo42>> iv;40 41 static_assert(HasEmpty<decltype(iv)>);42 }43 // Value pass44 {45 std::ranges::iota_view<SomeInt> iv(SomeInt(94));46 47 static_assert(HasEmpty<decltype(iv)>);48 }49 50 {51 std::vector<char> v;52 auto it = std::back_inserter(v);53 auto iv = std::views::iota(it);54 55 static_assert(HasEmpty<decltype(iv)>);56 }57 {58 std::vector<char> v{'b', 'a', 'b', 'a', 'z', 'm', 't'};59 auto it = std::back_inserter(v);60 auto iv = std::views::iota(it);61 62 static_assert(HasEmpty<decltype(iv)>);63 }64}65 66constexpr void test_empty_iota() {67 std::vector<int> ev;68 69 auto iv = std::views::iota(std::ranges::begin(ev), std::ranges::end(ev));70 71 assert(iv.empty());72 assert(std::as_const(iv).empty());73}74 75constexpr void test_nonempty_iota() {76 // Default ctr77 {78 std::ranges::iota_view<Int42<DefaultTo42>> iv;79 80 assert(!iv.empty());81 }82 // Value pass83 {84 std::ranges::iota_view<SomeInt> iv(SomeInt(94));85 86 assert(!iv.empty());87 }88 89 {90 std::vector<char> v;91 auto it = std::back_inserter(v);92 auto iv = std::views::iota(it);93 94 assert(!iv.empty());95 }96 {97 std::vector<char> v{'b', 'a', 'b', 'a', 'z', 'm', 't'};98 auto it = std::back_inserter(v);99 auto iv = std::views::iota(it);100 101 assert(!iv.empty());102 }103}104 105constexpr bool test() {106 test_empty_iota();107 test_nonempty_iota();108 109 return true;110}111 112int main(int, char**) {113 test();114 static_assert(test());115 116 return 0;117}118