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