Skip to content

Commit a19d370

Browse files
authored
[libc++] P2944R3: Constrained comparisions - tuple (#145677)
Implements P2944R3 partially, which adds constrained comparisons `std::tuple`. The missing overloads introduced in [P2165R4](https://wg21.link/P2165R4) are not implemented. Uses [`__all`](https://github.com/llvm/llvm-project/blob/f7af33a9eb5b3876f219075023dc9c565d75849b/libcxx/include/__type_traits/conjunction.h#L45) instead of a fold expression, see comment: #141396 (comment) Relates to #136765 # References [tuple.rel](https://wg21.link//tuple.rel)
1 parent a3fcfac commit a19d370

File tree

4 files changed

+33
-3
lines changed

4 files changed

+33
-3
lines changed

libcxx/docs/Status/Cxx2cPapers.csv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959
"`P2248R8 <https://wg21.link/P2248R8>`__","Enabling list-initialization for algorithms","2024-03 (Tokyo)","","",""
6060
"`P2810R4 <https://wg21.link/P2810R4>`__","``is_debugger_present`` ``is_replaceable``","2024-03 (Tokyo)","","",""
6161
"`P1068R11 <https://wg21.link/P1068R11>`__","Vector API for random number generation","2024-03 (Tokyo)","","",""
62-
"`P2944R3 <https://wg21.link/P2944R3>`__","Comparisons for ``reference_wrapper``","2024-03 (Tokyo)","|Partial|","","The changes to ``optional`` and ``tuple`` are not yet implemented"
62+
"`P2944R3 <https://wg21.link/P2944R3>`__","Comparisons for ``reference_wrapper``","2024-03 (Tokyo)","|Partial|","","The changes to ``optional`` and ``tuple``'s equality overload from P2165R4 are not yet implemented"
6363
"`P2642R6 <https://wg21.link/P2642R6>`__","Padded ``mdspan`` layouts","2024-03 (Tokyo)","","",""
6464
"`P3029R1 <https://wg21.link/P3029R1>`__","Better ``mdspan``'s CTAD","2024-03 (Tokyo)","|Complete|","19",""
6565
"","","","","",""

libcxx/include/tuple

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@ template <class... Types>
216216
# include <__compare/common_comparison_category.h>
217217
# include <__compare/ordering.h>
218218
# include <__compare/synth_three_way.h>
219+
# include <__concepts/boolean_testable.h>
219220
# include <__config>
220221
# include <__cstddef/size_t.h>
221222
# include <__fwd/array.h>
@@ -1153,6 +1154,11 @@ struct __tuple_equal<0> {
11531154
};
11541155

11551156
template <class... _Tp, class... _Up>
1157+
# if _LIBCPP_STD_VER >= 26
1158+
requires(__all<requires(const _Tp& __t, const _Up& __u) {
1159+
{ __t == __u } -> __boolean_testable;
1160+
}...>::value && (sizeof...(_Tp) == sizeof...(_Up)))
1161+
# endif
11561162
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 bool
11571163
operator==(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) {
11581164
static_assert(sizeof...(_Tp) == sizeof...(_Up), "Can't compare tuples of different sizes");

libcxx/test/std/utilities/tuple/tuple.tuple/tuple.rel/eq.pass.cpp

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,33 @@
1616

1717
// UNSUPPORTED: c++03
1818

19-
#include <tuple>
20-
#include <string>
19+
#include <array>
2120
#include <cassert>
21+
#include <tuple>
2222

23+
#include "test_comparisons.h"
2324
#include "test_macros.h"
2425

26+
#if TEST_STD_VER >= 26
27+
28+
// Test SFINAE.
29+
30+
static_assert(std::equality_comparable<std::tuple<EqualityComparable>>);
31+
static_assert(std::equality_comparable<std::tuple<EqualityComparable, EqualityComparable>>);
32+
33+
static_assert(!std::equality_comparable<std::tuple<NonComparable>>);
34+
static_assert(!std::equality_comparable<std::tuple<EqualityComparable, NonComparable>>);
35+
static_assert(!std::equality_comparable<std::tuple<NonComparable, EqualityComparable>>);
36+
static_assert(!std::equality_comparable_with<std::tuple<EqualityComparable>, std::tuple<NonComparable>>);
37+
static_assert(!std::equality_comparable_with<std::tuple<NonComparable>, std::tuple<EqualityComparable>>);
38+
// Size mismatch.
39+
static_assert(
40+
!std::equality_comparable_with<std::tuple<EqualityComparable>, std::tuple<EqualityComparable, EqualityComparable>>);
41+
static_assert(
42+
!std::equality_comparable_with<std::tuple<EqualityComparable, EqualityComparable>, std::tuple<EqualityComparable>>);
43+
44+
#endif
45+
2546
int main(int, char**)
2647
{
2748
{

libcxx/test/std/utilities/tuple/tuple.tuple/tuple.rel/size_incompatible_comparison.verify.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
//
77
//===----------------------------------------------------------------------===//
88

9+
// Disabled in C++26 and later because tuple comparison between different sizes is constrained since P2944R3.
10+
// UNSUPPORTED: std-at-least-cxx26
11+
912
// <tuple>
1013

1114
// template <class... Types> class tuple;

0 commit comments

Comments
 (0)