changeset 40002:17b50b81745a

array-set: Optimize. * lib/gl_array_set.c (gl_array_search, gl_array_remove): Test equals_fn outside the loop, not inside the loop.
author Bruno Haible <bruno@clisp.org>
date Tue, 11 Dec 2018 20:43:22 +0100
parents a8842ede7b0d
children faeefa5587bc
files ChangeLog lib/gl_array_set.c
diffstat 2 files changed, 43 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Tue Dec 11 20:21:52 2018 +0100
+++ b/ChangeLog	Tue Dec 11 20:43:22 2018 +0100
@@ -1,3 +1,9 @@
+2018-12-11  Bruno Haible  <bruno@clisp.org>
+
+	array-set: Optimize.
+	* lib/gl_array_set.c (gl_array_search, gl_array_remove): Test equals_fn
+	outside the loop, not inside the loop.
+
 2018-12-11  Bruno Haible  <bruno@clisp.org>
 
 	times: Fix tests.
--- a/lib/gl_array_set.c	Tue Dec 11 20:21:52 2018 +0100
+++ b/lib/gl_array_set.c	Tue Dec 11 20:43:22 2018 +0100
@@ -79,11 +79,22 @@
     {
       gl_setelement_equals_fn equals = set->base.equals_fn;
       const void **elements = set->elements;
-      size_t i;
+      if (equals != NULL)
+        {
+          size_t i;
 
-      for (i = 0; i < count; i++)
-        if (equals != NULL ? equals (elements[i], elt) : elements[i] == elt)
-          return true;
+          for (i = 0; i < count; i++)
+            if (equals (elements[i], elt))
+              return true;
+        }
+      else
+        {
+          size_t i;
+
+          for (i = 0; i < count; i++)
+            if (elements[i] == elt)
+              return true;
+        }
     }
   return false;
 }
@@ -155,14 +166,29 @@
     {
       gl_setelement_equals_fn equals = set->base.equals_fn;
       const void **elements = set->elements;
-      size_t i;
+
+      if (equals != NULL)
+        {
+          size_t i;
 
-      for (i = 0; i < count; i++)
-        if (equals != NULL ? equals (elements[i], elt) : elements[i] == elt)
-          {
-            gl_array_remove_at (set, i);
-            return true;
-          }
+          for (i = 0; i < count; i++)
+            if (equals (elements[i], elt))
+              {
+                gl_array_remove_at (set, i);
+                return true;
+              }
+        }
+      else
+        {
+          size_t i;
+
+          for (i = 0; i < count; i++)
+            if (elements[i] == elt)
+              {
+                gl_array_remove_at (set, i);
+                return true;
+              }
+        }
     }
   return false;
 }