/* */ #include "RarestPieceSelector.h" #include #include #include "PieceStatMan.h" namespace aria2 { RarestPieceSelector::RarestPieceSelector (const SharedHandle& pieceStatMan):_pieceStatMan(pieceStatMan) {} 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; } }; 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