Home | History | Annotate | Download | only in testing
      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__
     59