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