[Groonga-commit] groonga/groonga [master] Add grn_array_get_value_inline() to skip grn_array_bitmap_at().

Back to archive index

null+****@clear***** null+****@clear*****
2012年 4月 3日 (火) 15:37:35 JST


Susumu Yata	2012-04-03 15:37:35 +0900 (Tue, 03 Apr 2012)

  New Revision: ac543027b0cfae095c68303fe26392b41f48c25f

  Log:
    Add grn_array_get_value_inline() to skip grn_array_bitmap_at().

  Modified files:
    lib/hash.c

  Modified: lib/hash.c (+35 -21)
===================================================================
--- lib/hash.c    2012-04-03 13:53:46 +0900 (938e398)
+++ lib/hash.c    2012-04-03 15:37:35 +0900 (b324e70)
@@ -505,38 +505,50 @@ grn_array_truncate(grn_ctx *ctx, grn_array *array)
   return rc;
 }
 
-int
-grn_array_get_value(grn_ctx *ctx, grn_array *array, grn_id id, void *valuebuf)
+inline static grn_id
+grn_array_get_max_id(grn_array *array)
 {
-  if (ctx && array) {
-    if (grn_array_bitmap_at(ctx, array, id) == 1) {
-      void * const entry = grn_array_entry_at(ctx, array, id, 0);
-      if (entry) {
-        if (valuebuf) {
-          memcpy(valuebuf, entry, array->value_size);
-        }
-        return array->value_size;
-      }
+  return grn_array_is_io_array(array) ? array->header->curr_rec : array->array.max;
+}
+
+inline static void *
+grn_array_get_value_inline(grn_ctx *ctx, grn_array *array, grn_id id)
+{
+  if (!ctx || !array) {
+    return NULL;
+  }
+  if (id == 0 || id > grn_array_get_max_id(array)) {
+    return NULL;
+  }
+  if (*array->n_garbages) {
+    /*
+     * grn_array_bitmap_at() is a time-consuming function, so it is called only
+     * when there are garbages in the array.
+     */
+    if (grn_array_bitmap_at(ctx, array, id) != 1) {
+      return NULL;
     }
   }
-  return 0;
+  return grn_array_entry_at(ctx, array, id, 0);
 }
 
-inline static grn_id
-grn_array_get_max_id(grn_array *array)
+int
+grn_array_get_value(grn_ctx *ctx, grn_array *array, grn_id id, void *valuebuf)
 {
-  return grn_array_is_io_array(array) ? array->header->curr_rec : array->array.max;
+  void * const value = grn_array_get_value_inline(ctx, array, id);
+  if (value) {
+    if (valuebuf) {
+      memcpy(valuebuf, value, array->value_size);
+    }
+    return array->value_size;
+  }
+  return 0;
 }
 
 void *
 _grn_array_get_value(grn_ctx *ctx, grn_array *array, grn_id id)
 {
-  if (ctx && array) {
-    if (grn_array_bitmap_at(ctx, array, id) == 1) {
-      return grn_array_entry_at(ctx, array, id, 0);
-    }
-  }
-  return NULL;
+  return grn_array_get_value_inline(ctx, array, id);
 }
 
 grn_rc
@@ -546,6 +558,7 @@ grn_array_set_value(grn_ctx *ctx, grn_array *array, grn_id id,
   if (!ctx || !array || !value) {
     return GRN_INVALID_ARGUMENT;
   }
+  /* TODO: Use *n_garbages to skip grn_array_bitmap_at(). */
   if (grn_array_bitmap_at(ctx, array, id) != 1) {
     return GRN_INVALID_ARGUMENT;
   }
@@ -655,6 +668,7 @@ grn_array_delete_by_id(grn_ctx *ctx, grn_array *array, grn_id id,
 grn_id
 grn_array_at(grn_ctx *ctx, grn_array *array, grn_id id)
 {
+  /* TODO: Use *n_garbages to skip grn_array_bitmap_at(). */
   return (grn_array_bitmap_at(ctx, array, id) == 1) ? id : GRN_ID_NIL;
 }
 




Groonga-commit メーリングリストの案内
Back to archive index