diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/BitfieldMan.cc | 8 | ||||
| -rw-r--r-- | src/BitfieldMan.h | 3 | ||||
| -rw-r--r-- | src/DefaultPieceStorage.cc | 25 | ||||
| -rw-r--r-- | src/DefaultPieceStorage.h | 7 |
4 files changed, 36 insertions, 7 deletions
diff --git a/src/BitfieldMan.cc b/src/BitfieldMan.cc index feb387c1..dab736c8 100644 --- a/src/BitfieldMan.cc +++ b/src/BitfieldMan.cc @@ -609,6 +609,14 @@ bool BitfieldMan::isAllFilterBitSet() const return testAllBitSet(filterBitfield_, bitfieldLength_, blocks_); } +bool BitfieldMan::isFilterBitSet(size_t index) const { + if(filterBitfield_) { + return bitfield::test(filterBitfield_, blocks_, index); + } else { + return false; + } +} + bool BitfieldMan::isBitSet(size_t index) const { return bitfield::test(bitfield_, blocks_, index); diff --git a/src/BitfieldMan.h b/src/BitfieldMan.h index 818e6957..f82557d4 100644 --- a/src/BitfieldMan.h +++ b/src/BitfieldMan.h @@ -200,6 +200,9 @@ public: bool isAllBitSet() const; bool isAllFilterBitSet() const; + // Returns true if index bit is set in filterBitfield_. If + // filterBitfield_ is NULL, returns false. + bool isFilterBitSet(size_t index) const; const unsigned char* getBitfield() const { diff --git a/src/DefaultPieceStorage.cc b/src/DefaultPieceStorage.cc index f1f13f2f..929359d3 100644 --- a/src/DefaultPieceStorage.cc +++ b/src/DefaultPieceStorage.cc @@ -537,14 +537,29 @@ int64_t DefaultPieceStorage::getCompletedLength() int64_t DefaultPieceStorage::getFilteredCompletedLength() { return bitfieldMan_->getFilteredCompletedLength()+ - getInFlightPieceCompletedLength(); + getInFlightPieceFilteredCompletedLength(); } -size_t DefaultPieceStorage::getInFlightPieceCompletedLength() const +int64_t DefaultPieceStorage::getInFlightPieceCompletedLength() const { - return std::accumulate(usedPieces_.begin(), usedPieces_.end(), - 0, adopt2nd(std::plus<size_t>(), - mem_fun_sh(&Piece::getCompletedLength))); + int64_t len = 0; + for(UsedPieceSet::const_iterator i = usedPieces_.begin(), + eoi = usedPieces_.end(); i != eoi; ++i) { + len += (*i)->getCompletedLength(); + } + return len; +} + +int64_t DefaultPieceStorage::getInFlightPieceFilteredCompletedLength() const +{ + int64_t len = 0; + for(UsedPieceSet::const_iterator i = usedPieces_.begin(), + eoi = usedPieces_.end(); i != eoi; ++i) { + if(bitfieldMan_->isFilterBitSet((*i)->getIndex())) { + len += (*i)->getCompletedLength(); + } + } + return len; } // not unittested diff --git a/src/DefaultPieceStorage.h b/src/DefaultPieceStorage.h index 7851f171..ec3af3d4 100644 --- a/src/DefaultPieceStorage.h +++ b/src/DefaultPieceStorage.h @@ -110,8 +110,11 @@ private: void deleteUsedPiece(const SharedHandle<Piece>& piece); SharedHandle<Piece> findUsedPiece(size_t index) const; - size_t getInFlightPieceCompletedLength() const; - + // Returns the sum of completed length of in-flight pieces + int64_t getInFlightPieceCompletedLength() const; + // Returns the sum of completed length of in-flight pieces + // intersecting filter ranges. + int64_t getInFlightPieceFilteredCompletedLength() const; public: // Setting randomPieceStatsOrdering to true means a piece is chosen in // random when more than 2 pieces has the same rarity. |
