Reorder a couple of operations in inplace_merge so that we can meet the complexity guidelines mandated by the standard. References PR22427

llvm-svn: 227808
This commit is contained in:
Marshall Clow 2015-02-02 16:44:11 +00:00
parent 535ee97853
commit 526e0929a5
1 changed files with 3 additions and 5 deletions

View File

@ -4407,6 +4407,9 @@ __inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle,
// if __middle == __last, we're done
if (__len2 == 0)
return;
if (__len1 <= __buff_size || __len2 <= __buff_size)
return __buffered_inplace_merge<_Compare>
(__first, __middle, __last, __comp, __len1, __len2, __buff);
// shrink [__first, __middle) as much as possible (with no moves), returning if it shrinks to 0
for (; true; ++__first, (void) --__len1)
{
@ -4415,11 +4418,6 @@ __inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle,
if (__comp(*__middle, *__first))
break;
}
if (__len1 <= __buff_size || __len2 <= __buff_size)
{
__buffered_inplace_merge<_Compare>(__first, __middle, __last, __comp, __len1, __len2, __buff);
return;
}
// __first < __middle < __last
// *__first > *__middle
// partition [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __last) such that