]> Savannah Git Hosting - gnulib.git/commitdiff
array-set: Optimize.
authorBruno Haible <bruno@clisp.org>
Tue, 11 Dec 2018 19:43:22 +0000 (20:43 +0100)
committerBruno Haible <bruno@clisp.org>
Tue, 11 Dec 2018 19:43:22 +0000 (20:43 +0100)
* lib/gl_array_set.c (gl_array_search, gl_array_remove): Test equals_fn
outside the loop, not inside the loop.

ChangeLog
lib/gl_array_set.c

index 82e3a499cc111547c8acdad3ab624e76f7aba6ff..787d538cef839c5a1764398fc77660e720161b82 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
index dd77ef13be261202cf1f68d48d82198413a7eb20..8e985affc81ef8bf6198b5f80eeca85bd24f2677 100644 (file)
@@ -79,11 +79,22 @@ gl_array_search (gl_set_t set, const void *elt)
     {
       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_array_remove (gl_set_t set, const void *elt)
     {
       gl_setelement_equals_fn equals = set->base.equals_fn;
       const void **elements = set->elements;
-      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;
-          }
+
+      if (equals != NULL)
+        {
+          size_t i;
+
+          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;
 }