| // Copyright 2008 The RE2 Authors. All Rights Reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // String generator: generates all possible strings of up to |
| // maxlen letters using the set of letters in alpha. |
| // Fetch strings using a Java-like Next()/HasNext() interface. |
| |
| #ifndef RE2_TESTING_STRING_GENERATOR_H__ |
| #define RE2_TESTING_STRING_GENERATOR_H__ |
| |
| #include <string> |
| #include <vector> |
| #include "util/util.h" |
| #include "util/random.h" |
| #include "re2/stringpiece.h" |
| |
| namespace re2 { |
| |
| class StringGenerator { |
| public: |
| StringGenerator(int maxlen, const vector<string>& alphabet); |
| ~StringGenerator(); |
| const StringPiece& Next(); |
| bool HasNext() { return hasnext_; } |
| |
| // Resets generator to start sequence over. |
| void Reset(); |
| |
| // Causes generator to emit random strings for next n calls to Next(). |
| void Random(int32 seed, int n); |
| |
| // Causes generator to emit a NULL as the next call. |
| void GenerateNULL(); |
| |
| private: |
| bool IncrementDigits(); |
| bool RandomDigits(); |
| |
| // Global state. |
| int maxlen_; // Maximum length string to generate. |
| vector<string> alphabet_; // Alphabet, one string per letter. |
| |
| // Iteration state. |
| StringPiece sp_; // Last StringPiece returned by Next(). |
| string s_; // String data in last StringPiece returned by Next(). |
| bool hasnext_; // Whether Next() can be called again. |
| vector<int> digits_; // Alphabet indices for next string. |
| bool generate_null_; // Whether to generate a NULL StringPiece next. |
| bool random_; // Whether generated strings are random. |
| int nrandom_; // Number of random strings left to generate. |
| ACMRandom* acm_; // Random number generator |
| DISALLOW_EVIL_CONSTRUCTORS(StringGenerator); |
| }; |
| |
| } // namespace re2 |
| |
| #endif // RE2_TESTING_STRING_GENERATOR_H__ |