/* */ #include "RandomStreamPieceSelector.h" #include "BitfieldMan.h" #include "SimpleRandomizer.h" namespace aria2 { RandomStreamPieceSelector::RandomStreamPieceSelector(BitfieldMan* bitfieldMan) : bitfieldMan_(bitfieldMan) { } RandomStreamPieceSelector::~RandomStreamPieceSelector() = default; bool RandomStreamPieceSelector::select(size_t& index, size_t minSplitSize, const unsigned char* ignoreBitfield, size_t length) { size_t start = SimpleRandomizer::getInstance()->getRandomNumber( bitfieldMan_->countBlock()); auto rv = bitfieldMan_->getInorderMissingUnusedIndex( index, start, bitfieldMan_->countBlock(), minSplitSize, ignoreBitfield, length); if (rv) { return true; } rv = bitfieldMan_->getInorderMissingUnusedIndex(index, 0, start, minSplitSize, ignoreBitfield, length); if (rv) { return true; } // Fall back to inorder search because randomized search may fail // because of |minSplitSize| constraint. return bitfieldMan_->getInorderMissingUnusedIndex(index, minSplitSize, ignoreBitfield, length); } void RandomStreamPieceSelector::onBitfieldInit() {} } // namespace aria2