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,8 +404,24 @@ _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 + + friend bool operator==(const slice& __x, const slice& __y); + +#endif }; +#if _LIBCPP_STD_VER >= 20 + +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; class _LIBCPP_TYPE_VIS gslice; template class _LIBCPP_TEMPLATE_VIS gslice_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,56 @@ +//===----------------------------------------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +// + +// class slice; + +// friend bool operator==(const slice& x, const slice& y); + +#include +#include + +int main(int, char**) { + { + std::slice s1; + std::slice s2; + + assert(s1 == s2); + assert(s2 == s1); + } + { + std::slice s1(1, 2, 3); + std::slice s2{1, 2, 3}; + + assert(s1 == s2); + assert(s2 == s1); + } + { + std::slice s1(0, 2, 3); + std::slice s2{1, 2, 3}; + + assert(s1 != s2); + assert(s2 != s1); + } + { + std::slice s1(1, 0, 3); + std::slice s2{1, 2, 3}; + + assert(s1 != s2); + assert(s2 != s1); + } + { + std::slice s1(1, 2, 0); + std::slice s2{1, 2, 3}; + + assert(s1 != s2); + assert(s2 != s1); + } + + return 0; +}