diff options
author | jasone <jasone@FreeBSD.org> | 2007-06-15 16:09:47 +0000 |
---|---|---|
committer | jasone <jasone@FreeBSD.org> | 2007-06-15 16:09:47 +0000 |
commit | dcc9802ef6b74cfc276ccdfaaaea24c8877eb7d1 (patch) | |
tree | 54cf7425c7a8495f1304e8ddc501258851bb8646 /sys/sys/tree.h | |
parent | 2028ab4002b69bb02994c53f76c70975ddb3a23a (diff) | |
download | FreeBSD-src-dcc9802ef6b74cfc276ccdfaaaea24c8877eb7d1.zip FreeBSD-src-dcc9802ef6b74cfc276ccdfaaaea24c8877eb7d1.tar.gz |
Simplify/optimize RB_NFIND().
Submitted by: Andriy Gapon <avg@icyb.net.ua>
Diffstat (limited to 'sys/sys/tree.h')
-rw-r--r-- | sys/sys/tree.h | 30 |
1 files changed, 11 insertions, 19 deletions
diff --git a/sys/sys/tree.h b/sys/sys/tree.h index c2157ee..3af9a2b 100644 --- a/sys/sys/tree.h +++ b/sys/sys/tree.h @@ -643,29 +643,21 @@ name##_RB_FIND(struct name *head, struct type *elm) \ attr struct type * \ name##_RB_NFIND(struct name *head, struct type *elm) \ { \ - struct type *ret = RB_ROOT(head); \ - struct type *tmp; \ + struct type *tmp = RB_ROOT(head); \ + struct type *res = NULL; \ int comp; \ - while (ret && (comp = cmp(elm, ret)) != 0) { \ + while (tmp) { \ + comp = cmp(elm, tmp); \ if (comp < 0) { \ - if ((tmp = RB_LEFT(ret, field)) == NULL) \ - break; \ - ret = tmp; \ - } else { \ - if ((tmp = RB_RIGHT(ret, field)) == NULL) { \ - tmp = ret; \ - ret = RB_PARENT(ret, field); \ - while (ret && tmp == RB_RIGHT(ret, \ - field)) { \ - tmp = ret; \ - ret = RB_PARENT(ret, field); \ - } \ - break; \ - } \ - ret = tmp; \ + res = tmp; \ + tmp = RB_LEFT(tmp, field); \ } \ + else if (comp > 0) \ + tmp = RB_RIGHT(tmp, field); \ + else \ + return (tmp); \ } \ - return (ret); \ + return (res); \ } \ \ /* ARGSUSED */ \ |