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 @@ -44,7 +44,7 @@ | `multimap `_",[expos.only.func],Hristo Hristov,|Complete| | `[associative.set.syn] `_ (`general `_),"| multiset | set",[expos.only.func],Hristo Hristov,|In Progress| -| `[queue.ops] `_,| `queue `_,None,Hristo Hristov,|In Progress| +| `[queue.ops] `_,| `queue `_,None,Hristo Hristov,|Complete| | `[stack.ops] `_,| `stack `_,None,Hristo Hristov,|In Progress| | `[reverse.iter.cmp] `_,| `reverse_iterator `_,None,Mikhail Maltsev,|Complete| | `[move.iter.op.comp] `_,| `move_iterator `_,None,Arthur O'Dwyer,|Complete| diff --git a/libcxx/include/queue b/libcxx/include/queue --- a/libcxx/include/queue +++ b/libcxx/include/queue @@ -104,6 +104,10 @@ template bool operator<=(const queue& x,const queue& y); +template + compare_three_way_result_t + operator<=>(const queue& x, const queue& y); // since C++20 + template void swap(queue& x, queue& y) noexcept(noexcept(x.swap(y))); @@ -394,6 +398,30 @@ _LIBCPP_INLINE_VISIBILITY bool operator< (const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y); + +#if _LIBCPP_STD_VER >= 20 + + template + friend _LIBCPP_HIDE_FROM_ABI bool + operator!=(const queue<_T1, _C1>& __x, const queue<_T1, _C1>& __y); + + template + friend _LIBCPP_HIDE_FROM_ABI bool + operator>(const queue<_T1, _C1>& __x, const queue<_T1, _C1>& __y); + + template + friend _LIBCPP_HIDE_FROM_ABI bool + operator>=(const queue<_T1, _C1>& __x, const queue<_T1, _C1>& __y); + + template + friend _LIBCPP_HIDE_FROM_ABI bool + operator<=(const queue<_T1, _C1>& __x, const queue<_T1, _C1>& __y); + + template + friend _LIBCPP_HIDE_FROM_ABI compare_three_way_result_t<_C1> + operator<=>(const queue<_T1, _C1>& __x, const queue<_T1, _C1>& __y); + +#endif }; #if _LIBCPP_STD_VER >= 17 @@ -474,6 +502,16 @@ return !(__y < __x); } +#if _LIBCPP_STD_VER >= 20 + +template +inline _LIBCPP_HIDE_FROM_ABI compare_three_way_result_t<_Container> +operator<=>(const queue<_Tp, _Container>& __x, const queue<_Tp, _Container>& __y) { + return __x.c <=> __y.c; +} + +#endif + template inline _LIBCPP_INLINE_VISIBILITY __enable_if_t<__is_swappable<_Container>::value, void> diff --git a/libcxx/test/std/containers/container.adaptors/queue/compare.three_way.pass.cpp b/libcxx/test/std/containers/container.adaptors/queue/compare.three_way.pass.cpp new file mode 100644 --- /dev/null +++ b/libcxx/test/std/containers/container.adaptors/queue/compare.three_way.pass.cpp @@ -0,0 +1,28 @@ +//===----------------------------------------------------------------------===// +// +// 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 queue& x, const queue& y); + +#include +#include +#include +#include + +#include "test_container_comparisons.h" + +int main(int, char**) { + assert((test_sequence_container_adaptor_spaceship())); + assert((test_sequence_container_adaptor_spaceship())); + // `std::queue` is not constexpr, so no `static_assert` test here. + return 0; +} diff --git a/libcxx/test/support/test_container_comparisons.h b/libcxx/test/support/test_container_comparisons.h --- a/libcxx/test/support/test_container_comparisons.h +++ b/libcxx/test/support/test_container_comparisons.h @@ -205,4 +205,91 @@ return true; } +// Implementation detail of `test_sequence_container_adaptor_spaceship` +template