[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;
}