From 8ba9ed682552261d089ceb4bc9895d5f9fd0c888 Mon Sep 17 00:00:00 2001 From: Hristo Hristov Date: Tue, 16 Jul 2024 18:13:05 +0300 Subject: [PATCH] [libc++][ranges] LWG4035: `single_view` should provide `empty` (#98371) Implements: https://wg21.link/LWG4035 - https://eel.is/c++draft/range.single.view --- libcxx/docs/Status/Cxx2cIssues.csv | 2 +- libcxx/include/__ranges/single_view.h | 2 + .../range.single.view/empty.pass.cpp | 64 +++++++++++++++++++ 3 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 libcxx/test/std/ranges/range.factories/range.single.view/empty.pass.cpp diff --git a/libcxx/docs/Status/Cxx2cIssues.csv b/libcxx/docs/Status/Cxx2cIssues.csv index 540c6a8dd4f477..f9a70aee1bf46a 100644 --- a/libcxx/docs/Status/Cxx2cIssues.csv +++ b/libcxx/docs/Status/Cxx2cIssues.csv @@ -53,7 +53,7 @@ "`4025 `__","Move assignment operator of ``std::expected`` should not be conditionally deleted","Tokyo March 2024","","","" "`4030 `__","Clarify whether arithmetic expressions in ``[numeric.sat.func]`` are mathematical or C++","Tokyo March 2024","|Nothing To Do|","","" "`4031 `__","``bad_expected_access`` member functions should be ``noexcept``","Tokyo March 2024","|Complete|","16.0","" -"`4035 `__","``single_view`` should provide ``empty``","Tokyo March 2024","","","|ranges|" +"`4035 `__","``single_view`` should provide ``empty``","Tokyo March 2024","|Complete|","19.0","|ranges|" "`4036 `__","``__alignof_is_defined`` is only implicitly specified in C++ and not yet deprecated","Tokyo March 2024","","","" "`4037 `__","Static data members of ``ctype_base`` are not yet required to be usable in constant expressions","Tokyo March 2024","","","" "`4038 `__","``std::text_encoding::aliases_view`` should have constexpr iterators","Tokyo March 2024","","","" diff --git a/libcxx/include/__ranges/single_view.h b/libcxx/include/__ranges/single_view.h index f91c7c35263676..45244f34994d74 100644 --- a/libcxx/include/__ranges/single_view.h +++ b/libcxx/include/__ranges/single_view.h @@ -70,6 +70,8 @@ class _LIBCPP_ABI_LLVM18_NO_UNIQUE_ADDRESS single_view : public view_interface(); } diff --git a/libcxx/test/std/ranges/range.factories/range.single.view/empty.pass.cpp b/libcxx/test/std/ranges/range.factories/range.single.view/empty.pass.cpp new file mode 100644 index 00000000000000..7e6ff015ea9a41 --- /dev/null +++ b/libcxx/test/std/ranges/range.factories/range.single.view/empty.pass.cpp @@ -0,0 +1,64 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17 + +// static constexpr bool empty() noexcept; + +#include +#include +#include +#include + +#include "test_macros.h" + +struct Empty {}; +struct BigType { + char buffer[64] = {10}; +}; + +template +constexpr void test_empty(T value) { + using SingleView = std::ranges::single_view; + + { + std::same_as decltype(auto) result = SingleView::empty(); + assert(result == false); + static_assert(noexcept(SingleView::empty())); + } + + { + SingleView sv{value}; + + std::same_as decltype(auto) result = std::ranges::empty(sv); + assert(result == false); + static_assert(noexcept(std::ranges::empty(sv))); + } + { + const SingleView sv{value}; + + std::same_as decltype(auto) result = std::ranges::empty(sv); + assert(result == false); + static_assert(noexcept(std::ranges::empty(std::as_const(sv)))); + } +} + +constexpr bool test() { + test_empty(92); + test_empty(Empty{}); + test_empty(BigType{}); + + return true; +} + +int main(int, char**) { + test(); + static_assert(test()); + + return 0; +}