From 2ff646f554bc9ee8fe2ab7df9e09e0259033c23b Mon Sep 17 00:00:00 2001 From: Hristo Hristov Date: Fri, 3 Mar 2023 13:35:07 +0100 Subject: [PATCH] [libc++][spaceship] Implement `operator<=>` for `deque` Based on https://reviews.llvm.org/D132312 Dependes on https://reviews.llvm.org/D132312 Reviewed By: #libc, Mordante, philnik Spies: philnik, Mordante, yaxunl, libcxx-commits Differential Revision: https://reviews.llvm.org/D144821 --- libcxx/docs/Status/SpaceshipProjects.csv | 2 +- libcxx/include/deque | 29 +++++++++++++++---- .../deque/compare.three_way.pass.cpp | 25 ++++++++++++++++ 3 files changed, 50 insertions(+), 6 deletions(-) create mode 100644 libcxx/test/libcxx/containers/sequences/deque/compare.three_way.pass.cpp diff --git a/libcxx/docs/Status/SpaceshipProjects.csv b/libcxx/docs/Status/SpaceshipProjects.csv index 8baba5ebc9ea..b2c8b3d63797 100644 --- a/libcxx/docs/Status/SpaceshipProjects.csv +++ b/libcxx/docs/Status/SpaceshipProjects.csv @@ -36,7 +36,7 @@ Section,Description,Dependencies,Assignee,Complete | `[string.cmp] `_,| `basic_string `_,None,Mark de Wever,|Complete| | `[string.view.comparison] `_,| `basic_string_view `_,None,Mark de Wever,|Complete| | `[array.syn] `_ (`general `_),| `array `_,[expos.only.func],Adrian Vogelsgesang,|In Progress| -| `[deque.syn] `_ (`general `_),| deque,[expos.only.func],Unassigned,|Not Started| +| `[deque.syn] `_ (`general `_),| deque ,[expos.only.func],Hristo Hristov,|Complete| | `[forward.list.syn] `_ (`general `_),| forward_list,[expos.only.func],Unassigned,|Not Started| | `[list.syn] `_ (`general `_),| `list `_,[expos.only.func],Adrian Vogelsgesang,|Complete| | `[vector.syn] `_ (`general `_),| `vector `_,[expos.only.func],Adrian Vogelsgesang,|In Progress| diff --git a/libcxx/include/deque b/libcxx/include/deque index 2dbbe81f3f07..ed03f37cedab 100644 --- a/libcxx/include/deque +++ b/libcxx/include/deque @@ -134,15 +134,18 @@ template bool operator==(const deque& x, const deque& y); template - bool operator< (const deque& x, const deque& y); + bool operator< (const deque& x, const deque& y); // removed in C++20 template - bool operator!=(const deque& x, const deque& y); + bool operator!=(const deque& x, const deque& y); // removed in C++20 template - bool operator> (const deque& x, const deque& y); + bool operator> (const deque& x, const deque& y); // removed in C++20 template - bool operator>=(const deque& x, const deque& y); + bool operator>=(const deque& x, const deque& y); // removed in C++20 template - bool operator<=(const deque& x, const deque& y); + bool operator<=(const deque& x, const deque& y); // removed in C++20 +template + synth-three-way-result operator<=>(const deque& x, + const deque& y); // since C++20 // specialized algorithms: template @@ -165,6 +168,7 @@ template #include <__algorithm/equal.h> #include <__algorithm/fill_n.h> #include <__algorithm/lexicographical_compare.h> +#include <__algorithm/lexicographical_compare_three_way.h> #include <__algorithm/min.h> #include <__algorithm/remove.h> #include <__algorithm/remove_if.h> @@ -2342,6 +2346,8 @@ operator==(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y) return __sz == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin()); } +#if _LIBCPP_STD_VER <= 17 + template inline _LIBCPP_HIDE_FROM_ABI bool @@ -2382,6 +2388,19 @@ operator<=(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y) return !(__y < __x); } +#else // _LIBCPP_STD_VER <= 17 + +template +inline _LIBCPP_HIDE_FROM_ABI +__synth_three_way_result<_Tp> +operator<=>(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y) +{ + return std::lexicographical_compare_three_way( + __x.begin(), __x.end(), __y.begin(), __y.end(), __synth_three_way); +} + +#endif // _LIBCPP_STD_VER <= 17 + template inline _LIBCPP_HIDE_FROM_ABI void diff --git a/libcxx/test/libcxx/containers/sequences/deque/compare.three_way.pass.cpp b/libcxx/test/libcxx/containers/sequences/deque/compare.three_way.pass.cpp new file mode 100644 index 000000000000..92355755dadf --- /dev/null +++ b/libcxx/test/libcxx/containers/sequences/deque/compare.three_way.pass.cpp @@ -0,0 +1,25 @@ +//===----------------------------------------------------------------------===// +// +// 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 +// synth-three-way-result operator<=>(const deque& x, +// const deque& y); + +#include +#include + +#include "test_container_comparisons.h" + +int main(int, char**) { + assert(test_ordered_container_spaceship()); + // `std::deque` is not constexpr, so no `static_assert` test here. + return 0; +}