Improve insert/emplace robustness to self insertion
Jonathan Wakely
jwakely@redhat.com
Wed Jun 29 09:11:00 GMT 2016
On 28/06/16 21:59 +0200, François Dumont wrote:
>@@ -303,16 +301,20 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> emplace(const_iterator __position, _Args&&... __args)
> {
> const size_type __n = __position - begin();
It looks like this should use __position - cbegin(), to avoid an
implicit conversion from iterator to const_iterator, and ...
>- if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage
>- && __position == end())
>- {
>- _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
>- std::forward<_Args>(__args)...);
>- ++this->_M_impl._M_finish;
>- }
>+ if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
>+ if (__position == end())
This could be __position == cend(), and ...
>+ {
>+ _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
>+ std::forward<_Args>(__args)...);
>+ ++this->_M_impl._M_finish;
>+ }
>+ else
>+ _M_insert_aux(begin() + (__position - cbegin()),
This could use __n, and ...
>+ std::forward<_Args>(__args)...);
> else
>- _M_insert_aux(begin() + (__position - cbegin()),
>- std::forward<_Args>(__args)...);
>+ _M_realloc_insert_aux(begin() + (__position - cbegin()),
This could also use __n.
>+ std::forward<_Args>(__args)...);
>+
> return iterator(this->_M_impl._M_start + __n);
> }
>
More information about the Libstdc++
mailing list