Fix issue #81 from Interprocess, self-moving range was corrupting range merging

This commit is contained in:
Ion Gaztañaga
2019-03-21 23:49:54 +01:00
parent 754eaae8e5
commit 756c964798

View File

@@ -853,15 +853,26 @@ template<typename BidirectionalIterator1, typename BidirectionalIterator2,
{ {
if (len1 > len2 && len2 <= buffer_size) if (len1 > len2 && len2 <= buffer_size)
{ {
BidirectionalIterator2 buffer_end = boost::move(middle, last, buffer); if(len2) //Protect against self-move ranges
boost::move_backward(first, middle, last); {
return boost::move(buffer, buffer_end, first); BidirectionalIterator2 buffer_end = boost::move(middle, last, buffer);
boost::move_backward(first, middle, last);
return boost::move(buffer, buffer_end, first);
}
else
return first;
} }
else if (len1 <= buffer_size) else if (len1 <= buffer_size)
{ {
BidirectionalIterator2 buffer_end = boost::move(first, middle, buffer); if(len1) //Protect against self-move ranges
boost::move(middle, last, first); {
return boost::move_backward(buffer, buffer_end, last); BidirectionalIterator2 buffer_end = boost::move(first, middle, buffer);
BidirectionalIterator1 ret = boost::move(middle, last, first);
boost::move(buffer, buffer_end, ret);
return ret;
}
else
return last;
} }
else else
return rotate_gcd(first, middle, last); return rotate_gcd(first, middle, last);