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