Index: share/man/man3/tree.3 =================================================================== --- share/man/man3/tree.3 +++ share/man/man3/tree.3 @@ -30,7 +30,7 @@ .\" .\" $FreeBSD$ .\" -.Dd January 24, 2015 +.Dd August 12, 2015 .Dt TREE 3 .Os .Sh NAME @@ -95,6 +95,7 @@ .Nm RB_FOREACH_REVERSE_SAFE , .Nm RB_INIT , .Nm RB_INSERT , +.Nm RB_COUNT , .Nm RB_REMOVE .Nd "implementations of splay and red-black trees" .Sh SYNOPSIS @@ -186,6 +187,8 @@ .Fn RB_INSERT NAME "RB_HEAD *head" "struct TYPE *elm" .Ft "struct TYPE *" .Fn RB_REMOVE NAME "RB_HEAD *head" "struct TYPE *elm" +.Ft void +.Fn RB_COUNT "VARNAME" "NAME" "RB_HEAD *head" "COUNTER" .Sh DESCRIPTION These macros define data structures for different types of trees: splay trees and red-black trees. @@ -557,6 +560,14 @@ The .Fn RB_EMPTY macro should be used to check whether a red-black tree is empty. +.Pp +The +.Fn RB_COUNT +macro traverses the tree referenced by +.Ar head , +counting the number of node. +.Ar COUNTER +is initialized to 0 before traversing and incremented by one for each nodes. .Sh NOTES Trying to free a tree in the following way is a common error: .Bd -literal -offset indent Index: sys/sys/tree.h =================================================================== --- sys/sys/tree.h +++ sys/sys/tree.h @@ -798,4 +798,11 @@ ((x) != NULL) && ((y) = name##_RB_PREV(x), (x) != NULL); \ (x) = (y)) +#define RB_COUNT(x, name, head, cnt) do { \ + (cnt) = 0; \ + RB_FOREACH((x), name, (head)) { \ + (cnt)++; \ + } \ +} while (0) + #endif /* _SYS_TREE_H_ */