Skip to content

Commit 0c2b48d

Browse files
committed
[libc++] Split removing iterator bases and removing the second member in reverse_iterator
1 parent 0996791 commit 0c2b48d

File tree

11 files changed

+50
-71
lines changed

11 files changed

+50
-71
lines changed

libcxx/include/__configuration/abi.h

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,10 @@
5151
# define _LIBCPP_ABI_FIX_UNORDERED_NODE_POINTER_UB
5252
# define _LIBCPP_ABI_FORWARD_LIST_REMOVE_NODE_POINTER_UB
5353
# define _LIBCPP_ABI_FIX_UNORDERED_CONTAINER_SIZE_TYPE
54-
// Give reverse_iterator<T> one data member of type T, not two.
55-
// Also, in C++17 and later, don't derive iterator types from std::iterator.
54+
// In C++17 and later, don't derive iterator types from std::iterator.
5655
# define _LIBCPP_ABI_NO_ITERATOR_BASES
56+
// Give reverse_iterator<T> one data member of type T, not two.
57+
# define _LIBCPP_ABI_NO_REVERSE_ITERATOR_SECOND_MEMBER
5758
// Use the smallest possible integer type to represent the index of the variant.
5859
// Previously libc++ used "unsigned int" exclusively.
5960
# define _LIBCPP_ABI_VARIANT_INDEX_TYPE_OPTIMIZATION
@@ -135,6 +136,14 @@
135136
# endif
136137
#endif
137138

139+
#if defined(_LIBCPP_ABI_NO_ITERATOR_BASES) && !defined(_LIBCPP_ABI_NO_REVERSE_ITERATOR_SECOND_MEMBER)
140+
# ifndef _LIBCPP_ONLY_NO_ITERATOR_BASES
141+
# error "You probably want to define _LIBCPP_ABI_NO_REVERSE_ITERATOR_SECOND_MEMBER. This has been split out from" \
142+
" _LIBCPP_ABI_NO_ITERATOR_BASES to allow only removing the second iterator member, since they aren't really related." \
143+
"If you actually want this ABI configuration, please define _LIBCPP_ONLY_NO_ITERATOR_BASES instead."
144+
# endif
145+
#endif
146+
138147
// We had some bugs where we use [[no_unique_address]] together with construct_at,
139148
// which causes UB as the call on construct_at could write to overlapping subobjects
140149
//

libcxx/include/__iterator/back_insert_iterator.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,9 @@ _LIBCPP_PUSH_MACROS
2626

2727
_LIBCPP_BEGIN_NAMESPACE_STD
2828

