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