mirror of
https://github.com/dlang/phobos.git
synced 2025-04-29 14:40:30 +03:00
Fix Issue 14223
This commit is contained in:
parent
323b512596
commit
4abe95ef5b
1 changed files with 12 additions and 10 deletions
|
@ -1225,17 +1225,16 @@ private template TimSortImpl(alias pred, R)
|
||||||
// STACK is | ... e1 e2 e3 >
|
// STACK is | ... e1 e2 e3 >
|
||||||
while (stackLen > 1)
|
while (stackLen > 1)
|
||||||
{
|
{
|
||||||
immutable run1 = stackLen - 4;
|
|
||||||
immutable run2 = stackLen - 3;
|
|
||||||
immutable run3 = stackLen - 2;
|
|
||||||
immutable run4 = stackLen - 1;
|
immutable run4 = stackLen - 1;
|
||||||
|
immutable run3 = stackLen - 2;
|
||||||
|
immutable run2 = stackLen - 3;
|
||||||
|
immutable run1 = stackLen - 4;
|
||||||
|
|
||||||
if (stackLen > 2 && stack[run2].length <= stack[run3].length + stack[run4].length ||
|
if ( (stackLen > 2 && stack[run2].length <= stack[run3].length + stack[run4].length) ||
|
||||||
stackLen > 3 && stack[run1].length <= stack[run3].length + stack[run2].length )
|
(stackLen > 3 && stack[run1].length <= stack[run3].length + stack[run2].length) )
|
||||||
{
|
{
|
||||||
immutable at = stack[run2].length < stack[run4].length ? run2 : run3;
|
immutable at = stack[run2].length < stack[run4].length ? run2 : run3;
|
||||||
mergeAt(range, stack[0 .. stackLen], at, minGallop, temp);
|
mergeAt(range, stack[0 .. stackLen], at, minGallop, temp);
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (stack[run3].length > stack[run4].length) break;
|
else if (stack[run3].length > stack[run4].length) break;
|
||||||
else mergeAt(range, stack[0 .. stackLen], run3, minGallop, temp);
|
else mergeAt(range, stack[0 .. stackLen], run3, minGallop, temp);
|
||||||
|
@ -1244,13 +1243,16 @@ private template TimSortImpl(alias pred, R)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Assert that the code above established the invariant correctly
|
// Assert that the code above established the invariant correctly
|
||||||
debug
|
version (assert)
|
||||||
{
|
{
|
||||||
if (stackLen == 2) assert(stack[0].length > stack[1].length);
|
if (stackLen == 2) assert(stack[0].length > stack[1].length);
|
||||||
else if (stackLen > 2) foreach(k; 2 .. stackLen)
|
else if (stackLen > 2)
|
||||||
{
|
{
|
||||||
assert(stack[k - 2].length > stack[k - 1].length + stack[k].length);
|
foreach(k; 2 .. stackLen)
|
||||||
assert(stack[k - 1].length > stack[k].length);
|
{
|
||||||
|
assert(stack[k - 2].length > stack[k - 1].length + stack[k].length);
|
||||||
|
assert(stack[k - 1].length > stack[k].length);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue