X-Git-Url: https://www.tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=lib%2Frbl.h;h=0a090bd7825f606b44994b17cd39114df4f21ab1;hp=bd9ecda347ddefd9f20a5ca033e58f487921fdb3;hb=cf49b2c0647554613874cce495e4a7937a9f7863;hpb=00e5d572621ad5f0263999dbfbfcb11e023bf48b diff --git a/lib/rbl.h b/lib/rbl.h index bd9ecda3..0a090bd7 100644 --- a/lib/rbl.h +++ b/lib/rbl.h @@ -17,11 +17,13 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id: rbl.h,v 1.1.2.2 2000/11/18 18:14:57 guus Exp $ + $Id: rbl.h,v 1.1.2.8 2000/11/24 23:13:00 guus Exp $ */ -typedef int (*rbl_compare_t) (const void *, const void *); -typedef void (*rbl_delete_t) (const void *); +#ifndef __RBL_H__ +#define __RBL_H__ + +#define RBL_FOREACH(tree,rbl) for(rbl = tree->head; rbl; rbl = rbl->next) typedef struct rbl_t { @@ -31,14 +33,14 @@ typedef struct rbl_t int color; - rbl_t *parent; - rbl_t *left; - rbl_t *right; + struct rbl_t *parent; + struct rbl_t *left; + struct rbl_t *right; /* 'linked list' part */ - rbl_t *prev; - rbl_t *next; + struct rbl_t *prev; + struct rbl_t *next; /* payload */ @@ -46,29 +48,57 @@ typedef struct rbl_t } rbl_t; +typedef int (*rbl_compare_t) (const void *, const void *); +typedef void (*rbl_action_t) (const void *); +typedef void (*rbl_action_rbl_t) (const struct rbl_t *); + typedef struct rbltree_t { - rbl_compare_t *compare; - rbl_delete_t *delete; + /* callback functions */ + + rbl_compare_t compare; + rbl_action_t delete; + + /* tree part */ + + struct rbl_t *top; + + /* linked list */ + struct rbl_t *head; + struct rbl_t *tail; + } rbltree_t; -enum +enum color { - RBL_RED; - RBL_BLACK; -}; + RBL_RED, + RBL_BLACK +} color; -extern rbl_t *new_rbltree(rbl_compare_t *, rbl_delete_t *); +extern rbltree_t *new_rbltree(rbl_compare_t, rbl_action_t); extern void free_rbltree(rbltree_t *); extern rbl_t *new_rbl(void); extern void free_rbl(rbl_t *); -extern rbl_t *rbl_search(rbltree_t *, void *); -extern rbl_t *rbl_search_closest(rbltree_t *, void *); +extern void *rbl_search(rbltree_t *, void *); +extern void *rbl_search_closest(rbltree_t *, void *); +extern void *rbl_search_closest_greater(rbltree_t *, void *); +extern void *rbl_search_closest_smaller(rbltree_t *, void *); +extern rbl_t *rbl_search_rbl(rbltree_t *, void *); +extern rbl_t *rbl_search_closest_rbl(rbltree_t *, void *); +extern rbl_t *rbl_search_closest_greater_rbl(rbltree_t *, void *); +extern rbl_t *rbl_search_closest_smaller_rbl(rbltree_t *, void *); extern rbl_t *rbl_insert(rbltree_t *, void *); extern rbl_t *rbl_unlink(rbltree_t *, void *); -extern rbl_t *rbl_delete(rbltree_t *, void *); +extern void rbl_delete(rbltree_t *, void *); extern rbl_t *rbl_insert_rbl(rbltree_t *, rbl_t *); -extern rbl_t *rbl_unlink_rbl(rbltree_t *, rbl_t *); -extern rbl_t *rbl_delete_rbl(rbltree_t *, rbl_t *); +extern rbl_t *rbl_unlink_rbl(rbl_t *); +extern void rbl_delete_rbl(rbl_t *); +extern void rbl_unlink_rbltree(rbltree_t *); +extern void rbl_delete_rbltree(rbltree_t *); + +extern void rbl_foreach(rbltree_t *, rbl_action_t); +extern void rbl_foreach_rbl(rbltree_t *, rbl_action_rbl_t); + +#endif /* __RBL_H__ */