/* */ #include "RarestPieceSelector.h" #include #include #include "PieceStatMan.h" namespace aria2 { RarestPieceSelector::RarestPieceSelector (const SharedHandle& pieceStatMan):pieceStatMan_(pieceStatMan) {} namespace { class FindRarestPiece { private: const unsigned char* misbitfield_; size_t numbits_; public: FindRarestPiece(const unsigned char* misbitfield, size_t numbits): misbitfield_(misbitfield), numbits_(numbits) {} bool operator()(const size_t& index) { assert(index < numbits_); unsigned char mask = (128 >> (index%8)); return misbitfield_[index/8]&mask; } }; } // namespace bool RarestPieceSelector::select (size_t& index, const unsigned char* bitfield, size_t nbits) const { const std::vector& pieceIndexes = pieceStatMan_->getRarerPieceIndexes(); std::vector::const_iterator i = std::find_if(pieceIndexes.begin(), pieceIndexes.end(), FindRarestPiece(bitfield, nbits)); if(i == pieceIndexes.end()) { return false; } else { index = *i; return true; } } } // namespace aria2