mirror of https://github.com/aria2/aria2
GeomStreamPieceSelector: Made base changeable and added offsetIndex
parameter.pull/2/head
parent
7318c361bc
commit
a081f651a1
|
@ -317,15 +317,18 @@ bool getGeomMissingUnusedIndex
|
|||
const Array& bitfield,
|
||||
const unsigned char* useBitfield,
|
||||
size_t blockLength,
|
||||
size_t blocks)
|
||||
size_t blocks,
|
||||
double base,
|
||||
size_t offsetIndex)
|
||||
{
|
||||
const size_t base = 2;
|
||||
size_t start = 0;
|
||||
size_t end = 1;
|
||||
while(start < blocks) {
|
||||
double start = 0;
|
||||
double end = 1;
|
||||
while(start+offsetIndex < blocks) {
|
||||
index = blocks;
|
||||
bool ok = false;
|
||||
for(size_t i = start, eoi = std::min(blocks, end); i < eoi; ++i) {
|
||||
for(size_t i = start+offsetIndex,
|
||||
eoi = std::min(blocks, static_cast<size_t>(end+offsetIndex));
|
||||
i < eoi; ++i) {
|
||||
if(bitfield::test(useBitfield, blocks, i)) {
|
||||
ok = false;
|
||||
break;
|
||||
|
@ -351,19 +354,23 @@ bool BitfieldMan::getGeomMissingUnusedIndex
|
|||
(size_t& index,
|
||||
size_t minSplitSize,
|
||||
const unsigned char* ignoreBitfield,
|
||||
size_t ignoreBitfieldLength) const
|
||||
size_t ignoreBitfieldLength,
|
||||
double base,
|
||||
size_t offsetIndex) const
|
||||
{
|
||||
if(filterEnabled_) {
|
||||
return aria2::getGeomMissingUnusedIndex
|
||||
(index, minSplitSize,
|
||||
array(ignoreBitfield)|~array(filterBitfield_)|
|
||||
array(bitfield_)|array(useBitfield_),
|
||||
useBitfield_, blockLength_, blocks_);
|
||||
useBitfield_, blockLength_, blocks_,
|
||||
base, offsetIndex);
|
||||
} else {
|
||||
return aria2::getGeomMissingUnusedIndex
|
||||
(index, minSplitSize,
|
||||
array(ignoreBitfield)|array(bitfield_)|array(useBitfield_),
|
||||
useBitfield_, blockLength_, blocks_);
|
||||
useBitfield_, blockLength_, blocks_,
|
||||
base, offsetIndex);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -139,7 +139,9 @@ public:
|
|||
(size_t& index,
|
||||
size_t minSplitSize,
|
||||
const unsigned char* ignoreBitfield,
|
||||
size_t ignoreBitfieldLength) const;
|
||||
size_t ignoreBitfieldLength,
|
||||
double base,
|
||||
size_t offsetIndex) const;
|
||||
|
||||
// Stores missing bit index to index. This function selects smallest
|
||||
// index of missing piece, considering minSplitSize. Set bits in
|
||||
|
|
|
@ -88,7 +88,7 @@ DefaultPieceStorage::DefaultPieceStorage
|
|||
} else if(pieceSelectorOpt == V_INORDER) {
|
||||
streamPieceSelector_.reset(new InorderStreamPieceSelector(bitfieldMan_));
|
||||
} else if(pieceSelectorOpt == A2_V_GEOM) {
|
||||
streamPieceSelector_.reset(new GeomStreamPieceSelector(bitfieldMan_));
|
||||
streamPieceSelector_.reset(new GeomStreamPieceSelector(bitfieldMan_, 1.5));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -38,8 +38,10 @@
|
|||
namespace aria2 {
|
||||
|
||||
GeomStreamPieceSelector::GeomStreamPieceSelector
|
||||
(BitfieldMan* bitfieldMan)
|
||||
: bitfieldMan_(bitfieldMan)
|
||||
(BitfieldMan* bitfieldMan,
|
||||
double base)
|
||||
: bitfieldMan_(bitfieldMan),
|
||||
base_(base)
|
||||
{}
|
||||
|
||||
GeomStreamPieceSelector::~GeomStreamPieceSelector() {}
|
||||
|
@ -51,7 +53,7 @@ bool GeomStreamPieceSelector::select
|
|||
size_t length)
|
||||
{
|
||||
return bitfieldMan_->getGeomMissingUnusedIndex
|
||||
(index, minSplitSize, ignoreBitfield, length);
|
||||
(index, minSplitSize, ignoreBitfield, length, base_, 0);
|
||||
}
|
||||
|
||||
} // namespace aria2
|
||||
|
|
|
@ -43,7 +43,7 @@ class BitfieldMan;
|
|||
|
||||
class GeomStreamPieceSelector:public StreamPieceSelector {
|
||||
public:
|
||||
GeomStreamPieceSelector(BitfieldMan* bitfieldMan);
|
||||
GeomStreamPieceSelector(BitfieldMan* bitfieldMan, double base);
|
||||
virtual ~GeomStreamPieceSelector();
|
||||
|
||||
virtual bool select
|
||||
|
@ -53,6 +53,7 @@ public:
|
|||
size_t length);
|
||||
private:
|
||||
BitfieldMan* bitfieldMan_;
|
||||
double base_;
|
||||
};
|
||||
|
||||
} // namespace aria2
|
||||
|
|
|
@ -743,43 +743,43 @@ void BitfieldManTest::testGetGeomMissingUnusedIndex()
|
|||
// 00000|00000|00000|00000
|
||||
CPPUNIT_ASSERT
|
||||
(bt.getGeomMissingUnusedIndex
|
||||
(index, minSplitSize, ignoreBitfield, length));
|
||||
(index, minSplitSize, ignoreBitfield, length, 2, 0));
|
||||
CPPUNIT_ASSERT_EQUAL((size_t)0, index);
|
||||
bt.setUseBit(0);
|
||||
// 10000|00000|00000|00000
|
||||
CPPUNIT_ASSERT
|
||||
(bt.getGeomMissingUnusedIndex
|
||||
(index, minSplitSize, ignoreBitfield, length));
|
||||
(index, minSplitSize, ignoreBitfield, length, 2, 0));
|
||||
CPPUNIT_ASSERT_EQUAL((size_t)1, index);
|
||||
bt.setUseBit(1);
|
||||
// 11000|00000|00000|00000
|
||||
CPPUNIT_ASSERT
|
||||
(bt.getGeomMissingUnusedIndex
|
||||
(index, minSplitSize, ignoreBitfield, length));
|
||||
(index, minSplitSize, ignoreBitfield, length, 2, 0));
|
||||
CPPUNIT_ASSERT_EQUAL((size_t)2, index);
|
||||
bt.setUseBit(2);
|
||||
// 11100|00000|00000|00000
|
||||
CPPUNIT_ASSERT
|
||||
(bt.getGeomMissingUnusedIndex
|
||||
(index, minSplitSize, ignoreBitfield, length));
|
||||
(index, minSplitSize, ignoreBitfield, length, 2, 0));
|
||||
CPPUNIT_ASSERT_EQUAL((size_t)4, index);
|
||||
bt.setUseBit(4);
|
||||
// 11110|00000|00000|00000
|
||||
CPPUNIT_ASSERT
|
||||
(bt.getGeomMissingUnusedIndex
|
||||
(index, minSplitSize, ignoreBitfield, length));
|
||||
(index, minSplitSize, ignoreBitfield, length, 2, 0));
|
||||
CPPUNIT_ASSERT_EQUAL((size_t)8, index);
|
||||
bt.setUseBit(8);
|
||||
// 11110|00010|00000|00000
|
||||
CPPUNIT_ASSERT
|
||||
(bt.getGeomMissingUnusedIndex
|
||||
(index, minSplitSize, ignoreBitfield, length));
|
||||
(index, minSplitSize, ignoreBitfield, length, 2, 0));
|
||||
CPPUNIT_ASSERT_EQUAL((size_t)16, index);
|
||||
bt.setUseBit(16);
|
||||
// 11110|00010|00000|01000
|
||||
CPPUNIT_ASSERT
|
||||
(bt.getGeomMissingUnusedIndex
|
||||
(index, minSplitSize, ignoreBitfield, length));
|
||||
(index, minSplitSize, ignoreBitfield, length, 2, 0));
|
||||
CPPUNIT_ASSERT_EQUAL((size_t)12, index);
|
||||
bt.setUseBit(12);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue