[Groonga-commit] groonga/grnxx at d766e48 [master] Update grnxx::map::HashTable to use grnxx::map::KeyPool.

Back to archive index

susumu.yata null+****@clear*****
Wed Jul 24 15:31:59 JST 2013


susumu.yata	2013-07-24 15:31:59 +0900 (Wed, 24 Jul 2013)

  New Revision: d766e48b33cf7152b90c8219f2d4c6a86ca6e7e4
  https://github.com/groonga/grnxx/commit/d766e48b33cf7152b90c8219f2d4c6a86ca6e7e4

  Message:
    Update grnxx::map::HashTable to use grnxx::map::KeyPool.

  Modified files:
    lib/grnxx/map/hash_table.cpp
    lib/grnxx/map/hash_table.hpp

  Modified: lib/grnxx/map/hash_table.cpp (+19 -32)
===================================================================
--- lib/grnxx/map/hash_table.cpp    2013-07-24 14:35:55 +0900 (a49f811)
+++ lib/grnxx/map/hash_table.cpp    2013-07-24 15:31:59 +0900 (995cff2)
@@ -28,6 +28,7 @@
 #include "grnxx/map/common_header.hpp"
 #include "grnxx/map/hash.hpp"
 #include "grnxx/map/helper.hpp"
+#include "grnxx/map/key_pool.hpp"
 #include "grnxx/mutex.hpp"
 #include "grnxx/storage.hpp"
 
@@ -48,7 +49,7 @@ struct HashTableHeader {
   CommonHeader common_header;
   uint32_t key_ids_storage_node_id;
   uint32_t old_key_ids_storage_node_id;
-  uint32_t keys_storage_node_id;
+  uint32_t pool_storage_node_id;
   uint64_t num_key_ids;
   Mutex mutex;
 
@@ -63,7 +64,7 @@ HashTableHeader::HashTableHeader()
     : common_header(FORMAT_STRING, MAP_HASH_TABLE),
       key_ids_storage_node_id(STORAGE_INVALID_NODE_ID),
       old_key_ids_storage_node_id(STORAGE_INVALID_NODE_ID),
-      keys_storage_node_id(STORAGE_INVALID_NODE_ID),
+      pool_storage_node_id(STORAGE_INVALID_NODE_ID),
       num_key_ids(0),
       mutex() {}
 
@@ -78,7 +79,7 @@ HashTable<T>::HashTable()
       header_(nullptr),
       key_ids_(),
       old_key_ids_(),
-      keys_() {}
+      pool_() {}
 
 template <typename T>
 HashTable<T>::~HashTable() {}
@@ -118,12 +119,12 @@ MapType HashTable<T>::type() const {
 
 template <typename T>
 int64_t HashTable<T>::max_key_id() const {
-  return keys_->max_key_id();
+  return pool_->max_key_id();
 }
 
 template <typename T>
 uint64_t HashTable<T>::num_keys() const {
-  return keys_->num_keys();
+  return pool_->num_keys();
 }
 
 template <typename T>
@@ -132,14 +133,7 @@ bool HashTable<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>
@@ -150,10 +144,7 @@ bool HashTable<T>::unset(int64_t key_id) {
     // Not found.
     return false;
   }
-  if (!keys_->unset(key_id)) {
-    GRNXX_ERROR() << "failed to unset: key_id = " << key_id;
-    throw LogicError();
-  }
+  pool_->unset(key_id);
   *stored_key_id = TABLE_ENTRY_REMOVED;
   return true;
 }
@@ -177,7 +168,7 @@ bool HashTable<T>::reset(int64_t key_id, KeyArg dest_key) {
     // Found.
     return false;
   }
-  keys_->reset(key_id, dest_normalized_key);
+  pool_->reset(key_id, dest_normalized_key);
   if (*dest_key_id == TABLE_ENTRY_UNUSED) {
     ++header_->num_key_ids;
   }
@@ -221,7 +212,7 @@ bool HashTable<T>::add(KeyArg key, int64_t *key_id) {
     // Error.
     return false;
   }
-  int64_t next_key_id = keys_->add(normalized_key);
+  int64_t next_key_id = pool_->add(normalized_key);
   if (*stored_key_id == TABLE_ENTRY_UNUSED) {
     ++header_->num_key_ids;
   }
@@ -241,11 +232,7 @@ bool HashTable<T>::remove(KeyArg key) {
     // Not found.
     return false;
   }
-  if (!keys_->unset(*stored_key_id)) {
-    GRNXX_ERROR() << "failed to remove: key = " << key
-                  << ", key_id = " << *stored_key_id;
-    throw LogicError();
-  }
+  pool_->unset(*stored_key_id);
   *stored_key_id = TABLE_ENTRY_REMOVED;
   return true;
 }
