111 lines
2.0 KiB
D
111 lines
2.0 KiB
D
module util;
|
|
|
|
public import core.experimental.array : rcarray;
|
|
public import std.container : StdArray = Array;
|
|
public import containers : EMSIArray = DynamicArray;
|
|
public import stdx.collections.array : StdxArray = Array;
|
|
|
|
public import core.experimental.array : make;
|
|
|
|
T make(T : U[], U)()
|
|
{
|
|
return [];
|
|
}
|
|
|
|
T make(T : StdArray!U, U)()
|
|
{
|
|
enum U[] empty = [];
|
|
|
|
import std.container : stdMake = make;
|
|
return stdMake!T(empty);
|
|
}
|
|
|
|
T make(T : EMSIArray!U, U)()
|
|
{
|
|
return T();
|
|
}
|
|
|
|
T make(T : StdxArray!U, U)()
|
|
{
|
|
return T();
|
|
}
|
|
|
|
T makeAndInsert(size_t size, T)()
|
|
{
|
|
T t = make!T();
|
|
|
|
static foreach (i; 0 .. size)
|
|
{
|
|
t ~= 42;
|
|
}
|
|
|
|
return t;
|
|
}
|
|
|
|
T[2] makeAndInsert2(size_t totalSize, T)()
|
|
{
|
|
T a = make!T();
|
|
T b = make!T();
|
|
|
|
static foreach (i; 0 .. totalSize / 2)
|
|
{
|
|
a ~= 1;
|
|
b ~= 2;
|
|
}
|
|
|
|
return [a, b];
|
|
}
|
|
|
|
import core.time : Duration;
|
|
import std.datetime.stopwatch : StopWatch, AutoStart;
|
|
Duration[funs.length / 2] benchmarkWithSetup(funs...)(uint n)
|
|
{
|
|
Duration[funs.length / 2] result;
|
|
|
|
auto sw = StopWatch(AutoStart.no);
|
|
|
|
static foreach (i; 0 .. funs.length / 2)
|
|
{{
|
|
alias fun = funs[i * 2];
|
|
alias setup = funs[i * 2 + 1];
|
|
|
|
sw.reset();
|
|
foreach (_; 0 .. n)
|
|
{
|
|
static if (is(typeof(setup()) == void))
|
|
{
|
|
sw.start();
|
|
fun();
|
|
}
|
|
else
|
|
{
|
|
auto setupResult = setup();
|
|
sw.start();
|
|
fun(setupResult);
|
|
}
|
|
|
|
sw.stop();
|
|
}
|
|
result[i] = sw.peek();
|
|
}}
|
|
|
|
return result;
|
|
}
|
|
|
|
template Transpose(size_t N, alias A, Args...)
|
|
{
|
|
import std.meta : AliasSeq;
|
|
static assert(N == 2);
|
|
|
|
static if (Args.length == 1)
|
|
{
|
|
alias Transpose = AliasSeq!(A, Args[0]);
|
|
}
|
|
else
|
|
{
|
|
alias Transpose = AliasSeq!(A, Args[(Args.length - 1) / 2], Transpose!(N, Args[0], Args[1 .. (Args.length - 1) / 2], Args[(Args.length - 1) / 2 + 1 .. $]));
|
|
}
|
|
}
|
|
|
|
void noSetup(T)() {}
|