From 0b8699d51730a11c1988c47c87153a6c09d303e4 Mon Sep 17 00:00:00 2001 From: "A. Jiang" Date: Wed, 10 Aug 2022 20:00:54 +0800 Subject: [PATCH 1/7] Apply append-and-rotate for vector insertion --- stl/inc/vector | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/stl/inc/vector b/stl/inc/vector index 9689a5862c0..22904b25362 100644 --- a/stl/inc/vector +++ b/stl/inc/vector @@ -3406,11 +3406,13 @@ public: _Copy_unchecked(_UFirst, _ULast, begin() + _Off); #endif // __cpp_lib_concepts } else { - difference_type _Off = _Saved_offset; - - for (; _UFirst != _ULast; ++_UFirst, (void) ++_Off) { - insert(begin() + _Off, *_UFirst); + const auto _Old_size = this->_My_size; + while (_UFirst != _ULast) { + insert(end(), *_UFirst); + ++_UFirst; } + _Orphan_range(static_cast(_Saved_offset), _Old_size); + _STD rotate(begin() + _Saved_offset, begin() + _Old_size, end()); } return begin() + _Saved_offset; @@ -3427,11 +3429,15 @@ public: const auto _Off = static_cast(_Insert_x(_Where, _Count)); _Copy_n_unchecked4(_RANGES _Ubegin(_Range), _Count, begin() + _Off); } else { - auto _UFirst = _RANGES _Ubegin(_Range); - const auto _ULast = _RANGES _Uend(_Range); - for (difference_type _Off = _Old_off; _UFirst != _ULast; ++_UFirst, (void) ++_Off) { - insert(begin() + _Off, *_UFirst); + auto _UFirst = _RANGES _Ubegin(_Range); + const auto _ULast = _RANGES _Uend(_Range); + const auto _Old_size = this->_My_size; + while (_UFirst != _ULast) { + insert(end(), *_UFirst); + ++_UFirst; } + _Orphan_range(static_cast(_Old_off), _Old_size); + _STD rotate(begin() + _Old_off, begin() + _Old_size, end()); } return begin() + _Old_off; From ce60c29299db26fb0c50c0a603627b37bdf58910 Mon Sep 17 00:00:00 2001 From: "A. Jiang" Date: Wed, 10 Aug 2022 20:21:51 +0800 Subject: [PATCH 2/7] Fix format copy-pasta... --- stl/inc/vector | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stl/inc/vector b/stl/inc/vector index 22904b25362..9a99c29b6d1 100644 --- a/stl/inc/vector +++ b/stl/inc/vector @@ -3406,7 +3406,7 @@ public: _Copy_unchecked(_UFirst, _ULast, begin() + _Off); #endif // __cpp_lib_concepts } else { - const auto _Old_size = this->_My_size; + const auto _Old_size = this->_My_size; while (_UFirst != _ULast) { insert(end(), *_UFirst); ++_UFirst; From 223ad49941783364052d084b70c52b1104583a0b Mon Sep 17 00:00:00 2001 From: "A. Jiang" Date: Wed, 10 Aug 2022 20:47:26 +0800 Subject: [PATCH 3/7] Fix a fatal name error --- stl/inc/vector | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/stl/inc/vector b/stl/inc/vector index 9a99c29b6d1..cd4a729f31a 100644 --- a/stl/inc/vector +++ b/stl/inc/vector @@ -3406,13 +3406,13 @@ public: _Copy_unchecked(_UFirst, _ULast, begin() + _Off); #endif // __cpp_lib_concepts } else { - const auto _Old_size = this->_My_size; + const auto _Old_size = this->_Mysize; while (_UFirst != _ULast) { insert(end(), *_UFirst); ++_UFirst; } _Orphan_range(static_cast(_Saved_offset), _Old_size); - _STD rotate(begin() + _Saved_offset, begin() + _Old_size, end()); + _STD rotate(begin() + _Saved_offset, begin() + static_cast(_Old_size), end()); } return begin() + _Saved_offset; @@ -3431,13 +3431,13 @@ public: } else { auto _UFirst = _RANGES _Ubegin(_Range); const auto _ULast = _RANGES _Uend(_Range); - const auto _Old_size = this->_My_size; + const auto _Old_size = this->_Mysize; while (_UFirst != _ULast) { insert(end(), *_UFirst); ++_UFirst; } _Orphan_range(static_cast(_Old_off), _Old_size); - _STD rotate(begin() + _Old_off, begin() + _Old_size, end()); + _STD rotate(begin() + _Old_off, begin() + static_cast(_Old_size), end()); } return begin() + _Old_off; From fbfbf348a21e1bac9b0dfae727c7185ea830ae38 Mon Sep 17 00:00:00 2001 From: "A. Jiang" Date: Wed, 10 Aug 2022 21:13:13 +0800 Subject: [PATCH 4/7] Add forgotten guards --- stl/inc/vector | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/stl/inc/vector b/stl/inc/vector index cd4a729f31a..684efc55cd7 100644 --- a/stl/inc/vector +++ b/stl/inc/vector @@ -3411,7 +3411,9 @@ public: insert(end(), *_UFirst); ++_UFirst; } +#if _ITERATOR_DEBUG_LEVEL == 2 _Orphan_range(static_cast(_Saved_offset), _Old_size); +#endif // _ITERATOR_DEBUG_LEVEL == 2 _STD rotate(begin() + _Saved_offset, begin() + static_cast(_Old_size), end()); } @@ -3436,7 +3438,9 @@ public: insert(end(), *_UFirst); ++_UFirst; } +#if _ITERATOR_DEBUG_LEVEL == 2 _Orphan_range(static_cast(_Old_off), _Old_size); +#endif // _ITERATOR_DEBUG_LEVEL == 2 _STD rotate(begin() + _Old_off, begin() + static_cast(_Old_size), end()); } From e9b7bf484f9b93eec7b69c6baa15c4c950eacc81 Mon Sep 17 00:00:00 2001 From: "A. Jiang" Date: Wed, 10 Aug 2022 21:42:47 +0800 Subject: [PATCH 5/7] RERUN --- stl/inc/vector | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stl/inc/vector b/stl/inc/vector index 684efc55cd7..dc63b5eca4e 100644 --- a/stl/inc/vector +++ b/stl/inc/vector @@ -3434,7 +3434,7 @@ public: auto _UFirst = _RANGES _Ubegin(_Range); const auto _ULast = _RANGES _Uend(_Range); const auto _Old_size = this->_Mysize; - while (_UFirst != _ULast) { + while (_UFirst != _ULast) { //RERUN insert(end(), *_UFirst); ++_UFirst; } From ec96a1cad1d56d71ff5d917ef93fc2347d6961e9 Mon Sep 17 00:00:00 2001 From: "A. Jiang" Date: Wed, 10 Aug 2022 21:43:12 +0800 Subject: [PATCH 6/7] RERUN, again --- stl/inc/vector | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stl/inc/vector b/stl/inc/vector index dc63b5eca4e..684efc55cd7 100644 --- a/stl/inc/vector +++ b/stl/inc/vector @@ -3434,7 +3434,7 @@ public: auto _UFirst = _RANGES _Ubegin(_Range); const auto _ULast = _RANGES _Uend(_Range); const auto _Old_size = this->_Mysize; - while (_UFirst != _ULast) { //RERUN + while (_UFirst != _ULast) { insert(end(), *_UFirst); ++_UFirst; } From 6cc56b2ff7fcaa2cf89532da833fadd680cf7168 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Wed, 10 Aug 2022 15:38:46 -0700 Subject: [PATCH 7/7] Use for-loops and emplace_back. --- stl/inc/vector | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/stl/inc/vector b/stl/inc/vector index 684efc55cd7..f77d09a6d3d 100644 --- a/stl/inc/vector +++ b/stl/inc/vector @@ -3407,9 +3407,8 @@ public: #endif // __cpp_lib_concepts } else { const auto _Old_size = this->_Mysize; - while (_UFirst != _ULast) { - insert(end(), *_UFirst); - ++_UFirst; + for (; _UFirst != _ULast; ++_UFirst) { + emplace_back(*_UFirst); } #if _ITERATOR_DEBUG_LEVEL == 2 _Orphan_range(static_cast(_Saved_offset), _Old_size); @@ -3434,9 +3433,8 @@ public: auto _UFirst = _RANGES _Ubegin(_Range); const auto _ULast = _RANGES _Uend(_Range); const auto _Old_size = this->_Mysize; - while (_UFirst != _ULast) { - insert(end(), *_UFirst); - ++_UFirst; + for (; _UFirst != _ULast; ++_UFirst) { + emplace_back(*_UFirst); } #if _ITERATOR_DEBUG_LEVEL == 2 _Orphan_range(static_cast(_Old_off), _Old_size);