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 #ifndef RE2_TESTING_STRING_GENERATOR_H__ 10 #define RE2_TESTING_STRING_GENERATOR_H__ 11 12 #include <string> 13 #include <vector> 14 #include "util/util.h" 15 #include "util/random.h" 16 #include "re2/stringpiece.h" 17 18 namespace re2 { 19 20 class StringGenerator { 21 public: 22 StringGenerator(int maxlen, const vector<string>& alphabet); 23 ~StringGenerator(); 24 const StringPiece& Next(); HasNext()25 bool HasNext() { return hasnext_; } 26 27 // Resets generator to start sequence over. 28 void Reset(); 29 30 // Causes generator to emit random strings for next n calls to Next(). 31 void Random(int32 seed, int n); 32 33 // Causes generator to emit a NULL as the next call. 34 void GenerateNULL(); 35 36 private: 37 bool IncrementDigits(); 38 bool RandomDigits(); 39 40 // Global state. 41 int maxlen_; // Maximum length string to generate. 42 vector<string> alphabet_; // Alphabet, one string per letter. 43 44 // Iteration state. 45 StringPiece sp_; // Last StringPiece returned by Next(). 46 string s_; // String data in last StringPiece returned by Next(). 47 bool hasnext_; // Whether Next() can be called again. 48 vector<int> digits_; // Alphabet indices for next string. 49 bool generate_null_; // Whether to generate a NULL StringPiece next. 50 bool random_; // Whether generated strings are random. 51 int nrandom_; // Number of random strings left to generate. 52 ACMRandom* acm_; // Random number generator 53 DISALLOW_EVIL_CONSTRUCTORS(StringGenerator); 54 }; 55 56 } // namespace re2 57 58 #endif // RE2_TESTING_STRING_GENERATOR_H__ 59