Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
665cc4d
Implement LWG-3870
frederick-vs-ja Feb 17, 2023
facff8a
Fix `_Default_allocator_traits::construct`
frederick-vs-ja Feb 17, 2023
0b6efe9
Restore some needed cv-removing cases
frederick-vs-ja Feb 17, 2023
a2e06f7
Skip libcxx tests
frederick-vs-ja Feb 17, 2023
e5df38f
Remove invalidated test coverage
frederick-vs-ja Feb 17, 2023
888f57d
Fix typo for libc++ tests and unblock one test
frederick-vs-ja Feb 17, 2023
1214db4
Fix copy-pasta and furtherly remove invalidated cases
frederick-vs-ja Feb 17, 2023
49344da
Eliminate `if constexpr` for C++14
frederick-vs-ja Feb 17, 2023
b63282f
Skip more cases
frederick-vs-ja Feb 17, 2023
0bd49e6
Fix `optional` and add test coverage
frederick-vs-ja Feb 19, 2023
30abcfe
Fix `variant` and add test coverage
frederick-vs-ja Feb 19, 2023
5837c31
Fix `_Variantish` and add test coverage
frederick-vs-ja Feb 19, 2023
7debf78
Fix boxes and add incomplete test coverage
frederick-vs-ja Feb 19, 2023
7da757b
Clang-format
frederick-vs-ja Feb 19, 2023
b9cb652
Try to fix `<xsmf_control.h>` and tests
frederick-vs-ja Feb 19, 2023
95a945b
Missed fixes
frederick-vs-ja Feb 19, 2023
91de15e
Ignore deprecation for test
frederick-vs-ja Feb 19, 2023
35a950e
`<expected>`: speculatively implement LWG-3891
frederick-vs-ja Feb 21, 2023
eb874c2
`<memory>` etc.: speculatively implement LWG-3888
frederick-vs-ja Feb 21, 2023
f95959a
Clang-format: restore mistakenly broken line
frederick-vs-ja Feb 21, 2023
486ebe9
Fix tests and libcxx skip
frederick-vs-ja Feb 21, 2023
b37e739
Furtherly fix tests
frederick-vs-ja Feb 21, 2023
17a0955
Fixes for Clang and EDG
frederick-vs-ja Feb 21, 2023
255628f
Merge remote-tracking branch 'origin/main' into lwg-3870
frederick-vs-ja Feb 21, 2023
c6662ba
Revert speculative implementation of LWG-3891
frederick-vs-ja Feb 22, 2023
9b37f8a
Merge branch 'main' into lwg-3870
frederick-vs-ja Mar 4, 2023
c7a72db
Revert incorrect line addition
frederick-vs-ja Mar 5, 2023
1733c9f
Skip the case for C++20
frederick-vs-ja Mar 5, 2023
5e20f62
Merge branch 'main' into lwg-3870
frederick-vs-ja Mar 8, 2023
ecb4077
Address @strega-nil-ms's review comments
frederick-vs-ja Mar 12, 2023
3ddb694
Fix constraints and constexpr
frederick-vs-ja Mar 12, 2023
00c161a
Merge branch 'main' into lwg-3870
StephanTLavavej Mar 19, 2023
215a006
`explicit constexpr` => `constexpr explicit`
StephanTLavavej Mar 19, 2023
2d11a16
`Uninitilized` => `Uninitialized`
StephanTLavavej Mar 19, 2023
e9ea2db
`ci` => `CommonIt`
StephanTLavavej Mar 19, 2023
226fba8
Avoid adding extra newline.
StephanTLavavej Mar 19, 2023
ccda2b1
Avoid defining multiple variables on a single line (pre-existing).
StephanTLavavej Mar 19, 2023
39150b7
Avoid defining multiple variables on a single line.
StephanTLavavej Mar 19, 2023
e02056a
Add scope to avoid pollution.
StephanTLavavej Mar 19, 2023
b2b8e40
Guard `_Voidify_unfancy` with `_HAS_CXX20`.
StephanTLavavej Mar 19, 2023
8506009
Fix typo bug!
StephanTLavavej Mar 19, 2023
ab3e92b
Restore support of `polymorphic_allocator::construct`...
frederick-vs-ja Mar 23, 2023
e720aa8
Fix copy-pasta
frederick-vs-ja Mar 23, 2023
bbcbcf0
Restore test coverage
frederick-vs-ja Mar 23, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
102 changes: 58 additions & 44 deletions stl/inc/iterator
Original file line number Diff line number Diff line change
Expand Up @@ -585,10 +585,10 @@ public:
// clang-format on
switch (_That._Contains) {
case _Variantish_state::_Holds_first:
_Construct_in_place(_First, _That._First);
_STD _Construct_in_place(_First, _That._Get_first());
break;
case _Variantish_state::_Holds_second:
_Construct_in_place(_Second, _That._Second);
_STD _Construct_in_place(_Second, _That._Get_second());
break;
case _Variantish_state::_Nothing:
break;
Expand All @@ -605,10 +605,10 @@ public:
: _Contains{_That._Contains} {
switch (_Contains) {
case _Variantish_state::_Holds_first:
_Construct_in_place(_First, _That._First);
_STD _Construct_in_place(_First, _That._Get_first());
break;
case _Variantish_state::_Holds_second:
_Construct_in_place(_Second, _That._Second);
_STD _Construct_in_place(_Second, _That._Get_second());
break;
case _Variantish_state::_Nothing:
break;
Expand All @@ -625,10 +625,10 @@ public:
: _Contains{_That._Contains} {
switch (_Contains) {
case _Variantish_state::_Holds_first:
_Construct_in_place(_First, _STD move(_That._First));
_STD _Construct_in_place(_First, _STD move(_That._Get_first()));
break;
case _Variantish_state::_Holds_second:
_Construct_in_place(_Second, _STD move(_That._Second));
_STD _Construct_in_place(_Second, _STD move(_That._Get_second()));
break;
case _Variantish_state::_Nothing:
break;
Expand Down Expand Up @@ -656,10 +656,10 @@ public:
if (_Contains == _That._Contains) {
switch (_Contains) {
case _Variantish_state::_Holds_first:
_First = _That._First;
_Get_first() = _That._Get_first();
break;
case _Variantish_state::_Holds_second:
_Second = _That._Second;
_Get_second() = _That._Get_second();
break;
case _Variantish_state::_Nothing:
break;
Expand All @@ -672,10 +672,10 @@ public:

switch (_That._Contains) {
case _Variantish_state::_Holds_first:
_Construct_in_place(_First, _That._First);
_STD _Construct_in_place(_First, _That._Get_first());
break;
case _Variantish_state::_Holds_second:
_Construct_in_place(_Second, _That._Second);
_STD _Construct_in_place(_Second, _That._Get_second());
break;
case _Variantish_state::_Nothing:
break;
Expand All @@ -701,10 +701,10 @@ public:
if (_Contains == _That._Contains) {
switch (_Contains) {
case _Variantish_state::_Holds_first:
_First = _STD move(_That._First);
_Get_first() = _STD move(_That._Get_first());
break;
case _Variantish_state::_Holds_second:
_Second = _STD move(_That._Second);
_Get_second() = _STD move(_That._Get_second());
break;
case _Variantish_state::_Nothing:
break;
Expand All @@ -717,10 +717,10 @@ public:

switch (_That._Contains) {
case _Variantish_state::_Holds_first:
_Construct_in_place(_First, _STD move(_That._First));
_STD _Construct_in_place(_First, _STD move(_That._Get_first()));
break;
case _Variantish_state::_Holds_second:
_Construct_in_place(_Second, _STD move(_That._Second));
_STD _Construct_in_place(_Second, _STD move(_That._Get_second()));
break;
case _Variantish_state::_Nothing:
break;
Expand All @@ -741,10 +741,10 @@ public:
if (_Contains == _That._Contains) {
switch (_Contains) {
case _Variantish_state::_Holds_first:
_First = _That._First;
_Get_first() = _That._Get_first();
break;
case _Variantish_state::_Holds_second:
_Second = _That._Second;
_Get_second() = _That._Get_second();
break;
case _Variantish_state::_Nothing:
break;
Expand All @@ -757,10 +757,10 @@ public:

switch (_That._Contains) {
case _Variantish_state::_Holds_first:
_Construct_in_place(_First, _That._First);
_STD _Construct_in_place(_First, _That._Get_first());
break;
case _Variantish_state::_Holds_second:
_Construct_in_place(_Second, _That._Second);
_STD _Construct_in_place(_Second, _That._Get_second());
break;
case _Variantish_state::_Nothing:
break;
Expand All @@ -780,10 +780,10 @@ public:
if (_Left._Contains == _Right._Contains) {
switch (_Left._Contains) {
case _Variantish_state::_Holds_first:
_RANGES swap(_Left._First, _Right._First);
_RANGES swap(_Left._Get_first(), _Right._Get_first());
break;
case _Variantish_state::_Holds_second:
_RANGES swap(_Left._Second, _Right._Second);
_RANGES swap(_Left._Get_second(), _Right._Get_second());
break;
case _Variantish_state::_Nothing:
break;
Expand All @@ -810,6 +810,20 @@ public:
}
}

_NODISCARD constexpr _Ty1& _Get_first() noexcept {
return _First;
}
_NODISCARD constexpr const _Ty1& _Get_first() const noexcept {
return _First;
}

_NODISCARD constexpr _Ty2& _Get_second() noexcept {
return _Second;
}
_NODISCARD constexpr const _Ty2& _Get_second() const noexcept {
return _Second;
}

constexpr void _Clear() noexcept {
_Raw_clear();
_Contains = _Variantish_state::_Nothing;
Expand All @@ -819,21 +833,21 @@ public:
constexpr void _Emplace_first(_Types&&... _Args) noexcept(is_nothrow_constructible_v<_Ty1, _Types...>) {
_Clear();

_Construct_in_place(_First, _STD forward<_Types>(_Args)...);
_STD _Construct_in_place(_First, _STD forward<_Types>(_Args)...);
_Contains = _Variantish_state::_Holds_first;
}

template <class... _Types>
constexpr void _Emplace_second(_Types&&... _Args) noexcept(is_nothrow_constructible_v<_Ty2, _Types...>) {
_Clear();

_Construct_in_place(_Second, _STD forward<_Types>(_Args)...);
_STD _Construct_in_place(_Second, _STD forward<_Types>(_Args)...);
_Contains = _Variantish_state::_Holds_second;
}

union {
_Ty1 _First;
_Ty2 _Second;
remove_cv_t<_Ty1> _First;
remove_cv_t<_Ty2> _Second;
};

_Variantish_state _Contains;
Expand Down Expand Up @@ -896,7 +910,7 @@ public:
_STL_VERIFY(_Val._Contains == _Variantish_state::_Holds_first,
"common_iterator can only be dereferenced if it holds an iterator");
#endif // _ITERATOR_DEBUG_LEVEL != 0
return *_Val._First;
return *_Val._Get_first();
}

_NODISCARD constexpr decltype(auto) operator*() const
Expand All @@ -906,7 +920,7 @@ public:
_STL_VERIFY(_Val._Contains == _Variantish_state::_Holds_first,
"common_iterator can only be dereferenced if it holds an iterator");
#endif // _ITERATOR_DEBUG_LEVEL != 0
return *_Val._First;
return *_Val._Get_first();
}

// clang-format off
Expand All @@ -920,9 +934,9 @@ public:
"common_iterator can only be dereferenced if it holds an iterator");
#endif // _ITERATOR_DEBUG_LEVEL != 0
if constexpr (_Has_member_arrow<const _Iter&> || is_pointer_v<_Iter>) {
return _Val._First;
return _Val._Get_first();
} else if constexpr (is_reference_v<iter_reference_t<_Iter>>) {
auto&& _Tmp = *_Val._First;
auto&& _Tmp = *_Val._Get_first();
return _STD addressof(_Tmp);
} else {
class _Arrow_proxy : private _Proxy_base {
Expand All @@ -936,7 +950,7 @@ public:
}
};

return _Arrow_proxy{*_Val._First};
return _Arrow_proxy{*_Val._Get_first()};
}
}

Expand All @@ -945,7 +959,7 @@ public:
_STL_VERIFY(_Val._Contains == _Variantish_state::_Holds_first,
"common_iterator can only be incremented if it holds an iterator");
#endif // _ITERATOR_DEBUG_LEVEL != 0
++_Val._First;
++_Val._Get_first();
return *this;
}

Expand All @@ -956,7 +970,7 @@ public:
#endif // _ITERATOR_DEBUG_LEVEL != 0
if constexpr (forward_iterator<_Iter>) {
common_iterator _Tmp = *this;
++_Val._First;
++_Val._Get_first();
return _Tmp;
} else if constexpr (_Use_postfix_proxy<_Iter>) {
class _Postfix_proxy : private _Proxy_base {
Expand All @@ -970,11 +984,11 @@ public:
}
};

_Postfix_proxy _Tmp{*_Val._First};
++_Val._First;
_Postfix_proxy _Tmp{*_Val._Get_first()};
++_Val._Get_first();
return _Tmp;
} else {
return _Val._First++;
return _Val._Get_first()++;
}
}

Expand All @@ -992,16 +1006,16 @@ public:
if (_Left._Val._Contains == _Variantish_state::_Holds_first) {
if (_Right_val._Contains == _Variantish_state::_Holds_first) {
if constexpr (equality_comparable_with<_Iter, _OIter>) {
return _Left._Val._First == _Right_val._First;
return _Left._Val._Get_first() == _Right_val._Get_first();
} else {
return true;
}
} else {
return _Left._Val._First == _Right_val._Second;
return _Left._Val._Get_first() == _Right_val._Get_second();
}
} else {
if (_Right_val._Contains == _Variantish_state::_Holds_first) {
return _Left._Val._Second == _Right_val._First;
return _Left._Val._Get_second() == _Right_val._Get_first();
} else {
return true;
}
Expand All @@ -1021,40 +1035,40 @@ public:

if (_Left._Val._Contains == _Variantish_state::_Holds_first) {
if (_Right_val._Contains == _Variantish_state::_Holds_first) {
return _Left._Val._First - _Right_val._First;
return _Left._Val._Get_first() - _Right_val._Get_first();
} else {
return _Left._Val._First - _Right_val._Second;
return _Left._Val._Get_first() - _Right_val._Get_second();
}
} else {
if (_Right_val._Contains == _Variantish_state::_Holds_first) {
return _Left._Val._Second - _Right_val._First;
return _Left._Val._Get_second() - _Right_val._Get_first();
} else {
return 0;
}
}
}

_NODISCARD_FRIEND constexpr iter_rvalue_reference_t<_Iter> iter_move(const common_iterator& _Right) noexcept(
noexcept(_RANGES iter_move(_Right._Val._First)))
noexcept(_RANGES iter_move(_Right._Val._Get_first())))
requires input_iterator<_Iter>
{
#if _ITERATOR_DEBUG_LEVEL != 0
_STL_VERIFY(_Right._Val._Contains == _Variantish_state::_Holds_first,
"can only iter_move from common_iterator if it holds an iterator");
#endif // _ITERATOR_DEBUG_LEVEL != 0
return _RANGES iter_move(_Right._Val._First);
return _RANGES iter_move(_Right._Val._Get_first());
}

template <indirectly_swappable<_Iter> _OIter, class _OSe>
friend constexpr void iter_swap(const common_iterator& _Left, const common_iterator<_OIter, _OSe>& _Right) noexcept(
noexcept(_RANGES iter_swap(_Left._Val._First, _Right._Get_val()._First))) {
noexcept(_RANGES iter_swap(_Left._Val._Get_first(), _Right._Get_val()._Get_first()))) {
auto& _Right_val = _Right._Get_val();
#if _ITERATOR_DEBUG_LEVEL != 0
_STL_VERIFY(_Left._Val._Contains == _Variantish_state::_Holds_first
&& _Right_val._Contains == _Variantish_state::_Holds_first,
"can only iter_swap common_iterators if both hold iterators");
#endif // _ITERATOR_DEBUG_LEVEL != 0
return _RANGES iter_swap(_Left._Val._First, _Right_val._First);
return _RANGES iter_swap(_Left._Val._Get_first(), _Right_val._Get_first());
}

_NODISCARD constexpr _Variantish<_Iter, _Se>& _Get_val() noexcept {
Expand Down
Loading