diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2011-10-29 23:33:48 +0900 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2011-10-29 23:33:48 +0900 |
| commit | 5749647ae5559098cb077d35b496eb3fd15b579d (patch) | |
| tree | dc6d9e4eec8ba5d6a328dcd5eced0b0694264cff /src/DownloadContext.cc | |
| parent | 78c3bcd199bfe9113e2a17299d008d7fa464f38a (diff) | |
Use SegList<int> instead of IntSequence in DownloadContext::setFileFilter()
Diffstat (limited to 'src/DownloadContext.cc')
| -rw-r--r-- | src/DownloadContext.cc | 39 |
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); } } |
