|
| 1 | +#include "atoi.h" |
| 2 | + |
1 | 3 | #include <vector> |
2 | 4 | #include <string> |
| 5 | +#include <cstring> |
3 | 6 | #include <random> |
4 | 7 |
|
5 | 8 | struct Corpus8DecimalDigits { |
@@ -63,8 +66,67 @@ struct Corpus8DecimalDigits { |
63 | 66 | X(Zoo, lemire_as_zoo_swar)\ |
64 | 67 | X(LIBC, atoi) |
65 | 68 |
|
| 69 | +struct CorpusStringLength { |
| 70 | + std::vector<int> skips_; |
| 71 | + std::string characters_; |
| 72 | + |
| 73 | + CorpusStringLength(std::vector<int> &&skips, std::string &&cs): |
| 74 | + skips_{std::move(skips)}, characters_{std::move(cs)} |
| 75 | + {} |
| 76 | + |
| 77 | + template<typename G> |
| 78 | + static auto makeCorpus(G &generator) { |
| 79 | + auto count = 1031; // see Corpus8DecimalDigits for why 1031 |
| 80 | + std::vector<int> sizes; |
| 81 | + std::string allCharacters; |
| 82 | + std::uniform_int_distribution<> strSize(0, 101); // again a prime |
| 83 | + std::uniform_int_distribution<> characters(1, 255); // notice 0 excluded |
| 84 | + |
| 85 | + for(;;) { |
| 86 | + auto length = strSize(generator); |
| 87 | + sizes.push_back(length); |
| 88 | + for(auto i = length; i--; ) { |
| 89 | + allCharacters.append(1, characters(generator)); |
| 90 | + } |
| 91 | + allCharacters.append(1, '\0'); |
| 92 | + } |
| 93 | + return CorpusStringLength(std::move(sizes), std::move(allCharacters)); |
| 94 | + } |
| 95 | + |
| 96 | + struct Iterator { |
| 97 | + int *skips, *sentinel; |
| 98 | + char *cp; |
| 99 | + |
| 100 | + Iterator &operator++() { |
| 101 | + cp += *skips++; |
| 102 | + return *this; |
| 103 | + } |
| 104 | + |
| 105 | + char *operator*() { |
| 106 | + return cp; |
| 107 | + } |
| 108 | + |
| 109 | + auto next() noexcept { |
| 110 | + ++(*this); |
| 111 | + return sentinel != skips; |
| 112 | + } |
| 113 | + }; |
| 114 | + |
| 115 | + Iterator commence() { |
| 116 | + return { |
| 117 | + skips_.data(), skips_.data() + skips_.size(), characters_.data() |
| 118 | + }; |
| 119 | + } |
| 120 | +}; |
| 121 | + |
| 122 | +#define STRLEN_CORPUS_X_LIST \ |
| 123 | + X(LIBC_STRLEN, strlen) \ |
| 124 | + X(ZOO_BEST_STRLEN, zoo::c_strLength) \ |
| 125 | + X(ZOO_NATURAL_STRLEN, zoo::c_strLength_MoreNaturalButSlightlyWorse) |
| 126 | + |
66 | 127 | #define X(Typename, FunctionToCall) \ |
67 | 128 | struct Invoke##Typename { int operator()(const char *p) { return FunctionToCall(p); } }; |
68 | 129 |
|
69 | 130 | PARSE8BYTES_CORPUS_X_LIST |
| 131 | +STRLEN_CORPUS_X_LIST |
70 | 132 | #undef X |
0 commit comments