Mercurial > gnulib
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; }