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