xref: /netbsd-src/external/gpl3/gcc/dist/libphobos/src/std/algorithm/internal.d (revision b1e838363e3c6fc78a55519254d99869742dd33c)
1181254a7Smrg // Written in the D programming language.
2181254a7Smrg 
3181254a7Smrg /// Helper functions for std.algorithm package.
4181254a7Smrg module std.algorithm.internal;
5181254a7Smrg 
6181254a7Smrg 
7181254a7Smrg // Same as std.string.format, but "self-importing".
8181254a7Smrg // Helps reduce code and imports, particularly in static asserts.
9181254a7Smrg // Also helps with missing imports errors.
algoFormat()10181254a7Smrg package template algoFormat()
11181254a7Smrg {
12181254a7Smrg     import std.format : format;
13181254a7Smrg     alias algoFormat = format;
14181254a7Smrg }
15181254a7Smrg 
16181254a7Smrg // Internal random array generators
version(StdUnittest)17*b1e83836Smrg version (StdUnittest)
18181254a7Smrg {
19181254a7Smrg     package enum size_t maxArraySize = 50;
20181254a7Smrg     package enum size_t minArraySize = maxArraySize - 1;
21181254a7Smrg 
22181254a7Smrg     package string[] rndstuff(T : string)()
23181254a7Smrg     {
24*b1e83836Smrg         import std.random : Xorshift, uniform;
25181254a7Smrg 
26*b1e83836Smrg         static rnd = Xorshift(234_567_891);
27181254a7Smrg         string[] result =
28181254a7Smrg             new string[uniform(minArraySize, maxArraySize, rnd)];
29181254a7Smrg         string alpha = "abcdefghijABCDEFGHIJ";
30181254a7Smrg         foreach (ref s; result)
31181254a7Smrg         {
32181254a7Smrg             foreach (i; 0 .. uniform(0u, 20u, rnd))
33181254a7Smrg             {
34181254a7Smrg                 auto j = uniform(0, alpha.length - 1, rnd);
35181254a7Smrg                 s ~= alpha[j];
36181254a7Smrg             }
37181254a7Smrg         }
38181254a7Smrg         return result;
39181254a7Smrg     }
40181254a7Smrg 
41181254a7Smrg     package int[] rndstuff(T : int)()
42181254a7Smrg     {
43*b1e83836Smrg         import std.random : Xorshift, uniform;
44181254a7Smrg 
45*b1e83836Smrg         static rnd = Xorshift(345_678_912);
46181254a7Smrg         int[] result = new int[uniform(minArraySize, maxArraySize, rnd)];
47181254a7Smrg         foreach (ref i; result)
48181254a7Smrg         {
49181254a7Smrg             i = uniform(-100, 100, rnd);
50181254a7Smrg         }
51181254a7Smrg         return result;
52181254a7Smrg     }
53181254a7Smrg 
54181254a7Smrg     package double[] rndstuff(T : double)()
55181254a7Smrg     {
56181254a7Smrg         double[] result;
57181254a7Smrg         foreach (i; rndstuff!(int)())
58181254a7Smrg         {
59181254a7Smrg             result ~= i / 50.0;
60181254a7Smrg         }
61181254a7Smrg         return result;
62181254a7Smrg     }
63181254a7Smrg }
64181254a7Smrg 
65*b1e83836Smrg // Used instead of `&object.member` when `member` may be
66*b1e83836Smrg // either a field or a @property function.
package(std)67181254a7Smrg package(std) T* addressOf(T)(ref T val) { return &val; }
68