Alexander Gutkin | 0d4c523 | 2013-02-28 13:47:27 +0000 | [diff] [blame] | 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(); |
| 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__ |