@@ -265,7 +252,7 @@ bool HashTable<T>::replace(KeyArg src_key, KeyArg dest_key, int64_t *key_id) {
     // Found.
     return false;
   }
-  keys_->reset(*src_key_id, dest_normalized_key);
+  pool_->reset(*src_key_id, dest_normalized_key);
   if (*dest_key_id == TABLE_ENTRY_UNUSED) {
     ++header_->num_key_ids;
   }
@@ -293,7 +280,7 @@ bool HashTable<T>::truncate() {
     KeyIDArray::unlink(storage_, new_key_ids->storage_node_id());
     throw;
   }
-  keys_->truncate();
+  pool_->truncate();
   header_->num_key_ids = 0;
   header_->old_key_ids_storage_node_id = header_->key_ids_storage_node_id;
   header_->key_ids_storage_node_id = new_key_ids->storage_node_id();
@@ -317,9 +304,9 @@ void HashTable<T>::create_map(Storage *storage, uint32_t storage_node_id,
     *header_ = Header();
     key_ids_.reset(KeyIDArray::create(storage, storage_node_id_,
                                       MIN_TABLE_SIZE, TABLE_ENTRY_UNUSED));
-    keys_.reset(KeyStore<T>::create(storage, storage_node_id_));
+    pool_.reset(KeyPool<T>::create(storage, storage_node_id_));
     header_->key_ids_storage_node_id = key_ids_->storage_node_id();
-    header_->keys_storage_node_id = keys_->storage_node_id();
+    header_->pool_storage_node_id = pool_->storage_node_id();
   } catch (...) {
     storage->unlink_node(storage_node_id_);
     throw;
@@ -343,7 +330,7 @@ void HashTable<T>::open_map(Storage *storage, uint32_t storage_node_id) {
     throw LogicError();
   }
   key_ids_.reset(KeyIDArray::open(storage, header_->key_ids_storage_node_id));
-  keys_.reset(KeyStore<T>::open(storage, header_->keys_storage_node_id));
+  pool_.reset(KeyPool<T>::open(storage, header_->pool_storage_node_id));
 }
 
 template <typename T>
@@ -389,7 +376,7 @@ bool HashTable<T>::find_key(KeyArg key, int64_t **stored_key_id) {
         *stored_key_id = key_id;
       }
     } else {
-      Key stored_key = keys_->get_key(*key_id);
+      Key stored_key = pool_->get_key(*key_id);
       if (Helper<T>::equal_to(stored_key, key)) {
         // Found.
         *stored_key_id = key_id;
@@ -428,10 +415,10 @@ void HashTable<T>::rebuild() {
     const uint64_t new_mask = new_size - 1;
     int64_t key_id;
     for (key_id = MAP_MIN_KEY_ID; key_id <= max_key_id(); ++key_id) {
-      if (!keys_->get_bit(key_id)) {
+      Key stored_key;
+      if (!pool_->get(key_id, &stored_key)) {
         continue;
       }
-      Key stored_key = keys_->get_key(key_id);
       const uint64_t first_hash = Hash<T>()(stored_key);
       int64_t *stored_key_id;
       for (uint64_t hash = first_hash; ; hash = rehash(hash)) {

  Modified: lib/grnxx/map/hash_table.hpp (+4 -2)
===================================================================
--- lib/grnxx/map/hash_table.hpp    2013-07-24 14:35:55 +0900 (cefba41)
+++ lib/grnxx/map/hash_table.hpp    2013-07-24 15:31:59 +0900 (adb545c)
@@ -22,8 +22,8 @@
 
 #include <memory>
 
+#include "grnxx/array.hpp"
 #include "grnxx/map.hpp"
-#include "grnxx/map/key_store.hpp"
 #include "grnxx/types.hpp"
 
 namespace grnxx {
@@ -32,6 +32,8 @@ class Storage;
 
 namespace map {
 
+template <typename T> class KeyPool;
+
 struct HashTableHeader;
 
 template <typename T>
@@ -74,7 +76,7 @@ class HashTable : public Map<T> {
   Header *header_;
   std::unique_ptr<KeyIDArray> key_ids_;
   std::unique_ptr<KeyIDArray> old_key_ids_;
-  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 



More information about the Groonga-commit mailing list
Back to archive index