* Optimized view filtering and sorting.

git-svn-id: svn://rakshasa.no/libtorrent/trunk/rtorrent@1213 e378c898-3ddf-0310-93e7-cc216c733640
This commit is contained in:
rakshasa
2011-04-20 15:14:02 +00:00
parent 8e15749d0c
commit ea9dc35bbe
10 changed files with 200 additions and 115 deletions
+39 -8
View File
@@ -55,14 +55,28 @@ namespace core {
// Also add focus thingie here?
struct view_downloads_compare : std::binary_function<Download*, Download*, bool> {
view_downloads_compare(const std::string& cmd) : m_command(cmd) {}
view_downloads_compare(const torrent::Object& cmd) : m_command(cmd) {}
bool operator () (Download* d1, Download* d2) const {
try {
if (m_command.empty())
if (m_command.is_empty())
return false;
return rpc::parse_command_single(rpc::make_target_pair(d1, d2), m_command).as_value();
if (!m_command.is_dict_key())
return rpc::parse_command_single(rpc::make_target_pair(d1, d2), m_command.as_string()).as_value();
// torrent::Object tmp_command = m_command;
// uint32_t flags = tmp_command.flags() & torrent::Object::mask_function;
// tmp_command.unset_flags(torrent::Object::mask_function);
// tmp_command.set_flags((flags >> 1) & torrent::Object::mask_function);
// rpc::parse_command_execute(rpc::make_target_pair(d1, d2), &tmp_command);
// return rpc::commands.call_command(tmp_command.as_dict_key().c_str(), tmp_command.as_dict_obj(),
// rpc::make_target_pair(d1, d2)).as_value();
return rpc::commands.call_command(m_command.as_dict_key().c_str(), m_command.as_dict_obj(),
rpc::make_target_pair(d1, d2)).as_value();
} catch (torrent::input_error& e) {
control->core()->push_log(e.what());
@@ -71,18 +85,35 @@ struct view_downloads_compare : std::binary_function<Download*, Download*, bool>
}
}
const std::string& m_command;
const torrent::Object& m_command;
};
struct view_downloads_filter : std::unary_function<Download*, bool> {
view_downloads_filter(const std::string& cmd) : m_command(cmd) {}
view_downloads_filter(const torrent::Object& cmd) : m_command(cmd) {}
bool operator () (Download* d1) const {
if (m_command.empty())
if (m_command.is_empty())
return true;
try {
torrent::Object result = rpc::parse_command_single(rpc::make_target(d1), m_command);
torrent::Object result;
if (m_command.is_dict_key()) {
// torrent::Object tmp_command = m_command;
// uint32_t flags = tmp_command.flags() & torrent::Object::mask_function;
// tmp_command.unset_flags(torrent::Object::mask_function);
// tmp_command.set_flags((flags >> 1) & torrent::Object::mask_function);
// rpc::parse_command_execute(rpc::make_target(d1), &tmp_command);
// result = rpc::commands.call_command(tmp_command.as_dict_key().c_str(), tmp_command.as_dict_obj(),
// rpc::make_target(d1));
result = rpc::commands.call_command(m_command.as_dict_key().c_str(), m_command.as_dict_obj(), rpc::make_target(d1));
} else {
result = rpc::parse_command_single(rpc::make_target(d1), m_command.as_string());
}
switch (result.type()) {
// case torrent::Object::TYPE_RAW_BENCODE: return !result.as_raw_bencode().empty();
@@ -104,7 +135,7 @@ struct view_downloads_filter : std::unary_function<Download*, bool> {
}
}
const std::string& m_command;
const torrent::Object& m_command;
};
inline void