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