bug-gnulib
[Top][All Lists]
Advanced

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

Re: generic container for sets


From: Bruno Haible
Subject: Re: generic container for sets
Date: Tue, 11 Dec 2018 20:44:31 +0100
User-agent: KMail/5.1.3 (Linux/4.4.0-138-generic; KDE/5.18.0; x86_64; ; )

A small optimization.


2018-12-11  Bruno Haible  <address@hidden>

        array-set: Optimize.
        * lib/gl_array_set.c (gl_array_search, gl_array_remove): Test equals_fn
        outside the loop, not inside the loop.

diff --git a/lib/gl_array_set.c b/lib/gl_array_set.c
index dd77ef1..8e985af 100644
--- a/lib/gl_array_set.c
+++ b/lib/gl_array_set.c
@@ -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;
 }




reply via email to

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