This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[v3] Some tweaks to std::vector (in C++0x)


Hi,

tested x86_64-linux, committed.

Paolo.

////////////////////
2007-11-06  Paolo Carlini  <pcarlini@suse.de>

	* include/bits/vector.tcc (vector<>::_M_insert_aux<>(iterator,
	_Args&&...)): In C++0x mode do not use temporary copies.
	(insert(iterator, const value_type&)): Copy to a temporary
	when not reallocating.

	* include/bits/vector.tcc (insert(iterator, value_type&&)):
	Minor tweaks in C++0x mode.
Index: include/bits/vector.tcc
===================================================================
--- include/bits/vector.tcc	(revision 129939)
+++ include/bits/vector.tcc	(working copy)
@@ -101,7 +101,17 @@
 	  ++this->_M_impl._M_finish;
 	}
       else
-        _M_insert_aux(__position, __x);
+	{
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+	  if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
+	    {
+	      _Tp __x_copy = __x;
+	      _M_insert_aux(__position, std::move(__x_copy));
+	    }
+	  else
+#endif
+	    _M_insert_aux(__position, __x);
+	}
       return iterator(this->_M_impl._M_start + __n);
     }
 
@@ -115,12 +125,11 @@
       if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage
 	  && __position == end())
 	{
-	  this->_M_impl.construct(this->_M_impl._M_finish,
-				  std::forward<value_type>(__x));
+	  this->_M_impl.construct(this->_M_impl._M_finish, std::move(__x));
 	  ++this->_M_impl._M_finish;
 	}
       else
-        _M_insert_aux(__position, std::forward<value_type>(__x));
+        _M_insert_aux(__position, std::move(__x));
       return iterator(this->_M_impl._M_start + __n);
     }
 #endif
@@ -286,15 +295,13 @@
       void
       vector<_Tp, _Alloc>::
       _M_insert_aux(iterator __position, _Args&&... __args)
-      {
-	_Tp __x_copy(std::forward<_Args>(__args)...);
 #else
   template<typename _Tp, typename _Alloc>
     void
     vector<_Tp, _Alloc>::
     _M_insert_aux(iterator __position, const _Tp& __x)
-    {
 #endif
+    {
       if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
 	{
 	  this->_M_impl.construct(this->_M_impl._M_finish,
@@ -307,7 +314,11 @@
 	  _GLIBCXX_MOVE_BACKWARD3(__position.base(),
 				  this->_M_impl._M_finish - 2,
 				  this->_M_impl._M_finish - 1);
-	  *__position = _GLIBCXX_MOVE(__x_copy);
+#ifndef __GXX_EXPERIMENTAL_CXX0X__
+	  *__position = __x_copy;
+#else
+	  *__position = _Tp(std::forward<_Args>(__args)...);
+#endif
 	}
       else
 	{
@@ -317,13 +328,15 @@
 	  pointer __new_finish(__new_start);
 	  try
 	    {
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+	      this->_M_impl.construct(__new_start + (__position - begin()),
+				      std::forward<_Args>(__args)...);
+#endif
 	      __new_finish =
 		std::__uninitialized_move_a(this->_M_impl._M_start,
 					    __position.base(), __new_start,
 					    _M_get_Tp_allocator());
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-	      this->_M_impl.construct(__new_finish, std::move(__x_copy));
-#else
+#ifndef __GXX_EXPERIMENTAL_CXX0X__
 	      this->_M_impl.construct(__new_finish, __x);
 #endif
 	      ++__new_finish;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]