summaryrefslogtreecommitdiff
path: root/src/BitfieldMan.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2011-08-23 19:08:34 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2011-08-24 21:56:54 +0900
commit201af99501d6e9e166d384564f4393fc3ba454c0 (patch)
treed002c7dabe7a987cb8e7272a442f37b4158977ce /src/BitfieldMan.cc
parent0f72cbab8addbc7817da881b731c2409d42b757f (diff)
Added GeomStreamPieceSelector.
Diffstat (limited to 'src/BitfieldMan.cc')
-rw-r--r--src/BitfieldMan.cc58
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,