tree(3): allow the compare function to return any signed type
This allows to write very short comparison function when we are comparing just pointer values: return ((intptr_t)((uintptr_t)a->ptr/2 - (uintptr_t)b->ptr/2)); Reviewed by: dougm, alc Differential revision: https://reviews.freebsd.org/D35722
This commit is contained in:
parent
1b91978f63
commit
86cdadbed4
@ -176,7 +176,7 @@ name##_SPLAY_INSERT(struct name *head, struct type *elm) \
|
||||
if (SPLAY_EMPTY(head)) { \
|
||||
SPLAY_LEFT(elm, field) = SPLAY_RIGHT(elm, field) = NULL; \
|
||||
} else { \
|
||||
int __comp; \
|
||||
__typeof(cmp(NULL, NULL)) __comp; \
|
||||
name##_SPLAY(head, elm); \
|
||||
__comp = (cmp)(elm, (head)->sph_root); \
|
||||
if (__comp < 0) { \
|
||||
@ -219,7 +219,7 @@ void \
|
||||
name##_SPLAY(struct name *head, struct type *elm) \
|
||||
{ \
|
||||
struct type __node, *__left, *__right, *__tmp; \
|
||||
int __comp; \
|
||||
__typeof(cmp(NULL, NULL)) __comp; \
|
||||
\
|
||||
SPLAY_LEFT(&__node, field) = SPLAY_RIGHT(&__node, field) = NULL;\
|
||||
__left = __right = &__node; \
|
||||
@ -694,7 +694,7 @@ name##_RB_INSERT(struct name *head, struct type *elm) \
|
||||
{ \
|
||||
struct type *tmp; \
|
||||
struct type *parent = NULL; \
|
||||
int comp = 0; \
|
||||
__typeof(cmp(NULL, NULL)) comp = 0; \
|
||||
tmp = RB_ROOT(head); \
|
||||
while (tmp) { \
|
||||
parent = tmp; \
|
||||
@ -727,7 +727,7 @@ attr struct type * \
|
||||
name##_RB_FIND(struct name *head, struct type *elm) \
|
||||
{ \
|
||||
struct type *tmp = RB_ROOT(head); \
|
||||
int comp; \
|
||||
__typeof(cmp(NULL, NULL)) comp; \
|
||||
while (tmp) { \
|
||||
comp = cmp(elm, tmp); \
|
||||
if (comp < 0) \
|
||||
@ -747,7 +747,7 @@ name##_RB_NFIND(struct name *head, struct type *elm) \
|
||||
{ \
|
||||
struct type *tmp = RB_ROOT(head); \
|
||||
struct type *res = NULL; \
|
||||
int comp; \
|
||||
__typeof(cmp(NULL, NULL)) comp; \
|
||||
while (tmp) { \
|
||||
comp = cmp(elm, tmp); \
|
||||
if (comp < 0) { \
|
||||
|
Loading…
Reference in New Issue
Block a user