29-
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
3029
template <class _Container>
3130
class back_insert_iterator
32-
#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES)
33-
: public iterator<output_iterator_tag, void, void, void, void>
34-
#endif
35-
{
36-
_LIBCPP_SUPPRESS_DEPRECATED_POP
37-
31+
: public __iterator_base<back_insert_iterator<_Container>, output_iterator_tag, void, void, void, void> {
3832
protected:
3933
_Container* container;
4034

libcxx/include/__iterator/front_insert_iterator.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,9 @@ _LIBCPP_PUSH_MACROS
2626

2727
_LIBCPP_BEGIN_NAMESPACE_STD
2828

29-
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
3029
template <class _Container>
3130
class front_insert_iterator
32-
#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES)
33-
: public iterator<output_iterator_tag, void, void, void, void>
34-
#endif
35-
{
36-
_LIBCPP_SUPPRESS_DEPRECATED_POP
37-
31+
: public __iterator_base<front_insert_iterator<_Container>, output_iterator_tag, void, void, void, void> {
3832
protected:
3933
_Container* container;
4034

libcxx/include/__iterator/insert_iterator.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,9 @@ template <class _Container>
3535
using __insert_iterator_iter_t _LIBCPP_NODEBUG = typename _Container::iterator;
3636
#endif
3737

38-
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
3938
template <class _Container>
4039
class insert_iterator
41-
#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES)
42-
: public iterator<output_iterator_tag, void, void, void, void>
43-
#endif
44-
{
45-
_LIBCPP_SUPPRESS_DEPRECATED_POP
46-
40+
: public __iterator_base<insert_iterator<_Container>, output_iterator_tag, void, void, void, void> {
4741
protected:
4842
_Container* container;
4943
__insert_iterator_iter_t<_Container> iter;

libcxx/include/__iterator/istream_iterator.h

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,14 @@
2525

2626
_LIBCPP_BEGIN_NAMESPACE_STD
2727

28-
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
2928
template <class _Tp, class _CharT = char, class _Traits = char_traits<_CharT>, class _Distance = ptrdiff_t>
3029
class istream_iterator
31-
#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES)
32-
: public iterator<input_iterator_tag, _Tp, _Distance, const _Tp*, const _Tp&>
33-
#endif
34-
{
35-
_LIBCPP_SUPPRESS_DEPRECATED_POP
36-
30+
: public __iterator_base<istream_iterator<_Tp, _CharT, _Traits, _Distance>,
31+
input_iterator_tag,
32+
_Tp,
33+
_Distance,
34+
const _Tp*,
35+
const _Tp&> {
3736
public:
3837
typedef input_iterator_tag iterator_category;
3938
typedef _Tp value_type;

libcxx/include/__iterator/istreambuf_iterator.h

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,14 @@
2525

2626
_LIBCPP_BEGIN_NAMESPACE_STD
2727

28-
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
2928
template <class _CharT, class _Traits>
3029
class istreambuf_iterator
31-
#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES)
32-
: public iterator<input_iterator_tag, _CharT, typename _Traits::off_type, _CharT*, _CharT>
33-
#endif
34-
{
35-
_LIBCPP_SUPPRESS_DEPRECATED_POP
36-
30+
: public __iterator_base<istreambuf_iterator<_CharT, _Traits>,
31+
input_iterator_tag,
32+
_CharT,
33+
typename _Traits::off_type,
34+
_CharT*,
35+
_CharT> {
3736
public:
3837
typedef input_iterator_tag iterator_category;
3938
typedef _CharT value_type;

libcxx/include/__iterator/iterator.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,19 @@ struct _LIBCPP_DEPRECATED_IN_CXX17 iterator {
2828
typedef _Category iterator_category;
2929
};
3030

31+
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
32+
#ifdef _LIBCPP_ABI_NO_ITERATOR_BASES
33+
template <class _Derived>
34+
struct __no_iterator_base {};
35+
36+
template <class _Derived, class _Category, class _Tp, class _Distance, class _Pointer, class _Reference>
37+
using __iterator_base _LIBCPP_NODEBUG = __no_iterator_base<_Derived>;
38+
#else
39+
template <class _Derived, class _Category, class _Tp, class _Distance, class _Pointer, class _Reference>
40+
using __iterator_base _LIBCPP_NODEBUG = iterator<_Category, _Tp, _Distance, _Pointer, _Reference>;
41+
#endif
42+
_LIBCPP_SUPPRESS_DEPRECATED_POP
43+
3144
_LIBCPP_END_NAMESPACE_STD
3245

3346
#endif // _LIBCPP___ITERATOR_ITERATOR_H

libcxx/include/__iterator/ostream_iterator.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,9 @@
2424

2525
_LIBCPP_BEGIN_NAMESPACE_STD
2626

27-
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
2827
template <class _Tp, class _CharT = char, class _Traits = char_traits<_CharT> >
2928
class ostream_iterator
30-
#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES)
31-
: public iterator<output_iterator_tag, void, void, void, void>
32-
#endif
33-
{
34-
_LIBCPP_SUPPRESS_DEPRECATED_POP
35-
29+
: public __iterator_base<ostream_iterator<_Tp, _CharT, _Traits>, output_iterator_tag, void, void, void, void> {
3630
public:
3731
typedef output_iterator_tag iterator_category;
3832
typedef void value_type;

libcxx/include/__iterator/ostreambuf_iterator.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,9 @@
2525

2626
_LIBCPP_BEGIN_NAMESPACE_STD
2727

28-
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
2928
template <class _CharT, class _Traits>
3029
class ostreambuf_iterator
31-
#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES)
32-
: public iterator<output_iterator_tag, void, void, void, void>
33-
#endif
34-
{
35-
_LIBCPP_SUPPRESS_DEPRECATED_POP
36-
30+
: public __iterator_base<ostreambuf_iterator<_CharT, _Traits>, output_iterator_tag, void, void, void, void> {
3731
public:
3832
typedef output_iterator_tag iterator_category;
3933
typedef void value_type;

libcxx/include/__iterator/reverse_iterator.h

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -46,21 +46,16 @@
4646

4747
_LIBCPP_BEGIN_NAMESPACE_STD
4848

49-
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
5049
template <class _Iter>
5150
class reverse_iterator
52-
#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES)
53-
: public iterator<typename iterator_traits<_Iter>::iterator_category,
54-
typename iterator_traits<_Iter>::value_type,
55-
typename iterator_traits<_Iter>::difference_type,
56-
typename iterator_traits<_Iter>::pointer,
57-
typename iterator_traits<_Iter>::reference>
58-
#endif
59-
{
60-
_LIBCPP_SUPPRESS_DEPRECATED_POP
61-
51+
: public __iterator_base<reverse_iterator<_Iter>,
52+
typename iterator_traits<_Iter>::iterator_category,
53+
typename iterator_traits<_Iter>::value_type,
54+
typename iterator_traits<_Iter>::difference_type,
55+
typename iterator_traits<_Iter>::pointer,
56+
typename iterator_traits<_Iter>::reference> {
6257
private:
63-
#ifndef _LIBCPP_ABI_NO_ITERATOR_BASES
58+
#ifndef _LIBCPP_ABI_NO_REVERSE_ITERATOR_SECOND_MEMBER
6459
_Iter __t_; // no longer used as of LWG #2360, not removed due to ABI break
6560
#endif
6661

@@ -91,7 +86,7 @@ class reverse_iterator
9186
using reference = typename iterator_traits<_Iter>::reference;
9287
#endif
9388

94-
#ifndef _LIBCPP_ABI_NO_ITERATOR_BASES
89+
#ifndef _LIBCPP_ABI_NO_REVERSE_ITERATOR_SECOND_MEMBER
9590
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reverse_iterator() : __t_(), current() {}
9691

9792
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 explicit reverse_iterator(_Iter __x) : __t_(__x), current(__x) {}

0 commit comments

Comments
 (0)