1*627f7eb2Smrg // Written in the D programming language.
2*627f7eb2Smrg
3*627f7eb2Smrg /// Helper functions for std.algorithm package.
4*627f7eb2Smrg module std.algorithm.internal;
5*627f7eb2Smrg
6*627f7eb2Smrg
7*627f7eb2Smrg // Same as std.string.format, but "self-importing".
8*627f7eb2Smrg // Helps reduce code and imports, particularly in static asserts.
9*627f7eb2Smrg // Also helps with missing imports errors.
algoFormat()10*627f7eb2Smrg package template algoFormat()
11*627f7eb2Smrg {
12*627f7eb2Smrg import std.format : format;
13*627f7eb2Smrg alias algoFormat = format;
14*627f7eb2Smrg }
15*627f7eb2Smrg
16*627f7eb2Smrg // Internal random array generators
version(unittest)17*627f7eb2Smrg version (unittest)
18*627f7eb2Smrg {
19*627f7eb2Smrg package enum size_t maxArraySize = 50;
20*627f7eb2Smrg package enum size_t minArraySize = maxArraySize - 1;
21*627f7eb2Smrg
22*627f7eb2Smrg package string[] rndstuff(T : string)()
23*627f7eb2Smrg {
24*627f7eb2Smrg import std.random : Random, unpredictableSeed, uniform;
25*627f7eb2Smrg
26*627f7eb2Smrg static Random rnd;
27*627f7eb2Smrg static bool first = true;
28*627f7eb2Smrg if (first)
29*627f7eb2Smrg {
30*627f7eb2Smrg rnd = Random(unpredictableSeed);
31*627f7eb2Smrg first = false;
32*627f7eb2Smrg }
33*627f7eb2Smrg string[] result =
34*627f7eb2Smrg new string[uniform(minArraySize, maxArraySize, rnd)];
35*627f7eb2Smrg string alpha = "abcdefghijABCDEFGHIJ";
36*627f7eb2Smrg foreach (ref s; result)
37*627f7eb2Smrg {
38*627f7eb2Smrg foreach (i; 0 .. uniform(0u, 20u, rnd))
39*627f7eb2Smrg {
40*627f7eb2Smrg auto j = uniform(0, alpha.length - 1, rnd);
41*627f7eb2Smrg s ~= alpha[j];
42*627f7eb2Smrg }
43*627f7eb2Smrg }
44*627f7eb2Smrg return result;
45*627f7eb2Smrg }
46*627f7eb2Smrg
47*627f7eb2Smrg package int[] rndstuff(T : int)()
48*627f7eb2Smrg {
49*627f7eb2Smrg import std.random : Random, unpredictableSeed, uniform;
50*627f7eb2Smrg
51*627f7eb2Smrg static Random rnd;
52*627f7eb2Smrg static bool first = true;
53*627f7eb2Smrg if (first)
54*627f7eb2Smrg {
55*627f7eb2Smrg rnd = Random(unpredictableSeed);
56*627f7eb2Smrg first = false;
57*627f7eb2Smrg }
58*627f7eb2Smrg int[] result = new int[uniform(minArraySize, maxArraySize, rnd)];
59*627f7eb2Smrg foreach (ref i; result)
60*627f7eb2Smrg {
61*627f7eb2Smrg i = uniform(-100, 100, rnd);
62*627f7eb2Smrg }
63*627f7eb2Smrg return result;
64*627f7eb2Smrg }
65*627f7eb2Smrg
66*627f7eb2Smrg package double[] rndstuff(T : double)()
67*627f7eb2Smrg {
68*627f7eb2Smrg double[] result;
69*627f7eb2Smrg foreach (i; rndstuff!(int)())
70*627f7eb2Smrg {
71*627f7eb2Smrg result ~= i / 50.0;
72*627f7eb2Smrg }
73*627f7eb2Smrg return result;
74*627f7eb2Smrg }
75*627f7eb2Smrg }
76*627f7eb2Smrg
package(std)77*627f7eb2Smrg package(std) T* addressOf(T)(ref T val) { return &val; }
78