diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2011-08-23 19:08:34 +0900 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2011-08-24 21:56:54 +0900 |
| commit | 201af99501d6e9e166d384564f4393fc3ba454c0 (patch) | |
| tree | d002c7dabe7a987cb8e7272a442f37b4158977ce /src/BitfieldMan.cc | |
| parent | 0f72cbab8addbc7817da881b731c2409d42b757f (diff) | |
Added GeomStreamPieceSelector.
Diffstat (limited to 'src/BitfieldMan.cc')
| -rw-r--r-- | src/BitfieldMan.cc | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/src/BitfieldMan.cc b/src/BitfieldMan.cc index 9b1033ab..79d86d19 100644 --- a/src/BitfieldMan.cc +++ b/src/BitfieldMan.cc @@ -311,6 +311,64 @@ bool BitfieldMan::getSparseMissingUnusedIndex namespace { template<typename Array> +bool getGeomMissingUnusedIndex +(size_t& index, + size_t minSplitSize, + const Array& bitfield, + const unsigned char* useBitfield, + size_t blockLength, + size_t blocks) +{ + const size_t base = 2; + size_t start = 0; + size_t end = 1; + while(start < blocks) { + index = blocks; + bool ok = false; + for(size_t i = start, eoi = std::min(blocks, end); i < eoi; ++i) { + if(bitfield::test(useBitfield, blocks, i)) { + ok = false; + break; + } else if(index == blocks && !bitfield::test(bitfield, blocks, i)) { + ok = true; + index = i; + } + } + if(ok) { + return true; + } else { + start = end; + end *= base; + } + } + return getSparseMissingUnusedIndex(index, minSplitSize, + bitfield, useBitfield, + blockLength, blocks); +} +} // namespace + +bool BitfieldMan::getGeomMissingUnusedIndex +(size_t& index, + size_t minSplitSize, + const unsigned char* ignoreBitfield, + size_t ignoreBitfieldLength) const +{ + if(filterEnabled_) { + return aria2::getGeomMissingUnusedIndex + (index, minSplitSize, + array(ignoreBitfield)|~array(filterBitfield_)| + array(bitfield_)|array(useBitfield_), + useBitfield_, blockLength_, blocks_); + } else { + return aria2::getGeomMissingUnusedIndex + (index, minSplitSize, + array(ignoreBitfield)|array(bitfield_)|array(useBitfield_), + useBitfield_, blockLength_, blocks_); + } +} + +namespace { +template<typename Array> bool getInorderMissingUnusedIndex (size_t& index, size_t minSplitSize, |
