// -*- Mode: C++ -*- template <typename T, typename U> class SizeIterator { public: SizeIterator(MTRandom *rand, size_t howmany) : rand_(rand), count_(0), fixed_(U::sizes), fixed_size_(SIZEOF_ARRAY(U::sizes)), howmany_(howmany) { } T Get() { if (count_ < fixed_size_) { return fixed_[count_]; } return rand_->Rand<T>() % U::max_value; } bool Done() { return count_ >= fixed_size_ && count_ >= howmany_; } void Next() { count_++; } private: MTRandom *rand_; size_t count_; T* fixed_; size_t fixed_size_; size_t howmany_; }; // Small sizes class SmallSizes { public: static size_t sizes[]; static size_t max_value; }; size_t SmallSizes::sizes[] = { 0, 1, 128 / 4, 3333, 128 - (128 / 3), 128, 128 + (128 / 3), 2 * 128 - (128 / 3), 2 * 128, 2 * 128 + (128 / 3), }; size_t SmallSizes::max_value = 128 * 3; // Large sizes class LargeSizes { public: static size_t sizes[]; static size_t max_value; }; size_t LargeSizes::sizes[] = { 1 << 20, 1 << 18, 1 << 16, }; size_t LargeSizes::max_value = 1<<20; // Base constants struct BaseConstants { static const size_t TEST_ROUNDS; }; const size_t BaseConstants::TEST_ROUNDS = 10; // Regtest<> arguments struct SmallBlock : public BaseConstants { static const xoff_t BLOCK_SIZE; static const size_t WINDOW_SIZE; static const size_t READ_SIZE; typedef SmallSizes Sizes; }; const size_t SmallBlock::READ_SIZE = 1<<7; const xoff_t SmallBlock::BLOCK_SIZE = 1<<7; const size_t SmallBlock::WINDOW_SIZE = 1<<7; struct LargeBlock : public BaseConstants { static const xoff_t BLOCK_SIZE; static const size_t WINDOW_SIZE; static const size_t READ_SIZE; typedef LargeSizes Sizes; }; const size_t LargeBlock::READ_SIZE = (1 << 13); const xoff_t LargeBlock::BLOCK_SIZE = (1 << 13); const size_t LargeBlock::WINDOW_SIZE = (1 << 13); struct MixedBlock : public BaseConstants { static const xoff_t BLOCK_SIZE; static const size_t WINDOW_SIZE; static const size_t READ_SIZE; typedef SmallSizes Sizes; }; const size_t MixedBlock::READ_SIZE = 1<<6; const xoff_t MixedBlock::BLOCK_SIZE = 1<<7; const size_t MixedBlock::WINDOW_SIZE = 1<<8; struct OversizeBlock : public BaseConstants { static const xoff_t BLOCK_SIZE; static const size_t WINDOW_SIZE; static const size_t READ_SIZE; typedef SmallSizes Sizes; }; const size_t OversizeBlock::READ_SIZE = (1<<6) + (1<<7); const xoff_t OversizeBlock::BLOCK_SIZE = 1<<8; const size_t OversizeBlock::WINDOW_SIZE = 1<<7; struct PrimeBlock : public BaseConstants { static const xoff_t BLOCK_SIZE; static const size_t WINDOW_SIZE; static const size_t READ_SIZE; typedef SmallSizes Sizes; }; const size_t PrimeBlock::READ_SIZE = 71; const xoff_t PrimeBlock::BLOCK_SIZE = 512; // Must be a power-of-2 const size_t PrimeBlock::WINDOW_SIZE = 73;