re2/re2/testing/string_generator.cc
Go to the documentation of this file.
1 // Copyright 2008 The RE2 Authors. All Rights Reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4 
5 // String generator: generates all possible strings of up to
6 // maxlen letters using the set of letters in alpha.
7 // Fetch strings using a Java-like Next()/HasNext() interface.
8 
9 #include <stddef.h>
10 #include <stdint.h>
11 #include <string>
12 #include <vector>
13 
14 #include "util/test.h"
15 #include "util/logging.h"
16 #include "re2/testing/string_generator.h"
17 
18 namespace re2 {
19 
21  const std::vector<std::string>& alphabet)
22  : maxlen_(maxlen), alphabet_(alphabet),
23  generate_null_(false),
24  random_(false), nrandom_(0) {
25 
26  // Degenerate case: no letters, no non-empty strings.
27  if (alphabet_.empty())
28  maxlen_ = 0;
29 
30  // Next() will return empty string (digits_ is empty).
31  hasnext_ = true;
32 }
33 
34 // Resets the string generator state to the beginning.
36  digits_.clear();
37  hasnext_ = true;
38  random_ = false;
39  nrandom_ = 0;
40  generate_null_ = false;
41 }
42 
43 // Increments the big number in digits_, returning true if successful.
44 // Returns false if all the numbers have been used.
46  // First try to increment the current number.
47  for (int i = static_cast<int>(digits_.size()) - 1; i >= 0; i--) {
48  if (++digits_[i] < static_cast<int>(alphabet_.size()))
49  return true;
50  digits_[i] = 0;
51  }
52 
53  // If that failed, make a longer number.
54  if (static_cast<int>(digits_.size()) < maxlen_) {
55  digits_.push_back(0);
56  return true;
57  }
58 
59  return false;
60 }
61 
62 // Generates random digits_, return true if successful.
63 // Returns false if the random sequence is over.
65  if (--nrandom_ <= 0)
66  return false;
67 
68  std::uniform_int_distribution<int> random_len(0, maxlen_);
69  std::uniform_int_distribution<int> random_alphabet_index(
70  0, static_cast<int>(alphabet_.size()) - 1);
71 
72  // Pick length.
73  int len = random_len(rng_);
74  digits_.resize(len);
75  for (int i = 0; i < len; i++)
76  digits_[i] = random_alphabet_index(rng_);
77  return true;
78 }
79 
80 // Returns the next string in the iteration, which is the one
81 // currently described by digits_. Calls IncrementDigits
82 // after computing the string, so that it knows the answer
83 // for subsequent HasNext() calls.
84 const StringPiece& StringGenerator::Next() {
85  CHECK(hasnext_);
86  if (generate_null_) {
87  generate_null_ = false;
88  sp_ = StringPiece();
89  return sp_;
90  }
91  s_.clear();
92  for (size_t i = 0; i < digits_.size(); i++) {
93  s_ += alphabet_[digits_[i]];
94  }
96  sp_ = s_;
97  return sp_;
98 }
99 
100 // Sets generator up to return n random strings.
101 void StringGenerator::Random(int32_t seed, int n) {
102  rng_.seed(seed);
103 
104  random_ = true;
105  nrandom_ = n;
106  hasnext_ = nrandom_ > 0;
107 }
108 
110  generate_null_ = true;
111  hasnext_ = true;
112 }
113 
115  CHECK_GE(n, 1);
116  CHECK_LE(n, 29);
117  const size_t size = size_t{1} << static_cast<size_t>(n);
118  const size_t mask = size - 1;
119  std::vector<bool> did(size, false);
120  std::string s;
121  s.reserve(static_cast<size_t>(n) + size);
122  for (size_t i = 0; i < static_cast<size_t>(n - 1); i++)
123  s += '0';
124  size_t bits = 0;
125  for (size_t i = 0; i < size; i++) {
126  bits <<= 1;
127  bits &= mask;
128  if (!did[bits | 1]) {
129  bits |= 1;
130  s += '1';
131  } else {
132  s += '0';
133  }
134  CHECK(!did[bits]);
135  did[bits] = true;
136  }
137  CHECK_EQ(s.size(), static_cast<size_t>(n - 1) + size);
138  return s;
139 }
140 
141 } // namespace re2
re2::StringGenerator::alphabet_
std::vector< std::string > alphabet_
Definition: bloaty/third_party/re2/re2/testing/string_generator.h:45
re2::StringGenerator::GenerateNULL
void GenerateNULL()
Definition: bloaty/third_party/re2/re2/testing/string_generator.cc:109
re2::StringGenerator::nrandom_
int nrandom_
Definition: bloaty/third_party/re2/re2/testing/string_generator.h:54
re2::StringGenerator::digits_
std::vector< int > digits_
Definition: bloaty/third_party/re2/re2/testing/string_generator.h:51
re2::StringGenerator::maxlen_
int maxlen_
Definition: bloaty/third_party/re2/re2/testing/string_generator.h:44
re2::StringGenerator::IncrementDigits
bool IncrementDigits()
Definition: bloaty/third_party/re2/re2/testing/string_generator.cc:45
false
#define false
Definition: setup_once.h:323
seed
static const uint8_t seed[20]
Definition: dsa_test.cc:79
CHECK_EQ
#define CHECK_EQ(a, b)
Definition: bloaty/third_party/protobuf/third_party/benchmark/src/check.h:65
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
re2::StringGenerator::random_
bool random_
Definition: bloaty/third_party/re2/re2/testing/string_generator.h:53
re2
Definition: bloaty/third_party/re2/re2/bitmap256.h:17
re2::StringGenerator::sp_
StringPiece sp_
Definition: bloaty/third_party/re2/re2/testing/string_generator.h:48
absl::FormatConversionChar::s
@ s
alphabet
static const char alphabet[]
Definition: bin_encoder.cc:30
re2::StringGenerator::rng_
std::minstd_rand0 rng_
Definition: bloaty/third_party/re2/re2/testing/string_generator.h:55
bits
OPENSSL_EXPORT ASN1_BIT_STRING * bits
Definition: x509v3.h:482
CHECK
#define CHECK(x)
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/upb.c:8085
re2::StringGenerator::Reset
void Reset()
Definition: bloaty/third_party/re2/re2/testing/string_generator.cc:35
re2::StringGenerator::Random
void Random(int32_t seed, int n)
Definition: bloaty/third_party/re2/re2/testing/string_generator.cc:101
re2::StringGenerator::StringGenerator
StringGenerator(int maxlen, const std::vector< std::string > &alphabet)
Definition: bloaty/third_party/re2/re2/testing/string_generator.cc:20
re2::StringGenerator::generate_null_
bool generate_null_
Definition: bloaty/third_party/re2/re2/testing/string_generator.h:52
n
int n
Definition: abseil-cpp/absl/container/btree_test.cc:1080
stdint.h
CHECK_GE
#define CHECK_GE(a, b)
Definition: bloaty/third_party/protobuf/third_party/benchmark/src/check.h:67
re2::DeBruijnString
static std::string DeBruijnString(int n)
Definition: bloaty/third_party/re2/re2/testing/dfa_test.cc:119
re2::StringGenerator::RandomDigits
bool RandomDigits()
Definition: bloaty/third_party/re2/re2/testing/string_generator.cc:64
re2::StringGenerator::hasnext_
bool hasnext_
Definition: bloaty/third_party/re2/re2/testing/string_generator.h:50
re2::StringGenerator::Next
const StringPiece & Next()
Definition: bloaty/third_party/re2/re2/testing/string_generator.cc:84
len
int len
Definition: abseil-cpp/absl/base/internal/low_level_alloc_test.cc:46
size
voidpf void uLong size
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
int32_t
signed int int32_t
Definition: stdint-msvc2008.h:77
re2::StringGenerator::s_
std::string s_
Definition: bloaty/third_party/re2/re2/testing/string_generator.h:49
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
CHECK_LE
#define CHECK_LE(a, b)
Definition: bloaty/third_party/protobuf/third_party/benchmark/src/check.h:68


grpc
Author(s):
autogenerated on Fri May 16 2025 03:00:21