--- src/sys/sys/tree.h 2006/03/28 22:17:05 1.5 +++ src/sys/sys/tree.h 2007/04/19 19:06:01 1.6 @@ -417,6 +417,10 @@ struct type *name##_RB_RLOOKUP(struct na RB_PROTOTYPE2(name, type, field, cmp, datatype); \ struct type *name##_RB_RLOOKUP(struct name *, datatype) \ +#define RB_PROTOTYPEX(name, type, field, cmp, rcmp, datatype) \ +RB_PROTOTYPE2(name, type, field, cmp, datatype); \ +struct type *name##_RB_RLOOKUP(struct name *, datatype) \ + /* Main rb operation. * Moves node close to the key of elm to top */ @@ -876,6 +880,32 @@ name##_RB_RLOOKUP(struct name *head, dat tmp = RB_RIGHT(tmp, field); \ else \ tmp = RB_LEFT(tmp, field); \ + } \ + return(NULL); \ +} \ + +/* + * The 'X' version adds a generic ranged function using a callback instead + * of fixed functions. + */ +#define RB_GENERATEX(name, type, field, cmp, rcmp, datatype, begfield) \ +RB_GENERATE2(name, type, field, cmp, datatype, begfield) \ + \ +struct type * \ +name##_RB_RLOOKUP(struct name *head, datatype value) \ +{ \ + struct type *tmp; \ + int r; \ + \ + tmp = RB_ROOT(head); \ + while (tmp) { \ + r = rcmp(value, tmp); \ + if (r == 0) \ + return(tmp); \ + if (r > 0) \ + tmp = RB_RIGHT(tmp, field); \ + else \ + tmp = RB_LEFT(tmp, field); \ } \ return(NULL); \ } \