susumu.yata
null+****@clear*****
Wed Jul 24 14:35:55 JST 2013
susumu.yata 2013-07-24 14:35:55 +0900 (Wed, 24 Jul 2013) New Revision: 5b3303e942bb397241175c0d60f1f1c964fba79f https://github.com/groonga/grnxx/commit/5b3303e942bb397241175c0d60f1f1c964fba79f Message: Update grnxx::map::ArrayMap to use grnxx::map::KeyPool. Modified files: lib/grnxx/map/array_map.cpp lib/grnxx/map/array_map.hpp Modified: lib/grnxx/map/array_map.cpp (+24 -34) =================================================================== --- lib/grnxx/map/array_map.cpp 2013-07-24 14:26:30 +0900 (46cba1f) +++ lib/grnxx/map/array_map.cpp 2013-07-24 14:35:55 +0900 (6ebcb20) @@ -25,6 +25,7 @@ #include "grnxx/logger.hpp" #include "grnxx/map/common_header.hpp" #include "grnxx/map/helper.hpp" +#include "grnxx/map/key_pool.hpp" #include "grnxx/storage.hpp" namespace grnxx { @@ -37,7 +38,7 @@ constexpr char FORMAT_STRING[] = "grnxx::map::ArrayMap"; struct ArrayMapHeader { CommonHeader common_header; - uint32_t keys_storage_node_id; + uint32_t pool_storage_node_id; // Initialize the member variables. ArrayMapHeader(); @@ -48,7 +49,7 @@ struct ArrayMapHeader { ArrayMapHeader::ArrayMapHeader() : common_header(FORMAT_STRING, MAP_ARRAY), - keys_storage_node_id(STORAGE_INVALID_NODE_ID) {} + pool_storage_node_id(STORAGE_INVALID_NODE_ID) {} ArrayMapHeader::operator bool() const { return common_header.format() == FORMAT_STRING; @@ -59,7 +60,7 @@ ArrayMap<T>::ArrayMap() : storage_(nullptr), storage_node_id_(STORAGE_INVALID_NODE_ID), header_(nullptr), - keys_() {} + pool_() {} template <typename T> ArrayMap<T>::~ArrayMap() {} @@ -99,12 +100,12 @@ MapType ArrayMap<T>::type() const { template <typename T> int64_t ArrayMap<T>::max_key_id() const { - return keys_->max_key_id(); + return pool_->max_key_id(); } template <typename T> uint64_t ArrayMap<T>::num_keys() const { - return keys_->num_keys(); + return pool_->num_keys(); } template <typename T> @@ -113,22 +114,15 @@ bool ArrayMap<T>::get(int64_t key_id, Key *key) { // Out of range. return false; } - if (!keys_->get_bit(key_id)) { - // Not found. - return false; - } - if (key) { - *key = keys_->get_key(key_id); - } - return true; + return pool_->get(key_id, key); } template <typename T> bool ArrayMap<T>::unset(int64_t key_id) { - if (!keys_->unset(key_id)) { - // Not found. + if (!pool_->get_bit(key_id)) { return false; } + pool_->unset(key_id); return true; } @@ -142,7 +136,7 @@ bool ArrayMap<T>::reset(int64_t key_id, KeyArg dest_key) { // Found. return false; } - keys_->reset(key_id, Helper<T>::normalize(dest_key)); + pool_->reset(key_id, Helper<T>::normalize(dest_key)); return true; } @@ -150,8 +144,8 @@ template <typename T> bool ArrayMap<T>::find(KeyArg key, int64_t *key_id) { const Key normalized_key = map::Helper<T>::normalize(key); for (int64_t i = MAP_MIN_KEY_ID; i <= max_key_id(); ++i) { - if (keys_->get_bit(i)) { - Key stored_key = keys_->get_key(i); + Key stored_key; + if (pool_->get(i, &stored_key)) { if (Helper<T>::equal_to(normalized_key, stored_key)) { // Found. if (key_id) { @@ -168,8 +162,8 @@ template <typename T> bool ArrayMap<T>::add(KeyArg key, int64_t *key_id) { const Key normalized_key = Helper<T>::normalize(key); for (int64_t i = MAP_MIN_KEY_ID; i <= max_key_id(); ++i) { - if (keys_->get_bit(i)) { - Key stored_key = keys_->get_key(i); + Key stored_key; + if (pool_->get(i, &stored_key)) { if (Helper<T>::equal_to(normalized_key, stored_key)) { // Found. if (key_id) { @@ -180,9 +174,9 @@ bool ArrayMap<T>::add(KeyArg key, int64_t *key_id) { } } if (key_id) { - *key_id = keys_->add(normalized_key); + *key_id = pool_->add(normalized_key); } else { - keys_->add(normalized_key); + pool_->add(normalized_key); } return true; } @@ -194,11 +188,7 @@ bool ArrayMap<T>::remove(KeyArg key) { // Not found. return false; } - if (!keys_->unset(key_id)) { - GRNXX_ERROR() << "failed to remove: key = " << key - << ", key_id = " << key_id; - throw LogicError(); - } + pool_->unset(key_id); return true; } @@ -208,8 +198,8 @@ bool ArrayMap<T>::replace(KeyArg src_key, KeyArg dest_key, int64_t *key_id) { const Key normalized_dest_key = Helper<T>::normalize(dest_key); int64_t src_key_id = MAP_INVALID_KEY_ID; for (int64_t i = MAP_MIN_KEY_ID; i <= max_key_id(); ++i) { - if (keys_->get_bit(i)) { - Key stored_key = keys_->get_key(i); + Key stored_key; + if (pool_->get(i, &stored_key)) { if (Helper<T>::equal_to(normalized_src_key, stored_key)) { // Source key found. src_key_id = i; @@ -224,7 +214,7 @@ bool ArrayMap<T>::replace(KeyArg src_key, KeyArg dest_key, int64_t *key_id) { // Not found. return false; } - keys_->reset(src_key_id, normalized_dest_key); + pool_->reset(src_key_id, normalized_dest_key); if (key_id) { *key_id = src_key_id; } @@ -233,7 +223,7 @@ bool ArrayMap<T>::replace(KeyArg src_key, KeyArg dest_key, int64_t *key_id) { template <typename T> bool ArrayMap<T>::truncate() { - keys_->truncate(); + pool_->truncate(); return true; } @@ -247,8 +237,8 @@ void ArrayMap<T>::create_map(Storage *storage, uint32_t storage_node_id, try { header_ = static_cast<Header *>(storage_node.body()); *header_ = Header(); - keys_.reset(KeyStore<T>::create(storage, storage_node_id_)); - header_->keys_storage_node_id = keys_->storage_node_id(); + pool_.reset(KeyPool<T>::create(storage, storage_node_id_)); + header_->pool_storage_node_id = pool_->storage_node_id(); } catch (...) { storage->unlink_node(storage_node_id_); throw; @@ -271,7 +261,7 @@ void ArrayMap<T>::open_map(Storage *storage, uint32_t storage_node_id) { << ", actual = " << header_->common_header.format(); throw LogicError(); } - keys_.reset(KeyStore<T>::open(storage, header_->keys_storage_node_id)); + pool_.reset(KeyPool<T>::open(storage, header_->pool_storage_node_id)); } template class ArrayMap<int8_t>; Modified: lib/grnxx/map/array_map.hpp (+3 -2) =================================================================== --- lib/grnxx/map/array_map.hpp 2013-07-24 14:26:30 +0900 (e924c0a) +++ lib/grnxx/map/array_map.hpp 2013-07-24 14:35:55 +0900 (78c4166) @@ -23,7 +23,6 @@ #include <memory> #include "grnxx/map.hpp" -#include "grnxx/map/key_store.hpp" #include "grnxx/types.hpp" namespace grnxx { @@ -32,6 +31,8 @@ class Storage; namespace map { +template <typename T> class KeyPool; + struct ArrayMapHeader; template <typename T> @@ -71,7 +72,7 @@ class ArrayMap : public Map<T> { Storage *storage_; uint32_t storage_node_id_; Header *header_; - std::unique_ptr<KeyStore<T>> keys_; + std::unique_ptr<KeyPool<T>> pool_; void create_map(Storage *storage, uint32_t storage_node_id, const MapOptions &options); -------------- next part -------------- HTML����������������������������...Download