collections-benchmark/source/util.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)() {}