From 7a84b6290fc2e8308f735e413551fbbe78bf3029 Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Sat, 15 Jan 2022 18:30:46 +0200 Subject: [PATCH 1/7] Untag dispatch string constructor Towards #189 --- stl/inc/xstring | 50 ++++++++++++++++++++----------------------------- 1 file changed, 20 insertions(+), 30 deletions(-) diff --git a/stl/inc/xstring b/stl/inc/xstring index b98faf0abf1..4e25ab84518 100644 --- a/stl/inc/xstring +++ b/stl/inc/xstring @@ -2582,41 +2582,31 @@ public: _Container_proxy_ptr<_Alty> _Proxy(_Alproxy, _Mypair._Myval2); _Tidy_init(); _Adl_verify_range(_First, _Last); - _Construct(_Get_unwrapped(_First), _Get_unwrapped(_Last), _Iter_cat_t<_Iter>{}); - _Proxy._Release(); - } + auto _UFirst = _Get_unwrapped(_First); + const auto _ULast = _Get_unwrapped(_Last); - template - _CONSTEXPR20 void _Construct(_Iter _First, const _Iter _Last, input_iterator_tag) { - // initialize from [_First, _Last), input iterators - _Tidy_deallocate_guard _Guard{this}; - for (; _First != _Last; ++_First) { - push_back(*_First); - } - - _Guard._Target = nullptr; - } + if constexpr (_Is_random_iter_v<_Iter>) { + if (_First != _Last) { + assign(_UFirst, _Convert_size(static_cast(_ULast - _UFirst))); + } + } else { + if constexpr (_Is_fwd_iter_v<_Iter>) { + const auto _Count = _Convert_size(static_cast(_STD distance(_UFirst, _ULast))); + reserve(_Count); + } else { + static_assert(_Is_input_iter_v<_Iter>, "Should be at least input iterator"); + } - template - _CONSTEXPR20 void _Construct(const _Iter _First, const _Iter _Last, forward_iterator_tag) { - // initialize from [_First, _Last), forward iterators - const size_type _Count = _Convert_size(static_cast(_STD distance(_First, _Last))); - reserve(_Count); - _Construct(_First, _Last, input_iterator_tag{}); - } + // initialize from [_First, _Last), input iterators + _Tidy_deallocate_guard _Guard{this}; + for (; _UFirst != _UFirst; ++_UFirst) { + push_back(*_UFirst); + } - _CONSTEXPR20 void _Construct(_Elem* const _First, _Elem* const _Last, random_access_iterator_tag) { - // initialize from [_First, _Last), pointers - if (_First != _Last) { - assign(_First, _Convert_size(static_cast(_Last - _First))); + _Guard._Target = nullptr; } - } - _CONSTEXPR20 void _Construct(const _Elem* const _First, const _Elem* const _Last, random_access_iterator_tag) { - // initialize from [_First, _Last), const pointers - if (_First != _Last) { - assign(_First, _Convert_size(static_cast(_Last - _First))); - } + _Proxy._Release(); } _CONSTEXPR20 basic_string(basic_string&& _Right) noexcept From 28ca0be270efe7f567a3c179c47ff2ef3b3c8cbe Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Sat, 15 Jan 2022 18:52:43 +0200 Subject: [PATCH 2/7] _ULast --- stl/inc/xstring | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stl/inc/xstring b/stl/inc/xstring index 4e25ab84518..069dc86532e 100644 --- a/stl/inc/xstring +++ b/stl/inc/xstring @@ -2599,7 +2599,7 @@ public: // initialize from [_First, _Last), input iterators _Tidy_deallocate_guard _Guard{this}; - for (; _UFirst != _UFirst; ++_UFirst) { + for (; _UFirst != _ULast; ++_UFirst) { push_back(*_UFirst); } From 7a044667188890c288babc298b4d9b3078caa7ea Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Sat, 15 Jan 2022 19:08:59 +0200 Subject: [PATCH 3/7] unwrap --- stl/inc/xstring | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stl/inc/xstring b/stl/inc/xstring index 069dc86532e..cbdea2859a3 100644 --- a/stl/inc/xstring +++ b/stl/inc/xstring @@ -2586,7 +2586,7 @@ public: const auto _ULast = _Get_unwrapped(_Last); if constexpr (_Is_random_iter_v<_Iter>) { - if (_First != _Last) { + if (_UFirst != _ULast) { assign(_UFirst, _Convert_size(static_cast(_ULast - _UFirst))); } } else { From 374c729ff1c00b8bc4e940f58f3a7c9137a45645 Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Sat, 15 Jan 2022 19:25:37 +0200 Subject: [PATCH 4/7] pointer --- stl/inc/xstring | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stl/inc/xstring b/stl/inc/xstring index cbdea2859a3..4d889a72af5 100644 --- a/stl/inc/xstring +++ b/stl/inc/xstring @@ -2585,7 +2585,7 @@ public: auto _UFirst = _Get_unwrapped(_First); const auto _ULast = _Get_unwrapped(_Last); - if constexpr (_Is_random_iter_v<_Iter>) { + if constexpr (_Is_random_iter_v<_Iter> && is_pointer_v(static_cast(_ULast - _UFirst))); } From 19ee3275e19579d3b16c46836acbbae52170d98e Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Sat, 15 Jan 2022 19:30:27 +0200 Subject: [PATCH 5/7] > --- stl/inc/xstring | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stl/inc/xstring b/stl/inc/xstring index 4d889a72af5..59dd44cdefe 100644 --- a/stl/inc/xstring +++ b/stl/inc/xstring @@ -2585,7 +2585,7 @@ public: auto _UFirst = _Get_unwrapped(_First); const auto _ULast = _Get_unwrapped(_Last); - if constexpr (_Is_random_iter_v<_Iter> && is_pointer_v && is_pointer_v) { if (_UFirst != _ULast) { assign(_UFirst, _Convert_size(static_cast(_ULast - _UFirst))); } From adaaaacc8493073df55dae37f7357592b2fca3e1 Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Sat, 15 Jan 2022 19:53:47 +0200 Subject: [PATCH 6/7] more precisely emulate dispatch --- stl/inc/xstring | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stl/inc/xstring b/stl/inc/xstring index 59dd44cdefe..db791715cb6 100644 --- a/stl/inc/xstring +++ b/stl/inc/xstring @@ -2585,7 +2585,7 @@ public: auto _UFirst = _Get_unwrapped(_First); const auto _ULast = _Get_unwrapped(_Last); - if constexpr (_Is_random_iter_v<_Iter> && is_pointer_v) { + if constexpr (_Is_random_iter_v<_Iter> && is_same_v>, _Elem>) { if (_UFirst != _ULast) { assign(_UFirst, _Convert_size(static_cast(_ULast - _UFirst))); } From 0dcc51edff4622b6330282b2e47963fb272e3eff Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Sat, 15 Jan 2022 20:05:10 +0200 Subject: [PATCH 7/7] clang-format --- stl/inc/xstring | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stl/inc/xstring b/stl/inc/xstring index db791715cb6..01dcf12d44d 100644 --- a/stl/inc/xstring +++ b/stl/inc/xstring @@ -2585,7 +2585,7 @@ public: auto _UFirst = _Get_unwrapped(_First); const auto _ULast = _Get_unwrapped(_Last); - if constexpr (_Is_random_iter_v<_Iter> && is_same_v>, _Elem>) { + if constexpr (is_same_v>, _Elem>) { if (_UFirst != _ULast) { assign(_UFirst, _Convert_size(static_cast(_ULast - _UFirst))); }