summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/BitfieldMan.cc8
-rw-r--r--src/BitfieldMan.h3
-rw-r--r--src/DefaultPieceStorage.cc25
-rw-r--r--src/DefaultPieceStorage.h7
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.