2007-07-24 12:51:13 +04:00
/*
a talloc based red - black tree
Copyright ( C ) Ronnie Sahlberg 2007
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 3 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 , see < http : //www.gnu.org/licenses/>.
*/
2011-11-11 05:41:24 +04:00
# ifndef _RB_TREE_H
# define _RB_TREE_H
2007-07-24 12:51:13 +04:00
# define TRBT_RED 0x00
# define TRBT_BLACK 0x01
2010-04-08 08:07:57 +04:00
typedef struct trbt_node {
struct trbt_tree * tree ;
struct trbt_node * parent ;
struct trbt_node * left ;
struct trbt_node * right ;
2007-07-24 12:51:13 +04:00
uint32_t rb_color ;
uint32_t key32 ;
void * data ;
} trbt_node_t ;
2010-04-08 08:07:57 +04:00
typedef struct trbt_tree {
2007-08-08 05:21:18 +04:00
trbt_node_t * root ;
2007-08-09 08:08:59 +04:00
/* automatically free the tree when the last node has been deleted */
# define TRBT_AUTOFREE 0x00000001
uint32_t flags ;
2007-07-24 12:51:13 +04:00
} trbt_tree_t ;
2007-08-08 02:20:46 +04:00
/* Create a RB tree */
2007-08-09 08:08:59 +04:00
trbt_tree_t * trbt_create ( TALLOC_CTX * memctx , uint32_t flags ) ;
2007-08-08 02:20:46 +04:00
/* Lookup a node in the tree and return a pointer to data or NULL */
2007-07-24 12:51:13 +04:00
void * trbt_lookup32 ( trbt_tree_t * tree , uint32_t key ) ;
2007-08-08 02:20:46 +04:00
/* Insert a new node into the tree. If there was already a node with this
key the pointer to the previous data is returned .
The tree will talloc_steal ( ) the data inserted into the tree .
*/
void * trbt_insert32 ( trbt_tree_t * tree , uint32_t key , void * data ) ;
2007-08-08 05:21:18 +04:00
/* Insert a new node into the tree.
If this is a new node :
callback is called with data = = NULL and param = param
the returned value from the callback is talloc_stolen and inserted in the
tree .
If a node already exists for this key then :
callback is called with data = = existing data and param = param
the returned calue is talloc_stolen and inserted in the tree
*/
void trbt_insert32_callback ( trbt_tree_t * tree , uint32_t key , void * ( * callback ) ( void * param , void * data ) , void * param ) ;
2007-08-08 02:20:46 +04:00
/* Delete a node from the tree and free all data associated with it */
2007-07-24 12:51:13 +04:00
void trbt_delete32 ( trbt_tree_t * tree , uint32_t key ) ;
2007-08-08 06:30:12 +04:00
/* insert into the tree with a key based on an array of uint32 */
void trbt_insertarray32_callback ( trbt_tree_t * tree , uint32_t keylen , uint32_t * key , void * ( * callback ) ( void * param , void * data ) , void * param ) ;
/* Lookup a node in the tree with a key based on an array of uint32
and return a pointer to data or NULL */
void * trbt_lookuparray32 ( trbt_tree_t * tree , uint32_t keylen , uint32_t * key ) ;
2011-11-02 06:33:28 +04:00
/* Traverse a tree with a key based on an array of uint32
returns 0 if traverse completed
! 0 if the traverse was aborted
If the callback returns ! 0 the traverse will be aborted
*/
int trbt_traversearray32 ( trbt_tree_t * tree , uint32_t keylen , int ( * callback ) ( void * param , void * data ) , void * param ) ;
2007-08-15 04:57:21 +04:00
/* Lookup the first node in the tree with a key based on an array of uint32
and return a pointer to data or NULL */
void * trbt_findfirstarray32 ( trbt_tree_t * tree , uint32_t keylen ) ;
2011-11-11 05:41:24 +04:00
# endif /* _RB_TREE_H */