Skip to content

Commit d0e8d06

Browse files
committed
[libc++][spaceship] Implements X::iterator container requirements.
This implements the requirements for the container iterator requirements for array, deque, vector, and vector<bool>. Implements: - LWG3352 strong_equality isn't a thing Implements parts of: - P1614R2 The Mothership has Landed Fixes: #62486
1 parent daab6fc commit d0e8d06

File tree

16 files changed

+109
-5
lines changed

16 files changed

+109
-5
lines changed

libcxx/docs/Status/Cxx20Issues.csv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@
264264
"`3349 <https://wg21.link/LWG3349>`__","Missing ``__cpp_lib_constexpr_complex``\ for P0415R1","Prague","|Complete|","16.0"
265265
"`3350 <https://wg21.link/LWG3350>`__","Simplify return type of ``lexicographical_compare_three_way``\ ","Prague","|Complete|","17.0","|spaceship|"
266266
"`3351 <https://wg21.link/LWG3351>`__","``ranges::enable_safe_range``\ should not be constrained","Prague","|Complete|","15.0","|ranges|"
267-
"`3352 <https://wg21.link/LWG3352>`__","``strong_equality``\ isn't a thing","Prague","|Nothing To Do|","","|spaceship|"
267+
"`3352 <https://wg21.link/LWG3352>`__","``strong_equality``\ isn't a thing","Prague","|Complete|","19.0","|spaceship|"
268268
"`3354 <https://wg21.link/LWG3354>`__","``has_strong_structural_equality``\ has a meaningless definition","Prague","|Nothing To Do|","","|spaceship|"
269269
"`3355 <https://wg21.link/LWG3355>`__","The memory algorithms should support move-only input iterators introduced by P1207","Prague","|Complete|","15.0","|ranges|"
270270
"`3356 <https://wg21.link/LWG3356>`__","``__cpp_lib_nothrow_convertible``\ should be ``__cpp_lib_is_nothrow_convertible``\ ","Prague","|Complete|","12.0"

libcxx/docs/Status/SpaceshipProjects.csv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ Section,Description,Dependencies,Assignee,Complete
8383
"| `[string.view.synop] <https://wg21.link/string.view.synop>`_
8484
| `[string.view.comparison] <https://wg21.link/string.view.comparison>`_",| `basic_string_view <https://reviews.llvm.org/D130295>`_,None,Mark de Wever,|Complete|
8585
- `5.7 Clause 22: Containers library <https://wg21.link/p1614r2#clause-22-containers-library>`_,,,,
86-
| `[container.requirements.general] <https://wg21.link/container.requirements.general>`_,|,None,Unassigned,|Not Started|
86+
| `[container.requirements.general] <https://wg21.link/container.requirements.general>`_,|,None,Mark de Wever,|Complete|
8787
| `[array.syn] <https://wg21.link/array.syn>`_ (`general <https://wg21.link/container.opt.reqmts>`_),| `array <https://reviews.llvm.org/D132265>`_,[expos.only.func],"| Adrian Vogelsgesang
8888
| Hristo Hristov",|Complete|
8989
| `[deque.syn] <https://wg21.link/deque.syn>`_ (`general <https://wg21.link/container.opt.reqmts>`_),| `deque <https://reviews.llvm.org/D144821>`_,[expos.only.func],Hristo Hristov,|Complete|

libcxx/include/__bit_reference

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <__bit/countr.h>
1717
#include <__bit/invert_if.h>
1818
#include <__bit/popcount.h>
19+
#include <__compare/strong_order.h>
1920
#include <__config>
2021
#include <__fwd/bit_reference.h>
2122
#include <__iterator/iterator_traits.h>
@@ -913,6 +914,7 @@ public:
913914
return __x.__seg_ == __y.__seg_ && __x.__ctz_ == __y.__ctz_;
914915
}
915916

