[gnumeric] Deps: avoid a function call layer using hash iteration.



commit 04dc9534e1c2f51ab9fe87175709d4dd9ffd1993
Author: Morten Welinder <terra gnome org>
Date:   Wed Jul 1 19:53:24 2020 -0400

    Deps: avoid a function call layer using hash iteration.

 src/dependent.c | 53 +++++++++++++++++------------------------------------
 1 file changed, 17 insertions(+), 36 deletions(-)
---
diff --git a/src/dependent.c b/src/dependent.c
index d20eb37b2..e2cf90074 100644
--- a/src/dependent.c
+++ b/src/dependent.c
@@ -1877,47 +1877,28 @@ cell_queue_recalc (GnmCell *cell)
        }
 }
 
-typedef struct {
-       int col, row;
-       GnmDepFunc func;
-       gpointer user;
-} search_rangedeps_closure_t;
-
 static void
-cb_search_rangedeps (gpointer key, G_GNUC_UNUSED gpointer value,
-                    gpointer closure)
+cell_foreach_range_dep (GnmCell const *cell, GnmDepFunc func, gpointer user)
 {
-       search_rangedeps_closure_t const *c = closure;
-       DependencyRange const *deprange = key;
-       GnmRange const *range = &(deprange->range);
+       Sheet *sheet = cell->base.sheet;
+       GHashTable *bucket =
+               sheet->deps->range_hash[BUCKET_OF_ROW (cell->pos.row)];
+       GHashTableIter hiter;
+       gpointer key;
 
-#if 0
-       /* When things get slow this is a good test to enable */
-       static int counter = 0;
-       if ((++counter % 100000) == 0)
-               g_printerr ("%d\n", counter / 100000);
-#endif
+       if (!bucket)
+               return;
 
-       if (range_contains (range, c->col, c->row)) {
-               GnmDepFunc func = c->func;
-               micro_hash_foreach_dep (deprange->deps, dep,
-                       (func) (dep, c->user););
-       }
-}
+       g_hash_table_iter_init (&hiter, bucket);
+       while (g_hash_table_iter_next (&hiter, &key, NULL)) {
+               DependencyRange const *deprange = key;
+               GnmRange const *range = &(deprange->range);
 
-static void
-cell_foreach_range_dep (GnmCell const *cell, GnmDepFunc func, gpointer user)
-{
-       search_rangedeps_closure_t closure;
-       GHashTable *bucket =
-               cell->base.sheet->deps->range_hash[BUCKET_OF_ROW (cell->pos.row)];
-
-       if (bucket != NULL) {
-               closure.col = cell->pos.col;
-               closure.row = cell->pos.row;
-               closure.func = func;
-               closure.user = user;
-               g_hash_table_foreach (bucket, &cb_search_rangedeps, &closure);
+               if (!range_contains (range, cell->pos.col, cell->pos.row))
+                       continue;
+
+               micro_hash_foreach_dep (deprange->deps, dep,
+                                       func (dep, user););
        }
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]