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