xref: /netbsd-src/external/apache2/llvm/dist/libcxx/benchmarks/GenerateInput.h (revision 4d6fc14bc9b0c5bf3e30be318c143ee82cadd108)
1*4d6fc14bSjoerg #ifndef BENCHMARK_GENERATE_INPUT_H
2*4d6fc14bSjoerg #define BENCHMARK_GENERATE_INPUT_H
3*4d6fc14bSjoerg 
4*4d6fc14bSjoerg #include <algorithm>
5*4d6fc14bSjoerg #include <random>
6*4d6fc14bSjoerg #include <vector>
7*4d6fc14bSjoerg #include <string>
8*4d6fc14bSjoerg #include <climits>
9*4d6fc14bSjoerg #include <cstddef>
10*4d6fc14bSjoerg 
11*4d6fc14bSjoerg static const char Letters[] = {
12*4d6fc14bSjoerg     '0','1','2','3','4',
13*4d6fc14bSjoerg     '5','6','7','8','9',
14*4d6fc14bSjoerg     'A','B','C','D','E','F',
15*4d6fc14bSjoerg     'G','H','I','J','K',
16*4d6fc14bSjoerg     'L','M','N','O','P',
17*4d6fc14bSjoerg     'Q','R','S','T','U',
18*4d6fc14bSjoerg     'V','W','X','Y','Z',
19*4d6fc14bSjoerg     'a','b','c','d','e','f',
20*4d6fc14bSjoerg     'g','h','i','j','k',
21*4d6fc14bSjoerg     'l','m','n','o','p',
22*4d6fc14bSjoerg     'q','r','s','t','u',
23*4d6fc14bSjoerg     'v','w','x','y','z'
24*4d6fc14bSjoerg };
25*4d6fc14bSjoerg static const std::size_t LettersSize = sizeof(Letters);
26*4d6fc14bSjoerg 
getRandomEngine()27*4d6fc14bSjoerg inline std::default_random_engine& getRandomEngine() {
28*4d6fc14bSjoerg     static std::default_random_engine RandEngine(std::random_device{}());
29*4d6fc14bSjoerg     return RandEngine;
30*4d6fc14bSjoerg }
31*4d6fc14bSjoerg 
32*4d6fc14bSjoerg 
getRandomChar()33*4d6fc14bSjoerg inline char getRandomChar() {
34*4d6fc14bSjoerg     std::uniform_int_distribution<> LettersDist(0, LettersSize-1);
35*4d6fc14bSjoerg     return Letters[LettersDist(getRandomEngine())];
36*4d6fc14bSjoerg }
37*4d6fc14bSjoerg 
38*4d6fc14bSjoerg template <class IntT>
39*4d6fc14bSjoerg inline IntT getRandomInteger(IntT Min = 0,
40*4d6fc14bSjoerg                              IntT Max = std::numeric_limits<IntT>::max()) {
41*4d6fc14bSjoerg     std::uniform_int_distribution<IntT> dist(Min, Max);
42*4d6fc14bSjoerg     return dist(getRandomEngine());
43*4d6fc14bSjoerg }
44*4d6fc14bSjoerg 
getRandomString(std::size_t Len)45*4d6fc14bSjoerg inline std::string getRandomString(std::size_t Len) {
46*4d6fc14bSjoerg     std::string str(Len, 0);
47*4d6fc14bSjoerg     std::generate_n(str.begin(), Len, &getRandomChar);
48*4d6fc14bSjoerg     return str;
49*4d6fc14bSjoerg }
50*4d6fc14bSjoerg 
51*4d6fc14bSjoerg template <class IntT>
getDuplicateIntegerInputs(size_t N)52*4d6fc14bSjoerg inline std::vector<IntT> getDuplicateIntegerInputs(size_t N) {
53*4d6fc14bSjoerg     std::vector<IntT> inputs(N, static_cast<IntT>(-1));
54*4d6fc14bSjoerg     return inputs;
55*4d6fc14bSjoerg }
56*4d6fc14bSjoerg 
57*4d6fc14bSjoerg template <class IntT>
getSortedIntegerInputs(size_t N)58*4d6fc14bSjoerg inline std::vector<IntT> getSortedIntegerInputs(size_t N) {
59*4d6fc14bSjoerg     std::vector<IntT> inputs;
60*4d6fc14bSjoerg     for (size_t i=0; i < N; i += 1)
61*4d6fc14bSjoerg         inputs.push_back(i);
62*4d6fc14bSjoerg     return inputs;
63*4d6fc14bSjoerg }
64*4d6fc14bSjoerg 
65*4d6fc14bSjoerg template <class IntT>
getSortedLargeIntegerInputs(size_t N)66*4d6fc14bSjoerg std::vector<IntT> getSortedLargeIntegerInputs(size_t N) {
67*4d6fc14bSjoerg     std::vector<IntT> inputs;
68*4d6fc14bSjoerg     for (size_t i=0; i < N; ++i) {
69*4d6fc14bSjoerg         inputs.push_back(i + N);
70*4d6fc14bSjoerg     }
71*4d6fc14bSjoerg     return inputs;
72*4d6fc14bSjoerg }
73*4d6fc14bSjoerg 
74*4d6fc14bSjoerg template <class IntT>
getSortedTopBitsIntegerInputs(size_t N)75*4d6fc14bSjoerg std::vector<IntT> getSortedTopBitsIntegerInputs(size_t N) {
76*4d6fc14bSjoerg     std::vector<IntT> inputs = getSortedIntegerInputs<IntT>(N);
77*4d6fc14bSjoerg     for (auto& E : inputs) E <<= ((sizeof(IntT) / 2) * CHAR_BIT);
78*4d6fc14bSjoerg     return inputs;
79*4d6fc14bSjoerg }
80*4d6fc14bSjoerg 
81*4d6fc14bSjoerg template <class IntT>
getReverseSortedIntegerInputs(size_t N)82*4d6fc14bSjoerg inline std::vector<IntT> getReverseSortedIntegerInputs(size_t N) {
83*4d6fc14bSjoerg     std::vector<IntT> inputs;
84*4d6fc14bSjoerg     std::size_t i = N;
85*4d6fc14bSjoerg     while (i > 0) {
86*4d6fc14bSjoerg         --i;
87*4d6fc14bSjoerg         inputs.push_back(i);
88*4d6fc14bSjoerg     }
89*4d6fc14bSjoerg     return inputs;
90*4d6fc14bSjoerg }
91*4d6fc14bSjoerg 
92*4d6fc14bSjoerg template <class IntT>
getPipeOrganIntegerInputs(size_t N)93*4d6fc14bSjoerg std::vector<IntT> getPipeOrganIntegerInputs(size_t N) {
94*4d6fc14bSjoerg     std::vector<IntT> v; v.reserve(N);
95*4d6fc14bSjoerg     for (size_t i = 0; i < N/2; ++i) v.push_back(i);
96*4d6fc14bSjoerg     for (size_t i = N/2; i < N; ++i) v.push_back(N - i);
97*4d6fc14bSjoerg     return v;
98*4d6fc14bSjoerg }
99*4d6fc14bSjoerg 
100*4d6fc14bSjoerg 
101*4d6fc14bSjoerg template <class IntT>
getRandomIntegerInputs(size_t N)102*4d6fc14bSjoerg std::vector<IntT> getRandomIntegerInputs(size_t N) {
103*4d6fc14bSjoerg     std::vector<IntT> inputs;
104*4d6fc14bSjoerg     for (size_t i=0; i < N; ++i) {
105*4d6fc14bSjoerg         inputs.push_back(getRandomInteger<IntT>());
106*4d6fc14bSjoerg     }
107*4d6fc14bSjoerg     return inputs;
108*4d6fc14bSjoerg }
109*4d6fc14bSjoerg 
getDuplicateStringInputs(size_t N)110*4d6fc14bSjoerg inline std::vector<std::string> getDuplicateStringInputs(size_t N) {
111*4d6fc14bSjoerg     std::vector<std::string> inputs(N, getRandomString(1024));
112*4d6fc14bSjoerg     return inputs;
113*4d6fc14bSjoerg }
114*4d6fc14bSjoerg 
getRandomStringInputs(size_t N)115*4d6fc14bSjoerg inline std::vector<std::string> getRandomStringInputs(size_t N) {
116*4d6fc14bSjoerg     std::vector<std::string> inputs;
117*4d6fc14bSjoerg     for (size_t i=0; i < N; ++i) {
118*4d6fc14bSjoerg         inputs.push_back(getRandomString(1024));
119*4d6fc14bSjoerg     }
120*4d6fc14bSjoerg     return inputs;
121*4d6fc14bSjoerg }
122*4d6fc14bSjoerg 
getSortedStringInputs(size_t N)123*4d6fc14bSjoerg inline std::vector<std::string> getSortedStringInputs(size_t N) {
124*4d6fc14bSjoerg     std::vector<std::string> inputs = getRandomStringInputs(N);
125*4d6fc14bSjoerg     std::sort(inputs.begin(), inputs.end());
126*4d6fc14bSjoerg     return inputs;
127*4d6fc14bSjoerg }
128*4d6fc14bSjoerg 
getReverseSortedStringInputs(size_t N)129*4d6fc14bSjoerg inline std::vector<std::string> getReverseSortedStringInputs(size_t N) {
130*4d6fc14bSjoerg     std::vector<std::string> inputs = getSortedStringInputs(N);
131*4d6fc14bSjoerg     std::reverse(inputs.begin(), inputs.end());
132*4d6fc14bSjoerg     return inputs;
133*4d6fc14bSjoerg }
134*4d6fc14bSjoerg 
getRandomCStringInputs(size_t N)135*4d6fc14bSjoerg inline std::vector<const char*> getRandomCStringInputs(size_t N) {
136*4d6fc14bSjoerg     static std::vector<std::string> inputs = getRandomStringInputs(N);
137*4d6fc14bSjoerg     std::vector<const char*> cinputs;
138*4d6fc14bSjoerg     for (auto const& str : inputs)
139*4d6fc14bSjoerg         cinputs.push_back(str.c_str());
140*4d6fc14bSjoerg     return cinputs;
141*4d6fc14bSjoerg }
142*4d6fc14bSjoerg 
143*4d6fc14bSjoerg 
144*4d6fc14bSjoerg #endif // BENCHMARK_GENERATE_INPUT_H
145