1// Written in the D programming language.
2
3/// Helper functions for std.algorithm package.
4module std.algorithm.internal;
5
6
7// Same as std.string.format, but "self-importing".
8// Helps reduce code and imports, particularly in static asserts.
9// Also helps with missing imports errors.
10package template algoFormat()
11{
12    import std.format : format;
13    alias algoFormat = format;
14}
15
16// Internal random array generators
17version (StdUnittest)
18{
19    package enum size_t maxArraySize = 50;
20    package enum size_t minArraySize = maxArraySize - 1;
21
22    package string[] rndstuff(T : string)()
23    {
24        import std.random : Xorshift, uniform;
25
26        static rnd = Xorshift(234_567_891);
27        string[] result =
28            new string[uniform(minArraySize, maxArraySize, rnd)];
29        string alpha = "abcdefghijABCDEFGHIJ";
30        foreach (ref s; result)
31        {
32            foreach (i; 0 .. uniform(0u, 20u, rnd))
33            {
34                auto j = uniform(0, alpha.length - 1, rnd);
35                s ~= alpha[j];
36            }
37        }
38        return result;
39    }
40
41    package int[] rndstuff(T : int)()
42    {
43        import std.random : Xorshift, uniform;
44
45        static rnd = Xorshift(345_678_912);
46        int[] result = new int[uniform(minArraySize, maxArraySize, rnd)];
47        foreach (ref i; result)
48        {
49            i = uniform(-100, 100, rnd);
50        }
51        return result;
52    }
53
54    package double[] rndstuff(T : double)()
55    {
56        double[] result;
57        foreach (i; rndstuff!(int)())
58        {
59            result ~= i / 50.0;
60        }
61        return result;
62    }
63}
64
65// Used instead of `&object.member` when `member` may be
66// either a field or a @property function.
67package(std) T* addressOf(T)(ref T val) { return &val; }
68