From f877e88c354eacba1db81b82270ff8c27f000ea6 Mon Sep 17 00:00:00 2001 From: Hristo Hristov Date: Sat, 10 Jun 2023 13:58:56 +0300 Subject: [PATCH] [libc++][spaceship] P1614R2: Added `operator==` to `slice` Implements parts of P1614R2: - Added `operator==` to `slice` Reviewed By: #libc, Mordante Differential Revision: https://reviews.llvm.org/D152617 --- libcxx/docs/Status/SpaceshipProjects.csv | 2 +- libcxx/include/valarray | 10 ++++ .../class.slice/slice.ops/slice.ops.pass.cpp | 65 ++++++++++++++++++++++ 3 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 libcxx/test/std/numerics/numarray/class.slice/slice.ops/slice.ops.pass.cpp diff --git a/libcxx/docs/Status/SpaceshipProjects.csv b/libcxx/docs/Status/SpaceshipProjects.csv index 97c7d4e..214ab8b 100644 --- a/libcxx/docs/Status/SpaceshipProjects.csv +++ b/libcxx/docs/Status/SpaceshipProjects.csv @@ -139,7 +139,7 @@ Section,Description,Dependencies,Assignee,Complete "| `[complex.syn] `_ | `[complex.ops] `_",| remove ops `complex `_,None,Hristo Hristov,|In Progress| "| `[class.slice.overview] `_ -| `[slice.ops] `_",| `slice `_,None,Hristo Hristov,|In Progress| +| `[slice.ops] `_",| `slice `_,None,Hristo Hristov,|Complete| - `5.12 Clause 27: Time library `_,,,, | `[time.syn] `_,|,None,Unassigned,|Not Started| | `[time.duration.comparisons] `_, `chrono::duration `_, None, Hristo Hristov, |Complete| diff --git a/libcxx/include/valarray b/libcxx/include/valarray index 001e111..df55e95 100644 --- a/libcxx/include/valarray +++ b/libcxx/include/valarray @@ -116,6 +116,8 @@ public: size_t start() const; size_t size() const; size_t stride() const; + + friend bool operator==(const slice& x, const slice& y); // since C++20 }; template @@ -402,6 +404,14 @@ public: _LIBCPP_INLINE_VISIBILITY size_t start() const {return __start_;} _LIBCPP_INLINE_VISIBILITY size_t size() const {return __size_;} _LIBCPP_INLINE_VISIBILITY size_t stride() const {return __stride_;} + +#if _LIBCPP_STD_VER >= 20 + + _LIBCPP_HIDE_FROM_ABI friend bool operator==(const slice& __x, const slice& __y) { + return __x.start() == __y.start() && __x.size() == __y.size() && __x.stride() == __y.stride(); + } + +#endif }; template class _LIBCPP_TEMPLATE_VIS slice_array; diff --git a/libcxx/test/std/numerics/numarray/class.slice/slice.ops/slice.ops.pass.cpp b/libcxx/test/std/numerics/numarray/class.slice/slice.ops/slice.ops.pass.cpp new file mode 100644 index 0000000..37aa426 --- /dev/null +++ b/libcxx/test/std/numerics/numarray/class.slice/slice.ops/slice.ops.pass.cpp @@ -0,0 +1,65 @@ +//===----------------------------------------------------------------------===// +// +// 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 + +// + +// class slice; + +// friend bool operator==(const slice& x, const slice& y); + +#include +#include + +#include "test_comparisons.h" + +void test() { + { + std::slice s1; + std::slice s2; + + assert(testEquality(s1, s2, true)); + } + { + std::slice s1{1, 2, 3}; + std::slice s2{1, 2, 3}; + + assert(testEquality(s1, s2, true)); + } + { + std::slice s1; + std::slice s2{1, 2, 3}; + + assert(testEquality(s1, s2, false)); + } + { + std::slice s1{0, 2, 3}; + std::slice s2{1, 2, 3}; + + assert(testEquality(s1, s2, false)); + } + { + std::slice s1{1, 0, 3}; + std::slice s2{1, 2, 3}; + + assert(testEquality(s1, s2, false)); + } + { + std::slice s1{1, 2, 0}; + std::slice s2{1, 2, 3}; + + assert(testEquality(s1, s2, false)); + } +} + +int main(int, char**) { + test(); + + return 0; +} -- 2.7.4