xref: /netbsd-src/external/gpl3/gcc.old/dist/libphobos/src/std/algorithm/internal.d (revision 627f7eb200a4419d89b531d55fccd2ee3ffdcde0)
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