From ca7a041626cdd79f9d7e9f8361676a46c4a3bba9 Mon Sep 17 00:00:00 2001 From: Hristo Hristov Date: Tue, 14 Mar 2023 21:18:55 +0200 Subject: [PATCH] [libc++][spaceship] Implement `operator<=>` for `stack` Depends on D146066 Depends on D132268 Implements parts of P1614R2 `operator<=>` for `stack` Reviewed By: #libc, Mordante Differential Revision: https://reviews.llvm.org/D146094 --- libcxx/docs/Status/SpaceshipProjects.csv | 2 +- libcxx/include/stack | 14 +++++++++ .../stack/compare.three_way.pass.cpp | 33 ++++++++++++++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 libcxx/test/std/containers/container.adaptors/stack/compare.three_way.pass.cpp diff --git a/libcxx/docs/Status/SpaceshipProjects.csv b/libcxx/docs/Status/SpaceshipProjects.csv index d118db0..d89acad 100644 --- a/libcxx/docs/Status/SpaceshipProjects.csv +++ b/libcxx/docs/Status/SpaceshipProjects.csv @@ -47,7 +47,7 @@ Section,Description,Dependencies,Assignee,Complete | `[associative.set.syn] `_ (`general `_),"| multiset | set",[expos.only.func],Hristo Hristov,|In Progress| | `[queue.ops] `_,| `queue `_,None,Hristo Hristov,|Complete| -| `[stack.ops] `_,| `stack `_,None,Hristo Hristov,|In Progress| +| `[stack.ops] `_,| `stack `_,None,Hristo Hristov,|Complete| | `[reverse.iter.cmp] `_,| `reverse_iterator `_,None,Mikhail Maltsev,|Complete| | `[move.iter.op.comp] `_,| `move_iterator `_,None,Arthur O'Dwyer,|Complete| | `[counted.iter.cmp] `_,| `counted_iterator `_,None,Zoe Carver,|Complete| diff --git a/libcxx/include/stack b/libcxx/include/stack index d49aacb..c25642f 100644 --- a/libcxx/include/stack +++ b/libcxx/include/stack @@ -101,6 +101,9 @@ template bool operator>=(const stack& x, const stack& y); template bool operator<=(const stack& x, const stack& y); +template + compare_three_way_result_t + operator<=>(const stack& x, const stack& y); // since C++20 template void swap(stack& x, stack& y) @@ -400,6 +403,17 @@ operator<=(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y) return !(__y < __x); } +#if _LIBCPP_STD_VER >= 20 + +template +_LIBCPP_HIDE_FROM_ABI compare_three_way_result_t<_Container> +operator<=>(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y) { + // clang 16 bug: declaring `friend operator<=>` causes "use of overloaded operator '*' is ambiguous" errors + return __x.__get_container() <=> __y.__get_container(); +} + +#endif + template inline _LIBCPP_INLINE_VISIBILITY __enable_if_t<__is_swappable<_Container>::value, void> diff --git a/libcxx/test/std/containers/container.adaptors/stack/compare.three_way.pass.cpp b/libcxx/test/std/containers/container.adaptors/stack/compare.three_way.pass.cpp new file mode 100644 index 0000000..1889b7c --- /dev/null +++ b/libcxx/test/std/containers/container.adaptors/stack/compare.three_way.pass.cpp @@ -0,0 +1,33 @@ +//===----------------------------------------------------------------------===// +// +// 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 + +// + +// template +// compare_three_way_result_t +// operator<=>(const stack& x, const stack& y); + +#include +#include +#include +#include +#include + +#include "nasty_containers.h" +#include "test_container_comparisons.h" + +int main(int, char**) { + assert((test_sequence_container_adaptor_spaceship())); + assert((test_sequence_container_adaptor_spaceship())); + assert((test_sequence_container_adaptor_spaceship())); + assert((test_sequence_container_adaptor_spaceship())); + assert((test_sequence_container_adaptor_spaceship())); + // `std::stack` is not constexpr, so no `static_assert` test here. + return 0; +} -- 2.7.4