diff --git a/libcxx/docs/Status/SpaceshipProjects.csv b/libcxx/docs/Status/SpaceshipProjects.csv --- a/libcxx/docs/Status/SpaceshipProjects.csv +++ b/libcxx/docs/Status/SpaceshipProjects.csv @@ -139,7 +139,7 @@ "| `[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 --- a/libcxx/include/valarray +++ b/libcxx/include/valarray @@ -116,6 +116,8 @@ 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 @@ _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 --- /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; +}