|
From: <jfb...@us...> - 2009-03-12 12:29:05
|
Revision: 1006
http://loki-lib.svn.sourceforge.net/loki-lib/?rev=1006&view=rev
Author: jfbastien
Date: 2009-03-12 12:28:58 +0000 (Thu, 12 Mar 2009)
Log Message:
-----------
Bug 2684989: flex_string insert char fails with SmallStringOpt
Modified Paths:
--------------
trunk/include/loki/flex/flex_string_shell.h
Modified: trunk/include/loki/flex/flex_string_shell.h
===================================================================
--- trunk/include/loki/flex/flex_string_shell.h 2009-03-11 17:58:49 UTC (rev 1005)
+++ trunk/include/loki/flex/flex_string_shell.h 2009-03-12 12:28:58 UTC (rev 1006)
@@ -548,29 +548,27 @@
Invariant checker(*this);
(void) checker;
assert(begin() <= p && p <= end());
- if (capacity() - size() < n)
+ const size_type insertOffset(p - begin());
+ const size_type originalSize(size());
+ if(n < originalSize - insertOffset)
{
- const size_type sz = p - begin();
- reserve(size() + n);
- p = begin() + sz;
+ // The new characters fit within the original string.
+ // The characters that are pushed back need to be moved because they're aliased.
+ // The appended characters will all be overwritten by the move.
+ append(n, value_type(0));
+ value_type * begin(&*begin());
+ flex_string_details::pod_move(begin + insertOffset, begin + originalSize, begin + insertOffset + n);
+ std::fill(begin + insertOffset, begin + insertOffset + n, c);
}
- const iterator oldEnd = end();
- //if (p + n < oldEnd) // replaced because of crash (pk)
- if( n < size_type(oldEnd - p))
- {
- append(oldEnd - n, oldEnd);
- //std::copy(
- // reverse_iterator(oldEnd - n),
- // reverse_iterator(p),
- // reverse_iterator(oldEnd));
- flex_string_details::pod_move(&*p, &*oldEnd - n, &*p + n);
- std::fill(p, p + n, c);
- }
else
{
- append(n - (end() - p), c);
- append(p, oldEnd);
- std::fill(p, oldEnd, c);
+ // The new characters exceed the original string.
+ // The characters that are pushed back can simply be copied since they aren't aliased.
+ // The appended characters will partly be overwritten by the copy.
+ append(n, c);
+ value_type * begin(&*begin());
+ flex_string_details::pod_copy(begin + insertOffset, begin + originalSize, begin + insertOffset + n);
+ std::fill(begin + insertOffset, begin + originalSize, c);
}
return *this;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|