[Groonga-commit] groonga/grnxx at 697844a [master] Remove grnxx::map::ArrayMapHeader::next_key_id.

アーカイブの一覧に戻る

susumu.yata null+****@clear*****
Fri May 31 15:21:18 JST 2013


susumu.yata	2013-05-31 15:21:18 +0900 (Fri, 31 May 2013)

  New Revision: 697844ab13b2a55d14747a64cac384a3efacc61b
  https://github.com/groonga/grnxx/commit/697844ab13b2a55d14747a64cac384a3efacc61b

  Message:
    Remove grnxx::map::ArrayMapHeader::next_key_id.

  Modified files:
    lib/grnxx/map/array_map.cpp

  Modified: lib/grnxx/map/array_map.cpp (+11 -15)
===================================================================
--- lib/grnxx/map/array_map.cpp    2013-05-31 15:13:47 +0900 (b927f0a)
+++ lib/grnxx/map/array_map.cpp    2013-05-31 15:21:18 +0900 (ddb77f6)
@@ -32,7 +32,6 @@ struct ArrayMapHeader {
   uint32_t bitmap_storage_node_id;
   uint32_t keys_storage_node_id;
   int64_t max_key_id;
-  int64_t next_key_id;
   uint64_t num_keys;
 
   ArrayMapHeader();
@@ -43,7 +42,6 @@ ArrayMapHeader::ArrayMapHeader()
       bitmap_storage_node_id(STORAGE_INVALID_NODE_ID),
       keys_storage_node_id(STORAGE_INVALID_NODE_ID),
       max_key_id(MAP_MIN_KEY_ID - 1),
-      next_key_id(MAP_MIN_KEY_ID),
       num_keys(0) {}
 
 template <typename T>
@@ -148,7 +146,6 @@ bool ArrayMap<T>::unset(int64_t key_id) {
   if (!bitmap_->set(key_id, false)) {
     return false;
   }
-  header_->next_key_id = key_id;
   --header_->num_keys;
   return true;
 }
@@ -196,8 +193,7 @@ bool ArrayMap<T>::find(KeyArg key, int64_t *key_id) {
 template <typename T>
 bool ArrayMap<T>::add(KeyArg key, int64_t *key_id) {
   const Key normalized_key = Helper<T>::normalize(key);
-  int64_t next_key_id = header_->next_key_id;
-  int64_t next_next_key_id = MAP_INVALID_KEY_ID;
+  int64_t next_key_id = MAP_INVALID_KEY_ID;
   for (int64_t i = MAP_MIN_KEY_ID; i <= header_->max_key_id; ++i) {
     bool bit;
     if (!bitmap_->get(i, &bit)) {
@@ -215,9 +211,16 @@ bool ArrayMap<T>::add(KeyArg key, int64_t *key_id) {
 //        GRNXX_WARNING() << "found: key = " << key;
         return false;
       }
-    } else if ((i != next_key_id) &&
-               (next_next_key_id == MAP_INVALID_KEY_ID)) {
-      next_next_key_id = i;
+    } else if (next_key_id == MAP_INVALID_KEY_ID) {
+      next_key_id = i;
+    }
+  }
+  if (next_key_id == MAP_INVALID_KEY_ID) {
+    next_key_id = header_->max_key_id + 1;
+    if (next_key_id > MAP_MAX_KEY_ID) {
+      GRNXX_ERROR() << "too many keys: next_key_id = " << next_key_id
+                    << ", max_key_id = " << MAP_MAX_KEY_ID;
+      return false;
     }
   }
   if (!keys_->set(next_key_id, normalized_key) ||
@@ -227,11 +230,6 @@ bool ArrayMap<T>::add(KeyArg key, int64_t *key_id) {
   if (next_key_id == (header_->max_key_id + 1)) {
     ++header_->max_key_id;
   }
-  if (next_next_key_id == MAP_INVALID_KEY_ID) {
-    header_->next_key_id = header_->max_key_id + 1;
-  } else {
-    header_->next_key_id = next_next_key_id;
-  }
   ++header_->num_keys;
   if (key_id) {
     *key_id = next_key_id;
@@ -249,7 +247,6 @@ bool ArrayMap<T>::remove(KeyArg key) {
   if (!bitmap_->set(key_id, false)) {
     return false;
   }
-  header_->next_key_id = key_id;
   --header_->num_keys;
   return true;
 }
@@ -294,7 +291,6 @@ bool ArrayMap<T>::replace(KeyArg src_key, KeyArg dest_key, int64_t *key_id) {
 template <typename T>
 bool ArrayMap<T>::truncate() {
   header_->max_key_id = MAP_MIN_KEY_ID - 1;
-  header_->next_key_id = MAP_MIN_KEY_ID;
   header_->num_keys = 0;
   return true;
 }
-------------- next part --------------
HTML����������������������������...
ダウンロード 



More information about the Groonga-commit mailing list
アーカイブの一覧に戻る