medianOf restricted for now to only size_t indexes

This commit is contained in:
Andrei Alexandrescu 2016-09-29 18:45:42 -04:00
parent 1859f0dc19
commit 25dac83dbc

View file

@ -3150,7 +3150,7 @@ private void medianOf(
(Range r, Indexes i) (Range r, Indexes i)
if (isRandomAccessRange!Range && hasLength!Range && if (isRandomAccessRange!Range && hasLength!Range &&
Indexes.length >= 2 && Indexes.length <= 5 && Indexes.length >= 2 && Indexes.length <= 5 &&
allSatisfy!(isIntegral, Indexes)) allSatisfy!(isUnsigned, Indexes))
{ {
assert(r.length >= Indexes.length); assert(r.length >= Indexes.length);
import std.functional : binaryFun; import std.functional : binaryFun;
@ -3159,24 +3159,29 @@ if (isRandomAccessRange!Range && hasLength!Range &&
import std.algorithm.mutation : swapAt; import std.algorithm.mutation : swapAt;
alias a = i[0]; alias a = i[0];
static assert(is(typeof(a) == size_t));
static if (k >= 2) static if (k >= 2)
{ {
alias b = i[1]; alias b = i[1];
static assert(is(typeof(b) == size_t));
assert(a != b); assert(a != b);
} }
static if (k >= 3) static if (k >= 3)
{ {
alias c = i[2]; alias c = i[2];
static assert(is(typeof(c) == size_t));
assert(a != c && b != c); assert(a != c && b != c);
} }
static if (k >= 4) static if (k >= 4)
{ {
alias d = i[3]; alias d = i[3];
static assert(is(typeof(d) == size_t));
assert(a != d && b != d && c != d); assert(a != d && b != d && c != d);
} }
static if (k >= 5) static if (k >= 5)
{ {
alias e = i[4]; alias e = i[4];
static assert(is(typeof(e) == size_t));
assert(a != e && b != e && c != e && d != e); assert(a != e && b != e && c != e && d != e);
} }
@ -3269,23 +3274,24 @@ unittest
do do
{ {
int[5] a = data; int[5] a = data;
medianOf(a[], 0, 1); medianOf(a[], size_t(0), size_t(1));
assert(a[0] <= a[1]); assert(a[0] <= a[1]);
a[] = data[]; a[] = data[];
medianOf(a[], 0, 1, 2); medianOf(a[], size_t(0), size_t(1), size_t(2));
assert(ordered(a[0], a[1], a[2])); assert(ordered(a[0], a[1], a[2]));
a[] = data[]; a[] = data[];
medianOf(a[], 0, 1, 2, 3); medianOf(a[], size_t(0), size_t(1), size_t(2), size_t(3));
assert(a[0] <= a[1] && a[1] <= a[2] && a[1] <= a[3]); assert(a[0] <= a[1] && a[1] <= a[2] && a[1] <= a[3]);
a[] = data[]; a[] = data[];
medianOf!("a < b", Yes.leanRight)(a[], 0, 1, 2, 3); medianOf!("a < b", Yes.leanRight)(a[], size_t(0), size_t(1),
size_t(2), size_t(3));
assert(a[0] <= a[2] && a[1] <= a[2] && a[2] <= a[3]); assert(a[0] <= a[2] && a[1] <= a[2] && a[2] <= a[3]);
a[] = data[]; a[] = data[];
medianOf(a[], 0, 1, 2, 3, 4); medianOf(a[], size_t(0), size_t(1), size_t(2), size_t(3), size_t(4));
assert(a[0] <= a[2] && a[1] <= a[2] && a[2] <= a[3] && a[2] <= a[4]); assert(a[0] <= a[2] && a[1] <= a[2] && a[2] <= a[3] && a[2] <= a[4]);
} }
while (nextPermutation(data[])); while (nextPermutation(data[]));