xref: /aosp_15_r20/external/regex-re2/re2/testing/string_generator.h (revision ccdc9c3e24c519bfa4832a66aa2e83a52c19f295)
1*ccdc9c3eSSadaf Ebrahimi // Copyright 2008 The RE2 Authors.  All Rights Reserved.
2*ccdc9c3eSSadaf Ebrahimi // Use of this source code is governed by a BSD-style
3*ccdc9c3eSSadaf Ebrahimi // license that can be found in the LICENSE file.
4*ccdc9c3eSSadaf Ebrahimi 
5*ccdc9c3eSSadaf Ebrahimi #ifndef RE2_TESTING_STRING_GENERATOR_H_
6*ccdc9c3eSSadaf Ebrahimi #define RE2_TESTING_STRING_GENERATOR_H_
7*ccdc9c3eSSadaf Ebrahimi 
8*ccdc9c3eSSadaf Ebrahimi // String generator: generates all possible strings of up to
9*ccdc9c3eSSadaf Ebrahimi // maxlen letters using the set of letters in alpha.
10*ccdc9c3eSSadaf Ebrahimi // Fetch strings using a Java-like Next()/HasNext() interface.
11*ccdc9c3eSSadaf Ebrahimi 
12*ccdc9c3eSSadaf Ebrahimi #include <stdint.h>
13*ccdc9c3eSSadaf Ebrahimi #include <random>
14*ccdc9c3eSSadaf Ebrahimi #include <string>
15*ccdc9c3eSSadaf Ebrahimi #include <vector>
16*ccdc9c3eSSadaf Ebrahimi 
17*ccdc9c3eSSadaf Ebrahimi #include "util/util.h"
18*ccdc9c3eSSadaf Ebrahimi #include "re2/stringpiece.h"
19*ccdc9c3eSSadaf Ebrahimi 
20*ccdc9c3eSSadaf Ebrahimi namespace re2 {
21*ccdc9c3eSSadaf Ebrahimi 
22*ccdc9c3eSSadaf Ebrahimi class StringGenerator {
23*ccdc9c3eSSadaf Ebrahimi  public:
24*ccdc9c3eSSadaf Ebrahimi   StringGenerator(int maxlen, const std::vector<string>& alphabet);
~StringGenerator()25*ccdc9c3eSSadaf Ebrahimi   ~StringGenerator() {}
26*ccdc9c3eSSadaf Ebrahimi 
27*ccdc9c3eSSadaf Ebrahimi   const StringPiece& Next();
HasNext()28*ccdc9c3eSSadaf Ebrahimi   bool HasNext() { return hasnext_; }
29*ccdc9c3eSSadaf Ebrahimi 
30*ccdc9c3eSSadaf Ebrahimi   // Resets generator to start sequence over.
31*ccdc9c3eSSadaf Ebrahimi   void Reset();
32*ccdc9c3eSSadaf Ebrahimi 
33*ccdc9c3eSSadaf Ebrahimi   // Causes generator to emit random strings for next n calls to Next().
34*ccdc9c3eSSadaf Ebrahimi   void Random(int32_t seed, int n);
35*ccdc9c3eSSadaf Ebrahimi 
36*ccdc9c3eSSadaf Ebrahimi   // Causes generator to emit a NULL as the next call.
37*ccdc9c3eSSadaf Ebrahimi   void GenerateNULL();
38*ccdc9c3eSSadaf Ebrahimi 
39*ccdc9c3eSSadaf Ebrahimi  private:
40*ccdc9c3eSSadaf Ebrahimi   bool IncrementDigits();
41*ccdc9c3eSSadaf Ebrahimi   bool RandomDigits();
42*ccdc9c3eSSadaf Ebrahimi 
43*ccdc9c3eSSadaf Ebrahimi   // Global state.
44*ccdc9c3eSSadaf Ebrahimi   int maxlen_;                    // Maximum length string to generate.
45*ccdc9c3eSSadaf Ebrahimi   std::vector<string> alphabet_;  // Alphabet, one string per letter.
46*ccdc9c3eSSadaf Ebrahimi 
47*ccdc9c3eSSadaf Ebrahimi   // Iteration state.
48*ccdc9c3eSSadaf Ebrahimi   StringPiece sp_;           // Last StringPiece returned by Next().
49*ccdc9c3eSSadaf Ebrahimi   string s_;                 // String data in last StringPiece returned by Next().
50*ccdc9c3eSSadaf Ebrahimi   bool hasnext_;             // Whether Next() can be called again.
51*ccdc9c3eSSadaf Ebrahimi   std::vector<int> digits_;  // Alphabet indices for next string.
52*ccdc9c3eSSadaf Ebrahimi   bool generate_null_;       // Whether to generate a NULL StringPiece next.
53*ccdc9c3eSSadaf Ebrahimi   bool random_;              // Whether generated strings are random.
54*ccdc9c3eSSadaf Ebrahimi   int nrandom_;              // Number of random strings left to generate.
55*ccdc9c3eSSadaf Ebrahimi   std::minstd_rand0 rng_;    // Random number generator.
56*ccdc9c3eSSadaf Ebrahimi 
57*ccdc9c3eSSadaf Ebrahimi   StringGenerator(const StringGenerator&) = delete;
58*ccdc9c3eSSadaf Ebrahimi   StringGenerator& operator=(const StringGenerator&) = delete;
59*ccdc9c3eSSadaf Ebrahimi };
60*ccdc9c3eSSadaf Ebrahimi 
61*ccdc9c3eSSadaf Ebrahimi }  // namespace re2
62*ccdc9c3eSSadaf Ebrahimi 
63*ccdc9c3eSSadaf Ebrahimi #endif  // RE2_TESTING_STRING_GENERATOR_H_
64