GeomStreamPieceSelector: Made base changeable and added offsetIndex

parameter.
pull/2/head
Tatsuhiro Tsujikawa 2011-08-23 23:19:10 +09:00
parent 7318c361bc
commit a081f651a1
6 changed files with 34 additions and 22 deletions

View File

@ -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);
}
}

View File

@ -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

View File

@ -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));
}
}

View File

@ -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

View File

@ -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

View File

@ -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);
}