summaryrefslogtreecommitdiff
path: root/src/RarestPieceSelector.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2009-03-28 13:29:38 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2009-03-28 13:29:38 +0000
commita6b02840fa79e3e7cb82e472ff5660fda86842c1 (patch)
tree2d49c972a80b013dbcba2c8b32c56a5d290f9a46 /src/RarestPieceSelector.cc
parent3531d57d3791f71ccb04c3d2ee238b2c2087ef82 (diff)
2009-03-28 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
BitfieldMan::getMissingIndexes family functions now takes unsigned char* bitfield instead of stl container for efficiency. PieceSelector::select now takes this bitfield. RarestPieceSelector::select now also performs efficiently for this change. bitfield namespace is introduced and it has several helper functions to handle basic bitfield operations such as test, count set bits, etc. * src/BitfieldMan.cc * src/BitfieldMan.h * src/DefaultBtRequestFactory.cc * src/DefaultPieceStorage.cc * src/DefaultPieceStorage.h * src/LongestSequencePieceSelector.cc * src/LongestSequencePieceSelector.h * src/Makefile.am * src/Piece.cc * src/Piece.h * src/PieceSelector.h * src/RarestPieceSelector.cc * src/RarestPieceSelector.h * src/Util.cc * src/Util.h * src/bitfield.h * test/BitfieldManTest.cc * test/LongestSequencePieceSelectorTest.cc * test/Makefile.am * test/RarestPieceSelectorTest.cc * test/UtilTest.cc * test/bitfieldTest.cc
Diffstat (limited to 'src/RarestPieceSelector.cc')
-rw-r--r--src/RarestPieceSelector.cc16
1 files changed, 10 insertions, 6 deletions
diff --git a/src/RarestPieceSelector.cc b/src/RarestPieceSelector.cc
index fe5ca304..0b7aabb5 100644
--- a/src/RarestPieceSelector.cc
+++ b/src/RarestPieceSelector.cc
@@ -34,6 +34,7 @@
/* copyright --> */
#include "RarestPieceSelector.h"
+#include <cassert>
#include <algorithm>
#include "SimpleRandomizer.h"
@@ -121,23 +122,26 @@ RarestPieceSelector::RarestPieceSelector(size_t pieceNum, bool randomShuffle):
class FindRarestPiece
{
private:
- const std::deque<size_t>& _indexes;
+ const unsigned char* _misbitfield;
+ size_t _numbits;
public:
- FindRarestPiece(const std::deque<size_t>& indexes):_indexes(indexes) {}
+ FindRarestPiece(const unsigned char* misbitfield, size_t numbits):
+ _misbitfield(misbitfield), _numbits(numbits) {}
bool operator()(const size_t& index)
{
- return std::binary_search(_indexes.begin(), _indexes.end(), index);
+ assert(index < _numbits);
+ unsigned char mask = (128 >> (index%8));
+ return _misbitfield[index/8]&mask;
}
};
bool RarestPieceSelector::select
-(size_t& index,
- const std::deque<size_t>& candidateIndexes) const
+(size_t& index, const unsigned char* bitfield, size_t nbits) const
{
std::vector<size_t>::const_iterator i =
std::find_if(_sortedPieceStatIndexes.begin(), _sortedPieceStatIndexes.end(),
- FindRarestPiece(candidateIndexes));
+ FindRarestPiece(bitfield, nbits));
if(i == _sortedPieceStatIndexes.end()) {
return false;
} else {