1 // -*- Mode: C++ -*-
2 template <typename T, typename U>
3 class SizeIterator {
4  public:
SizeIterator(MTRandom * rand,size_t howmany)5   SizeIterator(MTRandom *rand, size_t howmany)
6     : rand_(rand),
7       count_(0),
8       fixed_(U::sizes),
9       fixed_size_(SIZEOF_ARRAY(U::sizes)),
10       howmany_(howmany) { }
11 
Get()12   T Get() {
13     if (count_ < fixed_size_) {
14       return fixed_[count_];
15     }
16     return rand_->Rand<T>() % U::max_value;
17   }
18 
Done()19   bool Done() {
20     return count_ >= fixed_size_ && count_ >= howmany_;
21   }
22 
Next()23   void Next() {
24     count_++;
25   }
26 
27  private:
28   MTRandom *rand_;
29   size_t count_;
30   T* fixed_;
31   size_t fixed_size_;
32   size_t howmany_;
33 };
34 
35 // Small sizes
36 class SmallSizes {
37 public:
38   static size_t sizes[];
39   static size_t max_value;
40 };
41 
42 size_t SmallSizes::sizes[] = {
43   0, 1, 128 / 4, 3333,
44   128 - (128 / 3),
45   128,
46   128 + (128 / 3),
47   2 * 128 - (128 / 3),
48   2 * 128,
49   2 * 128 + (128 / 3),
50 };
51 
52 size_t SmallSizes::max_value = 128 * 3;
53 
54 // Large sizes
55 class LargeSizes {
56 public:
57   static size_t sizes[];
58   static size_t max_value;
59 };
60 
61 size_t LargeSizes::sizes[] = {
62   1 << 20,
63   1 << 18,
64   1 << 16,
65 };
66 
67 size_t LargeSizes::max_value = 1<<20;
68 
69 // Base constants
70 struct BaseConstants {
71   static const size_t TEST_ROUNDS;
72 };
73 
74 const size_t BaseConstants::TEST_ROUNDS = 10;
75 
76 // Regtest<> arguments
77 struct SmallBlock : public BaseConstants {
78   static const xoff_t BLOCK_SIZE;
79   static const size_t WINDOW_SIZE;
80   typedef SmallSizes Sizes;
81 };
82 
83 const xoff_t SmallBlock::BLOCK_SIZE = 1<<7;
84 const size_t SmallBlock::WINDOW_SIZE = 1<<7;
85 
86 struct LargeBlock : public BaseConstants {
87   static const xoff_t BLOCK_SIZE;
88   static const size_t WINDOW_SIZE;
89   typedef LargeSizes Sizes;
90 };
91 
92 const xoff_t LargeBlock::BLOCK_SIZE = (1 << 13);
93 const size_t LargeBlock::WINDOW_SIZE = (1 << 13);
94 
95 struct MixedBlock : public BaseConstants {
96   static const xoff_t BLOCK_SIZE;
97   static const size_t WINDOW_SIZE;
98   typedef SmallSizes Sizes;
99 };
100 
101 const xoff_t MixedBlock::BLOCK_SIZE = 1<<7;
102 const size_t MixedBlock::WINDOW_SIZE = 1<<8;
103 
104 struct OversizeBlock : public BaseConstants {
105   static const xoff_t BLOCK_SIZE;
106   static const size_t WINDOW_SIZE;
107   typedef SmallSizes Sizes;
108 };
109 
110 const xoff_t OversizeBlock::BLOCK_SIZE = 1<<8;
111 const size_t OversizeBlock::WINDOW_SIZE = 1<<7;
112