summaryrefslogtreecommitdiff
path: root/src/DownloadContext.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2011-10-29 23:33:48 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2011-10-29 23:33:48 +0900
commit5749647ae5559098cb077d35b496eb3fd15b579d (patch)
treedc6d9e4eec8ba5d6a328dcd5eced0b0694264cff /src/DownloadContext.cc
parent78c3bcd199bfe9113e2a17299d008d7fa464f38a (diff)
Use SegList<int> instead of IntSequence in DownloadContext::setFileFilter()
Diffstat (limited to 'src/DownloadContext.cc')
-rw-r--r--src/DownloadContext.cc39
1 files changed, 24 insertions, 15 deletions
diff --git a/src/DownloadContext.cc b/src/DownloadContext.cc
index b73845fe..d2be45da 100644
--- a/src/DownloadContext.cc
+++ b/src/DownloadContext.cc
@@ -128,22 +128,31 @@ void DownloadContext::setFilePathWithIndex
}
}
-void DownloadContext::setFileFilter(IntSequence seq)
+void DownloadContext::setFileFilter(SegList<int>& sgl)
{
- std::vector<int32_t> fileIndexes = seq.flush();
- std::sort(fileIndexes.begin(), fileIndexes.end());
- fileIndexes.erase(std::unique(fileIndexes.begin(), fileIndexes.end()),
- fileIndexes.end());
-
- bool selectAll = fileIndexes.empty() || fileEntries_.size() == 1;
-
- int32_t index = 1;
- for(std::vector<SharedHandle<FileEntry> >::const_iterator i =
- fileEntries_.begin(), eoi = fileEntries_.end();
- i != eoi; ++i, ++index) {
- (*i)->setRequested
- (selectAll ||
- std::binary_search(fileIndexes.begin(), fileIndexes.end(), index));
+ sgl.normalize();
+ if(!sgl.hasNext() || fileEntries_.size() == 1) {
+ std::for_each(fileEntries_.begin(), fileEntries_.end(),
+ std::bind2nd(mem_fun_sh(&FileEntry::setRequested), true));
+ return;
+ }
+ assert(sgl.peek() >= 1);
+ size_t i = 0;
+ while(i < fileEntries_.size() && sgl.hasNext()) {
+ size_t idx = sgl.peek()-1;
+ if(i == idx) {
+ fileEntries_[i]->setRequested(true);
+ ++i;
+ sgl.next();
+ } else if(i < idx) {
+ fileEntries_[i]->setRequested(false);
+ ++i;
+ } else {
+ sgl.next();
+ }
+ }
+ for(; i < fileEntries_.size(); ++i) {
+ fileEntries_[i]->setRequested(false);
}
}