You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stdcxx.apache.org by fa...@apache.org on 2007/10/22 19:40:20 UTC

svn commit: r587168 - /incubator/stdcxx/trunk/include/vector.cc

Author: faridz
Date: Mon Oct 22 10:40:19 2007
New Revision: 587168

URL: http://svn.apache.org/viewvc?rev=587168&view=rev
Log:
2007-10-22 Farid Zaripov <fa...@epam.com>

	Merged r587164 from branches/4.2.x with a fix for STDCXX-495
	* vector.cc (_C_insert_1): Allow inserting the values from *this.
	If the value_type is a fundamental type, then save the inserting value
	in a temporary copy before the moving [it; end()) range toward to end.
	If the value_type is not a fundamental type, then save the pointer to
	the inserting value and adjust the pointer if the inserting value belongs
	to the range [it; end()).

Modified:
    incubator/stdcxx/trunk/include/vector.cc

Modified: incubator/stdcxx/trunk/include/vector.cc
URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/include/vector.cc?rev=587168&r1=587167&r2=587168&view=diff
==============================================================================
--- incubator/stdcxx/trunk/include/vector.cc (original)
+++ incubator/stdcxx/trunk/include/vector.cc Mon Oct 22 10:40:19 2007
@@ -39,6 +39,8 @@
  * 
  **************************************************************************/
 
+#include <rw/_typetraits.h>   // for __rw_type_traits<>
+
 _RWSTD_NAMESPACE (std) { 
 
 template <class _TypeT, class _Allocator>
@@ -178,12 +180,38 @@
             // and bump up end()
             _C_push_back (*(_C_end - difference_type (1)));
 
-            // move the remaining elements from the range above one slot
-            // toward the end starting with the last element
-            _STD::copy_backward (__it, end () - 2, __end);
-
-            // overwrite the element at the given position
-            *__it = __x;
+            if (__rw::__rw_type_traits<value_type>::_C_is_class) {
+                // save the pointer to allow inserting the value from self
+                const value_type* __px = &__x;
+
+                if (&*__it < __px && __px < &*__end) {
+                    // adjust the pointer if the inserting value
+                    // belongs the range (__it; __end)
+                    ++__px;
+                } else if (&*__it == __px) {
+                    // reset the pointer to 0 to avoid
+                    // self assignment __x = __x
+                    __px = 0;
+                }
+
+                // move the remaining elements from the range above one slot
+                // toward the end starting with the last element
+                _STD::copy_backward (__it, end () - 2, __end);
+
+                // overwrite the element at the given position
+                if (__px)
+                    *__it = *__px;
+            } else {
+                // save the copy to allow inserting the value from self
+                const value_type __tmp = __x;
+
+                // move the remaining elements from the range above one slot
+                // toward the end starting with the last element
+                _STD::copy_backward (__it, end () - 2, __end);
+
+                // overwrite the element at the given position
+                *__it = __tmp;
+            }
         }
         else {
             // construct a copy of the value to be inserted