diff options
Diffstat (limited to 're2/testing/string_generator.cc')
-rw-r--r-- | re2/testing/string_generator.cc | 41 |
1 files changed, 21 insertions, 20 deletions
diff --git a/re2/testing/string_generator.cc b/re2/testing/string_generator.cc index 5be6d3e..feef200 100644 --- a/re2/testing/string_generator.cc +++ b/re2/testing/string_generator.cc @@ -6,30 +6,31 @@ // maxlen letters using the set of letters in alpha. // Fetch strings using a Java-like Next()/HasNext() interface. +#include <stddef.h> +#include <stdint.h> #include <string> #include <vector> + #include "util/test.h" +#include "util/logging.h" #include "re2/testing/string_generator.h" namespace re2 { -StringGenerator::StringGenerator(int maxlen, const vector<string>& alphabet) +StringGenerator::StringGenerator(int maxlen, + const std::vector<string>& alphabet) : maxlen_(maxlen), alphabet_(alphabet), generate_null_(false), - random_(false), nrandom_(0), acm_(NULL) { + random_(false), nrandom_(0) { // Degenerate case: no letters, no non-empty strings. - if (alphabet_.size() == 0) + if (alphabet_.empty()) maxlen_ = 0; // Next() will return empty string (digits_ is empty). hasnext_ = true; } -StringGenerator::~StringGenerator() { - delete acm_; -} - // Resets the string generator state to the beginning. void StringGenerator::Reset() { digits_.clear(); @@ -43,14 +44,14 @@ void StringGenerator::Reset() { // Returns false if all the numbers have been used. bool StringGenerator::IncrementDigits() { // First try to increment the current number. - for (int i = digits_.size() - 1; i >= 0; i--) { - if (++digits_[i] < alphabet_.size()) + for (int i = static_cast<int>(digits_.size()) - 1; i >= 0; i--) { + if (++digits_[i] < static_cast<int>(alphabet_.size())) return true; digits_[i] = 0; } // If that failed, make a longer number. - if (digits_.size() < maxlen_) { + if (static_cast<int>(digits_.size()) < maxlen_) { digits_.push_back(0); return true; } @@ -64,11 +65,15 @@ bool StringGenerator::RandomDigits() { if (--nrandom_ <= 0) return false; + std::uniform_int_distribution<int> random_len(0, maxlen_); + std::uniform_int_distribution<int> random_alphabet_index( + 0, static_cast<int>(alphabet_.size()) - 1); + // Pick length. - int len = acm_->Uniform(maxlen_+1); + int len = random_len(rng_); digits_.resize(len); for (int i = 0; i < len; i++) - digits_[i] = acm_->Uniform(alphabet_.size()); + digits_[i] = random_alphabet_index(rng_); return true; } @@ -80,11 +85,11 @@ const StringPiece& StringGenerator::Next() { CHECK(hasnext_); if (generate_null_) { generate_null_ = false; - sp_ = NULL; + sp_ = StringPiece(); return sp_; } s_.clear(); - for (int i = 0; i < digits_.size(); i++) { + for (size_t i = 0; i < digits_.size(); i++) { s_ += alphabet_[digits_[i]]; } hasnext_ = random_ ? RandomDigits() : IncrementDigits(); @@ -93,11 +98,8 @@ const StringPiece& StringGenerator::Next() { } // Sets generator up to return n random strings. -void StringGenerator::Random(int32 seed, int n) { - if (acm_ == NULL) - acm_ = new ACMRandom(seed); - else - acm_->Reset(seed); +void StringGenerator::Random(int32_t seed, int n) { + rng_.seed(seed); random_ = true; nrandom_ = n; @@ -110,4 +112,3 @@ void StringGenerator::GenerateNULL() { } } // namespace re2 - |