From dcc9802ef6b74cfc276ccdfaaaea24c8877eb7d1 Mon Sep 17 00:00:00 2001 From: jasone Date: Fri, 15 Jun 2007 16:09:47 +0000 Subject: [PATCH] Simplify/optimize RB_NFIND(). Submitted by: Andriy Gapon --- sys/sys/tree.h | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/sys/sys/tree.h b/sys/sys/tree.h index c2157eea488a..3af9a2b14406 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 */ \