// Written in the D programming language. /// Helper functions for std.algorithm package.module std.algorithm.internal; // Same as std.string.format, but "self-importing".// Helps reduce code and imports, particularly in static asserts.// Also helps with missing imports errors.package template algoFormat(){ import std.format : format; alias algoFormat = format;} // Internal random array generatorsversion (StdUnittest){ package enum size_t maxArraySize = 50; package enum size_t minArraySize = maxArraySize - 1; package string[] rndstuff(T : string)() { import std.random : Xorshift, uniform; static rnd = Xorshift(234_567_891); string[] result = new string[uniform(minArraySize, maxArraySize, rnd)]; string alpha = "abcdefghijABCDEFGHIJ"; foreach (ref s; result) { foreach (i; 0 .. uniform(0u, 20u, rnd)) { auto j = uniform(0, alpha.length - 1, rnd); s ~= alpha[j]; } } return result; } package int[] rndstuff(T : int)() { import std.random : Xorshift, uniform; static rnd = Xorshift(345_678_912); int[] result = new int[uniform(minArraySize, maxArraySize, rnd)]; foreach (ref i; result) { i = uniform(-100, 100, rnd); } return result; } package double[] rndstuff(T : double)() { double[] result; foreach (i; rndstuff!(int)()) { result ~= i / 50.0; } return result; }} // Used instead of `&object.member` when `member` may be// either a field or a @property function.package(std) T* addressOf(T)(ref T val) { return &val; }
// Written in the D programming language.
/// Helper functions for std.algorithm package.
module std.algorithm.internal;
// Same as std.string.format, but "self-importing".
// Helps reduce code and imports, particularly in static asserts.
// Also helps with missing imports errors.
package template algoFormat()
{
import std.format : format;
alias algoFormat = format;
}
// Internal random array generators
version (StdUnittest)
{
package enum size_t maxArraySize = 50;
package enum size_t minArraySize = maxArraySize - 1;
package string[] rndstuff(T : string)()
{
import std.random : Xorshift, uniform;
static rnd = Xorshift(234_567_891);
string[] result =
new string[uniform(minArraySize, maxArraySize, rnd)];
string alpha = "abcdefghijABCDEFGHIJ";
foreach (ref s; result)
{
foreach (i; 0 .. uniform(0u, 20u, rnd))
{
auto j = uniform(0, alpha.length - 1, rnd);
s ~= alpha[j];
}
}
return result;
}
package int[] rndstuff(T : int)()
{
import std.random : Xorshift, uniform;
static rnd = Xorshift(345_678_912);
int[] result = new int[uniform(minArraySize, maxArraySize, rnd)];
foreach (ref i; result)
{
i = uniform(-100, 100, rnd);
}
return result;
}
package double[] rndstuff(T : double)()
{
double[] result;
foreach (i; rndstuff!(int)())
{
result ~= i / 50.0;
}
return result;
}
}
// Used instead of `&object.member` when `member` may be
// either a field or a @property function.
package(std) T* addressOf(T)(ref T val) { return &val; }