146035553Spatrick #ifndef BENCHMARK_GENERATE_INPUT_H
246035553Spatrick #define BENCHMARK_GENERATE_INPUT_H
346035553Spatrick 
446035553Spatrick #include <algorithm>
546035553Spatrick #include <random>
646035553Spatrick #include <vector>
746035553Spatrick #include <string>
846035553Spatrick #include <climits>
946035553Spatrick #include <cstddef>
1046035553Spatrick 
1146035553Spatrick static const char Letters[] = {
1246035553Spatrick     '0','1','2','3','4',
1346035553Spatrick     '5','6','7','8','9',
1446035553Spatrick     'A','B','C','D','E','F',
1546035553Spatrick     'G','H','I','J','K',
1646035553Spatrick     'L','M','N','O','P',
1746035553Spatrick     'Q','R','S','T','U',
1846035553Spatrick     'V','W','X','Y','Z',
1946035553Spatrick     'a','b','c','d','e','f',
2046035553Spatrick     'g','h','i','j','k',
2146035553Spatrick     'l','m','n','o','p',
2246035553Spatrick     'q','r','s','t','u',
2346035553Spatrick     'v','w','x','y','z'
2446035553Spatrick };
2546035553Spatrick static const std::size_t LettersSize = sizeof(Letters);
2646035553Spatrick 
getRandomEngine()2746035553Spatrick inline std::default_random_engine& getRandomEngine() {
2846035553Spatrick     static std::default_random_engine RandEngine(std::random_device{}());
2946035553Spatrick     return RandEngine;
3046035553Spatrick }
3146035553Spatrick 
3246035553Spatrick 
getRandomChar()3346035553Spatrick inline char getRandomChar() {
3446035553Spatrick     std::uniform_int_distribution<> LettersDist(0, LettersSize-1);
3546035553Spatrick     return Letters[LettersDist(getRandomEngine())];
3646035553Spatrick }
3746035553Spatrick 
3846035553Spatrick template <class IntT>
getRandomInteger(IntT Min,IntT Max)39*4bdff4beSrobert inline IntT getRandomInteger(IntT Min, IntT Max) {
40*4bdff4beSrobert     std::uniform_int_distribution<unsigned long long> dist(Min, Max);
41*4bdff4beSrobert     return static_cast<IntT>(dist(getRandomEngine()));
4246035553Spatrick }
4346035553Spatrick 
getRandomString(std::size_t Len)4446035553Spatrick inline std::string getRandomString(std::size_t Len) {
4546035553Spatrick     std::string str(Len, 0);
4646035553Spatrick     std::generate_n(str.begin(), Len, &getRandomChar);
4746035553Spatrick     return str;
4846035553Spatrick }
4946035553Spatrick 
5046035553Spatrick template <class IntT>
getDuplicateIntegerInputs(size_t N)5146035553Spatrick inline std::vector<IntT> getDuplicateIntegerInputs(size_t N) {
5246035553Spatrick     std::vector<IntT> inputs(N, static_cast<IntT>(-1));
5346035553Spatrick     return inputs;
5446035553Spatrick }
5546035553Spatrick 
5646035553Spatrick template <class IntT>
getSortedIntegerInputs(size_t N)5746035553Spatrick inline std::vector<IntT> getSortedIntegerInputs(size_t N) {
5846035553Spatrick     std::vector<IntT> inputs;
5946035553Spatrick     for (size_t i=0; i < N; i += 1)
6046035553Spatrick         inputs.push_back(i);
6146035553Spatrick     return inputs;
6246035553Spatrick }
6346035553Spatrick 
6446035553Spatrick template <class IntT>
getSortedLargeIntegerInputs(size_t N)6546035553Spatrick std::vector<IntT> getSortedLargeIntegerInputs(size_t N) {
6646035553Spatrick     std::vector<IntT> inputs;
6746035553Spatrick     for (size_t i=0; i < N; ++i) {
6846035553Spatrick         inputs.push_back(i + N);
6946035553Spatrick     }
7046035553Spatrick     return inputs;
7146035553Spatrick }
7246035553Spatrick 
7346035553Spatrick template <class IntT>
getSortedTopBitsIntegerInputs(size_t N)7446035553Spatrick std::vector<IntT> getSortedTopBitsIntegerInputs(size_t N) {
7546035553Spatrick     std::vector<IntT> inputs = getSortedIntegerInputs<IntT>(N);
7646035553Spatrick     for (auto& E : inputs) E <<= ((sizeof(IntT) / 2) * CHAR_BIT);
7746035553Spatrick     return inputs;
7846035553Spatrick }
7946035553Spatrick 
8046035553Spatrick template <class IntT>
getReverseSortedIntegerInputs(size_t N)8146035553Spatrick inline std::vector<IntT> getReverseSortedIntegerInputs(size_t N) {
8246035553Spatrick     std::vector<IntT> inputs;
8346035553Spatrick     std::size_t i = N;
8446035553Spatrick     while (i > 0) {
8546035553Spatrick         --i;
8646035553Spatrick         inputs.push_back(i);
8746035553Spatrick     }
8846035553Spatrick     return inputs;
8946035553Spatrick }
9046035553Spatrick 
9146035553Spatrick template <class IntT>
getPipeOrganIntegerInputs(size_t N)9246035553Spatrick std::vector<IntT> getPipeOrganIntegerInputs(size_t N) {
9346035553Spatrick     std::vector<IntT> v; v.reserve(N);
9446035553Spatrick     for (size_t i = 0; i < N/2; ++i) v.push_back(i);
9546035553Spatrick     for (size_t i = N/2; i < N; ++i) v.push_back(N - i);
9646035553Spatrick     return v;
9746035553Spatrick }
9846035553Spatrick 
9946035553Spatrick 
10046035553Spatrick template <class IntT>
getRandomIntegerInputs(size_t N)10146035553Spatrick std::vector<IntT> getRandomIntegerInputs(size_t N) {
10246035553Spatrick     std::vector<IntT> inputs;
10346035553Spatrick     for (size_t i=0; i < N; ++i) {
104*4bdff4beSrobert         inputs.push_back(getRandomInteger<IntT>(0, std::numeric_limits<IntT>::max()));
10546035553Spatrick     }
10646035553Spatrick     return inputs;
10746035553Spatrick }
10846035553Spatrick 
getDuplicateStringInputs(size_t N)10946035553Spatrick inline std::vector<std::string> getDuplicateStringInputs(size_t N) {
11046035553Spatrick     std::vector<std::string> inputs(N, getRandomString(1024));
11146035553Spatrick     return inputs;
11246035553Spatrick }
11346035553Spatrick 
getRandomStringInputs(size_t N)11446035553Spatrick inline std::vector<std::string> getRandomStringInputs(size_t N) {
11546035553Spatrick     std::vector<std::string> inputs;
11646035553Spatrick     for (size_t i=0; i < N; ++i) {
11746035553Spatrick         inputs.push_back(getRandomString(1024));
11846035553Spatrick     }
11946035553Spatrick     return inputs;
12046035553Spatrick }
12146035553Spatrick 
getSortedStringInputs(size_t N)12246035553Spatrick inline std::vector<std::string> getSortedStringInputs(size_t N) {
12346035553Spatrick     std::vector<std::string> inputs = getRandomStringInputs(N);
12446035553Spatrick     std::sort(inputs.begin(), inputs.end());
12546035553Spatrick     return inputs;
12646035553Spatrick }
12746035553Spatrick 
getReverseSortedStringInputs(size_t N)12846035553Spatrick inline std::vector<std::string> getReverseSortedStringInputs(size_t N) {
12946035553Spatrick     std::vector<std::string> inputs = getSortedStringInputs(N);
13046035553Spatrick     std::reverse(inputs.begin(), inputs.end());
13146035553Spatrick     return inputs;
13246035553Spatrick }
13346035553Spatrick 
getRandomCStringInputs(size_t N)13446035553Spatrick inline std::vector<const char*> getRandomCStringInputs(size_t N) {
13546035553Spatrick     static std::vector<std::string> inputs = getRandomStringInputs(N);
13646035553Spatrick     std::vector<const char*> cinputs;
13746035553Spatrick     for (auto const& str : inputs)
13846035553Spatrick         cinputs.push_back(str.c_str());
13946035553Spatrick     return cinputs;
14046035553Spatrick }
14146035553Spatrick 
14246035553Spatrick 
14346035553Spatrick #endif // BENCHMARK_GENERATE_INPUT_H
144