* Added 'method.const' and 'method.const.enable' for setting the const flag for objects in object_storage.

* Added '<foo_list>.push_back' to all list objects in object_storage.


git-svn-id: svn://rakshasa.no/libtorrent/trunk/rtorrent@1242 e378c898-3ddf-0310-93e7-cc216c733640
This commit is contained in:
rakshasa
2011-06-22 06:13:43 +00:00
parent 90582b58c3
commit d0d52cdda1
5 changed files with 127 additions and 92 deletions
+56 -46
View File
@@ -55,6 +55,33 @@ object_storage::find_local(const torrent::raw_string& key) {
return end(bucket_count());
}
object_storage::local_iterator
object_storage::find_local_const(const torrent::raw_string& key, unsigned int type) {
local_iterator itr = find_local(key);
if (itr == end(bucket_count()))
throw torrent::input_error("Key not found.");
if ((type != 0 && (itr->second.flags & mask_type) != type))
throw torrent::input_error("Object is wrong type or const.");
return itr;
}
object_storage::local_iterator
object_storage::find_local_mutable(const torrent::raw_string& key, unsigned int type) {
local_iterator itr = find_local(key);
if (itr == end(bucket_count()))
throw torrent::input_error("Key not found.");
if ((type != 0 && (itr->second.flags & mask_type) != type) ||
itr->second.flags & flag_constant)
throw torrent::input_error("Object is wrong type or const.");
return itr;
}
object_storage::iterator
object_storage::insert(const char* key_data, uint32_t key_size, const torrent::Object& rawObject, unsigned int flags) {
if (std::find(key_data, key_data + key_size, '\0') != key_data + key_size)
@@ -92,74 +119,65 @@ object_storage::insert(const char* key_data, uint32_t key_size, const torrent::O
return result.first;
}
bool
object_storage::has_flag(const torrent::raw_string& key, unsigned int flag) {
local_iterator itr = find_local_const(key);
return itr->second.flags & flag;
}
void
object_storage::enable_flag(const torrent::raw_string& key, unsigned int flag) {
local_iterator itr = find_local_mutable(key);
itr->second.flags |= (flag & (flag_constant));
}
const torrent::Object&
object_storage::get(const torrent::raw_string& key) {
local_iterator itr = find_local(key);
if (itr == end(bucket_count()))
throw torrent::input_error("Key not found.");
local_iterator itr = find_local_const(key);
return itr->second.object;
}
const torrent::Object&
object_storage::set_bool(const torrent::raw_string& key, int64_t object) {
local_iterator itr = find_local(key);
if (itr == end(bucket_count()) || (itr->second.flags & mask_type) != flag_bool_type)
throw torrent::input_error("Key not found or wrong type.");
local_iterator itr = find_local_mutable(key, flag_bool_type);
return itr->second.object = !!object;
}
const torrent::Object&
object_storage::set_value(const torrent::raw_string& key, int64_t object) {
local_iterator itr = find_local(key);
if (itr == end(bucket_count()) || (itr->second.flags & mask_type) != flag_value_type)
throw torrent::input_error("Key not found or wrong type.");
local_iterator itr = find_local_mutable(key, flag_value_type);
return itr->second.object = object;
}
const torrent::Object&
object_storage::set_string(const torrent::raw_string& key, const std::string& object) {
local_iterator itr = find_local(key);
if (itr == end(bucket_count()) || (itr->second.flags & mask_type) != flag_string_type)
throw torrent::input_error("Key not found or wrong type.");
local_iterator itr = find_local_mutable(key, flag_string_type);
return itr->second.object = object;
}
const torrent::Object&
object_storage::set_list(const torrent::raw_string& key, const torrent::Object::list_type& object) {
local_iterator itr = find_local(key);
if (itr == end(bucket_count()) || (itr->second.flags & mask_type) != flag_list_type)
throw torrent::input_error("Key not found or wrong type.");
local_iterator itr = find_local_mutable(key, flag_list_type);
return itr->second.object = torrent::Object::create_list_range(object.begin(), object.end());
}
void
object_storage::list_push_back(const torrent::raw_string& key, const torrent::Object& object) {
local_iterator itr = find_local_mutable(key, flag_list_type);
itr->second.object.as_list().push_back(object);
}
const torrent::Object&
object_storage::set_function(const torrent::raw_string& key, const std::string& object) {
local_iterator itr = find_local(key);
if (itr == end(bucket_count()) || (itr->second.flags & mask_type) != flag_function_type)
throw torrent::input_error("Key not found or wrong type.");
local_iterator itr = find_local_mutable(key, flag_function_type);
return itr->second.object = object;
}
torrent::Object
object_storage::call_function(const torrent::raw_string& key, target_type target, const torrent::Object& object) {
local_iterator itr = find_local(key);
if (itr == end(bucket_count()))
throw torrent::input_error("Key not found or wrong type.");
local_iterator itr = find_local_const(key);
switch (itr->second.flags & mask_type) {
case flag_function_type:
@@ -173,18 +191,13 @@ object_storage::call_function(const torrent::raw_string& key, target_type target
bool
object_storage::has_multi_key(const torrent::raw_string& key, const std::string& cmd_key) {
local_iterator itr = find_local(key);
return itr != end(0) && (itr->second.flags & mask_type) == flag_multi_type &&
itr->second.object.has_key(cmd_key);
local_iterator itr = find_local_const(key, flag_multi_type);
return itr->second.object.has_key(cmd_key);
}
void
object_storage::erase_multi_key(const torrent::raw_string& key, const std::string& cmd_key) {
local_iterator itr = find_local(key);
if (itr != end(0) && (itr->second.flags & mask_type) == flag_multi_type)
return;
local_iterator itr = find_local_mutable(key, flag_multi_type);
itr->second.object.erase_key(cmd_key);
@@ -209,10 +222,7 @@ object_storage::set_multi_key_obj(const torrent::raw_string& key, const std::str
if (!object.is_string() && !object.is_dict_key())
throw torrent::input_error("Object is wrong type.");
local_iterator itr = find_local(key);
if (itr == end(0) || (itr->second.flags & mask_type) != flag_multi_type)
throw torrent::input_error("Key not found or wrong type.");
local_iterator itr = find_local_mutable(key, flag_multi_type);
if (itr->second.flags & flag_rlookup) {
rlookup_iterator r_itr = m_rlookup.find(cmd_key);