917+
#if _LIBCPP_STD_VER <= 17
916918
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 friend bool
917919
operator!=(const __bit_iterator& __x, const __bit_iterator& __y) {
918920
return !(__x == __y);
@@ -937,6 +939,18 @@ public:
937939
operator>=(const __bit_iterator& __x, const __bit_iterator& __y) {
938940
return !(__x < __y);
939941
}
942+
#else // _LIBCPP_STD_VER <= 17
943+
_LIBCPP_HIDE_FROM_ABI constexpr friend strong_ordering
944+
operator<=>(const __bit_iterator& __x, const __bit_iterator& __y) {
945+
if (__x.__seg_ < __y.__seg_)
946+
return strong_ordering::less;
947+
948+
if (__x.__seg_ == __y.__seg_)
949+
return __x.__ctz_ <=> __y.__ctz_;
950+
951+
return strong_ordering::greater;
952+
}
953+
#endif // _LIBCPP_STD_VER <= 17
940954

941955
private:
942956
_LIBCPP_HIDE_FROM_ABI

libcxx/include/__iterator/wrap_iter.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#ifndef _LIBCPP___ITERATOR_WRAP_ITER_H
1111
#define _LIBCPP___ITERATOR_WRAP_ITER_H
1212

13+
#include <__compare/strong_order.h>
1314
#include <__config>
1415
#include <__iterator/iterator_traits.h>
1516
#include <__memory/addressof.h>
@@ -119,6 +120,8 @@ operator==(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEX
119120
return __x.base() == __y.base();
120121
}
121122

123+
#if _LIBCPP_STD_VER <= 17
124+
122125
template <class _Iter1>
123126
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 bool
124127
operator<(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT {
@@ -179,6 +182,22 @@ operator<=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEX
179182
return !(__y < __x);
180183
}
181184

185+
#else // _LIBCPP_STD_VER <= 17
186+
187+
template <class _Iter1>
188+
_LIBCPP_HIDE_FROM_ABI constexpr strong_ordering
189+
operator<=>(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) noexcept {
190+
return __x.base() <=> __y.base();
191+
}
192+
193+
template <class _Iter1, class _Iter2>
194+
_LIBCPP_HIDE_FROM_ABI constexpr strong_ordering
195+
operator<=>(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) noexcept {
196+
return __x.base() <=> __y.base();
197+
}
198+
199+
#endif // _LIBCPP_STD_VER <= 17
200+
182201
template <class _Iter1, class _Iter2>
183202
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14
184203
#ifndef _LIBCPP_CXX03_LANG

libcxx/include/deque

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,7 @@ public:
376376
return __x.__ptr_ == __y.__ptr_;
377377
}
378378

379+
#if _LIBCPP_STD_VER <= 17
379380
_LIBCPP_HIDE_FROM_ABI friend bool operator!=(const __deque_iterator& __x, const __deque_iterator& __y) {
380381
return !(__x == __y);
381382
}
@@ -395,6 +396,17 @@ public:
395396
_LIBCPP_HIDE_FROM_ABI friend bool operator>=(const __deque_iterator& __x, const __deque_iterator& __y) {
396397
return !(__x < __y);
397398
}
399+
#else // _LIBCPP_STD_VER <= 17
400+
_LIBCPP_HIDE_FROM_ABI friend strong_ordering operator<=>(const __deque_iterator& __x, const __deque_iterator& __y) {
401+
if (__x.__m_iter_ < __y.__m_iter_)
402+
return strong_ordering::less;
403+
404+
if (__x.__m_iter_ == __y.__m_iter_)
405+
return __x.__ptr_ <=> __y.__ptr_;
406+
407+
return strong_ordering::greater;
408+
}
409+
#endif // _LIBCPP_STD_VER <= 17
398410

399411
private:
400412
_LIBCPP_HIDE_FROM_ABI explicit __deque_iterator(__map_iterator __m, pointer __p) _NOEXCEPT
@@ -2530,8 +2542,7 @@ inline _LIBCPP_HIDE_FROM_ABI bool operator<=(const deque<_Tp, _Allocator>& __x,
25302542
template <class _Tp, class _Allocator>
25312543
_LIBCPP_HIDE_FROM_ABI __synth_three_way_result<_Tp>
25322544
operator<=>(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y) {
2533-
return std::lexicographical_compare_three_way(
2534-
__x.begin(), __x.end(), __y.begin(), __y.end(), std::__synth_three_way);
2545+
return std::lexicographical_compare_three_way(__x.begin(), __x.end(), __y.begin(), __y.end(), std::__synth_three_way);
25352546
}
25362547

25372548
#endif // _LIBCPP_STD_VER <= 17

libcxx/test/libcxx/transitive_includes/cxx03.csv

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ array algorithm
4040
array compare
4141
array concepts
4242
array cstddef
43+
array cstdint
4344
array cstdlib
4445
array initializer_list
4546
array iterator
@@ -419,6 +420,7 @@ istream version
419420
iterator compare
420421
iterator concepts
421422
iterator cstddef
423+
iterator cstdint
422424
iterator cstdlib
423425
iterator exception
424426
iterator initializer_list
@@ -749,6 +751,7 @@ source_location version
749751
span array
750752
span concepts
751753
span cstddef
754+
span cstdint
752755
span functional
753756
span initializer_list
754757
span iterator

libcxx/test/libcxx/transitive_includes/cxx11.csv

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ array algorithm
4040
array compare
4141
array concepts
4242
array cstddef
43+
array cstdint
4344
array cstdlib
4445
array initializer_list
4546
array iterator
@@ -422,6 +423,7 @@ istream version
422423
iterator compare
423424
iterator concepts
424425
iterator cstddef
426+
iterator cstdint
425427
iterator cstdlib
426428
iterator exception
427429
iterator initializer_list
@@ -755,6 +757,7 @@ source_location version
755757
span array
756758
span concepts
757759
span cstddef
760+
span cstdint
758761
span functional
759762
span initializer_list
760763
span iterator

libcxx/test/libcxx/transitive_includes/cxx14.csv

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ array algorithm
4141
array compare
4242
array concepts
4343
array cstddef
44+
array cstdint
4445
array cstdlib
4546
array initializer_list
4647
array iterator
@@ -425,6 +426,7 @@ istream version
425426
iterator compare
426427
iterator concepts
427428
iterator cstddef
429+
iterator cstdint
428430
iterator cstdlib
429431
iterator exception
430432
iterator initializer_list
@@ -758,6 +760,7 @@ source_location version
758760
span array
759761
span concepts
760762
span cstddef
763+
span cstdint
761764
span functional
762765
span initializer_list
763766
span iterator

libcxx/test/libcxx/transitive_includes/cxx17.csv

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ array algorithm
4141
array compare
4242
array concepts
4343
array cstddef
44+
array cstdint
4445
array cstdlib
4546
array initializer_list
4647
array iterator
@@ -425,6 +426,7 @@ istream version
425426
iterator compare
426427
iterator concepts
427428
iterator cstddef
429+
iterator cstdint
428430
iterator cstdlib
429431
iterator exception
430432
iterator initializer_list
@@ -759,6 +761,7 @@ source_location version
759761
span array
760762
span concepts
761763
span cstddef
764+
span cstdint
762765
span functional
763766
span initializer_list
764767
span iterator

libcxx/test/libcxx/transitive_includes/cxx20.csv

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ array algorithm
4040
array compare
4141
array concepts
4242
array cstddef
43+
array cstdint
4344
array cstdlib
4445
array initializer_list
4546
array iterator
@@ -766,6 +767,7 @@ source_location version
766767
span array
767768
span concepts
768769
span cstddef
770+
span cstdint
769771
span functional
770772
span initializer_list
771773
span iterator

0 commit comments

Comments
 (0)