poke-devel
[Top][All Lists]
Advanced

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

[PATCH 2/4] Add iterators to loop over pkl_env


From: John Darrington
Subject: [PATCH 2/4] Add iterators to loop over pkl_env
Date: Thu, 14 Nov 2019 13:26:49 +0100

        * src/pkl-env.h (pkl_ast_node_iter): New struct.
        (pkl_env_iter_begin): New declaration.
        (pkl_env_iter_next): New declaration.
        (pkl_env_iter_end): New declaration.
        * src/pkl-env.c (pkl_env_iter_begin): New function.
        (pkl_env_iter_next): New function.
        (pkl_env_iter_end): New function.
        (pkl_env_map_decls): Use them to implement this function.
---
 ChangeLog     | 11 +++++++++++
 src/pkl-env.c | 52 +++++++++++++++++++++++++++++++++++++++++-----------
 src/pkl-env.h | 13 +++++++++++++
 3 files changed, 65 insertions(+), 11 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 7050cd3..654ed62 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,16 @@
 2019-11-13 John Darrington <address@hidden>
 
+       * src/pkl-env.h (pkl_ast_node_iter): New struct.
+       (pkl_env_iter_begin): New declaration.
+       (pkl_env_iter_next): New declaration.
+       (pkl_env_iter_end): New declaration.
+       * src/pkl-env.c (pkl_env_iter_begin): New function.
+       (pkl_env_iter_next): New function.
+       (pkl_env_iter_end): New function.
+       (pkl_env_map_decls): Use them to implement this function.
+
+2019-11-13 John Darrington <address@hidden>
+
        * src/pk-cmd.c (cmds): Rename to dot_cmds.
        (pk_cmd_init): Deal with the consequences.
 
diff --git a/src/pkl-env.c b/src/pkl-env.c
index 7a315e5..b277458 100644
--- a/src/pkl-env.c
+++ b/src/pkl-env.c
@@ -229,23 +229,53 @@ pkl_env_toplevel_p (pkl_env env)
 }
 
 void
+pkl_env_iter_begin (pkl_env env, struct pkl_ast_node_iter *iter)
+{
+  iter->bin = 0;
+  iter->node = env->hash_table[iter->bin];
+  while (iter->node == NULL)
+    {
+      iter->bin++;
+      if (iter->bin >= HASH_TABLE_SIZE)
+       break;
+      iter->node = env->hash_table[iter->bin];
+    }
+}
+
+void
+pkl_env_iter_next (pkl_env env, struct pkl_ast_node_iter *iter)
+{
+  assert (iter->node != NULL);
+
+  iter->node = PKL_AST_CHAIN2 (iter->node);
+  while (iter->node == NULL)
+    {
+      iter->bin++;
+      if (iter->bin >= HASH_TABLE_SIZE)
+       break;
+      iter->node = env->hash_table[iter->bin];
+    }
+}
+
+bool
+pkl_env_iter_end (pkl_env env, const struct pkl_ast_node_iter *iter)
+{
+  return iter->bin >= HASH_TABLE_SIZE;
+}
+
+void
 pkl_env_map_decls (pkl_env env,
                    int what,
                    pkl_map_decl_fn cb,
                    void *data)
 {
-  int i;
-
-  for (i = 0; i < HASH_TABLE_SIZE; ++i)
+  struct pkl_ast_node_iter iter;
+  for (pkl_env_iter_begin (env, &iter); !pkl_env_iter_end (env, &iter);
+       pkl_env_iter_next (env, &iter))
     {
-      pkl_ast_node t = env->hash_table[i];
-
-      for (; t; t = PKL_AST_CHAIN2 (t))
-        {
-          if ((what == PKL_AST_DECL_KIND_ANY
-               || what == PKL_AST_DECL_KIND (t)))
-            cb (t, data);
-        }
+      if ((what == PKL_AST_DECL_KIND_ANY
+          || what == PKL_AST_DECL_KIND (iter.node)))
+       cb (iter.node, data);
     }
 }
 
diff --git a/src/pkl-env.h b/src/pkl-env.h
index 75b3a89..503e30a 100644
--- a/src/pkl-env.h
+++ b/src/pkl-env.h
@@ -122,4 +122,17 @@ void pkl_env_map_decls (pkl_env env,
 
 pkl_env pkl_env_dup_toplevel (pkl_env env);
 
+
+struct pkl_ast_node_iter
+{
+  int bin;           /* The bin in which this node resides.  */
+  pkl_ast_node node; /* A pointer to the node itself.  */
+};
+
+
+void pkl_env_iter_begin (pkl_env env, struct pkl_ast_node_iter *iter);
+void pkl_env_iter_next (pkl_env env, struct pkl_ast_node_iter *iter);
+bool pkl_env_iter_end (pkl_env env, const struct pkl_ast_node_iter *iter);
+
+
 #endif /* !PKL_ENV_H  */
-- 
2.11.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]