Use binary search in BtDependency for efficiency.

pull/4/head
Tatsuhiro Tsujikawa 2011-12-03 18:34:07 +09:00
parent d1bb828066
commit 53fd815111
1 changed files with 25 additions and 12 deletions

View File

@ -74,6 +74,17 @@ void copyValues(const SharedHandle<FileEntry>& d,
}
} // namespace
namespace {
struct EntryCmp {
bool operator()
(const SharedHandle<FileEntry>& lhs,
const SharedHandle<FileEntry>& rhs) const
{
return lhs->getOriginalName() < rhs->getOriginalName();
}
};
} // namespace
bool BtDependency::resolve()
{
if(!dependee_) {
@ -115,29 +126,31 @@ bool BtDependency::resolve()
dependantFileEntries[0]->getOriginalName().empty()) {
copyValues(fileEntries[0], dependantFileEntries[0]);
} else {
std::for_each(fileEntries.begin(), fileEntries.end(),
std::bind2nd(mem_fun_sh(&FileEntry::setRequested),false));
std::vector<SharedHandle<FileEntry> > destFiles;
destFiles.reserve(fileEntries.size());
for(std::vector<SharedHandle<FileEntry> >::const_iterator i =
fileEntries.begin(), eoi = fileEntries.end(); i != eoi; ++i) {
(*i)->setRequested(false);
destFiles.push_back(*i);
}
std::sort(destFiles.begin(), destFiles.end(), EntryCmp());
// Copy file path in dependant_'s FileEntries to newly created
// context's FileEntries to endorse the path structure of
// dependant_. URIs and singleHostMultiConnection are also copied.
std::vector<SharedHandle<FileEntry> >::const_iterator ctxFilesEnd =
fileEntries.end();
for(std::vector<SharedHandle<FileEntry> >::const_iterator s =
dependantFileEntries.begin(), eoi = dependantFileEntries.end();
s != eoi; ++s){
std::vector<SharedHandle<FileEntry> >::const_iterator d =
fileEntries.begin();
for(; d != ctxFilesEnd; ++d) {
if((*d)->getOriginalName() == (*s)->getOriginalName()) {
break;
}
}
if(d == ctxFilesEnd) {
std::lower_bound(destFiles.begin(), destFiles.end(), *s,
EntryCmp());
if(d == destFiles.end() ||
(*d)->getOriginalName() != (*s)->getOriginalName()) {
throw DL_ABORT_EX
(fmt("No entry %s in torrent file",
(*s)->getOriginalName().c_str()));
} else {
copyValues(*d, *s);
}
copyValues(*d, *s);
}
}
} catch(RecoverableException& e) {