X-Git-Url: https://tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=lib%2Frbl.h;fp=lib%2Frbl.h;h=906ae3131820f83d5315ff0ce98f5bd693f5e8b9;hp=0000000000000000000000000000000000000000;hb=462ab530e546f5732dfd51134751da6f6910d679;hpb=e64ef59df44d39c76c00dee22841bbcce7c24e47 diff --git a/lib/rbl.h b/lib/rbl.h new file mode 100644 index 00000000..906ae313 --- /dev/null +++ b/lib/rbl.h @@ -0,0 +1,104 @@ +/* + rbl.h -- header file for rbl.c + Copyright (C) 2000 Ivo Timmermans , + 2000 Guus Sliepen + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + 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.2 2002/04/09 15:26:00 zarq Exp $ +*/ + +#ifndef __RBL_H__ +#define __RBL_H__ + +#define RBL_FOREACH(tree,rbl) for(rbl = tree->head; rbl; rbl = rbl->next) + +typedef struct rbl_t +{ + /* 'red-black tree' part */ + + struct rbltree_t *tree; + + int color; + + struct rbl_t *parent; + struct rbl_t *left; + struct rbl_t *right; + + /* 'linked list' part */ + + struct rbl_t *prev; + struct rbl_t *next; + + /* payload */ + + void *data; + +} 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 +{ + /* 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 color +{ + RBL_RED, + RBL_BLACK +} color; + +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 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 void rbl_delete(rbltree_t *, void *); +extern rbl_t *rbl_insert_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__ */