Source to ./rbtree.h
/*
* IPFlow Collector
* Copyright (c) 2004 Christophe Fillot.
* E-mail: [email protected]
*
* rbtree.c: Red/Black Trees.
*/
#ifndef __RBTREE_H__
#define __RBTREE_H__ 1
static const char rcsid_rbtree[] = "$Id$";
#include <sys/types.h>
#include "mempool.h"
/* Comparison function for 2 keys */
typedef int (*tree_fcompare)(void *key1,void *key2,void *opt);
/* User function to call when using rbtree_foreach */
typedef void (*tree_fforeach)(void *key,void *value,void *opt);
/* Node colors */
enum {
RBTREE_RED = 0,
RBTREE_BLACK,
};
/*
* Description of a node in a Red/Black tree. To be more efficient, keys are
* stored with a void * pointer, allowing to use different type keys.
*/
typedef struct rbtree_node rbtree_node;
struct rbtree_node {
/* Key and Value */
void *key,*value;
/* Left and right nodes */
rbtree_node *left,*right;
/* Parent node */
rbtree_node *parent;
/* Node color */
short color;
};
/*
* Description of a Red/Black tree. For commodity, a name can be given to the
* tree. "rbtree_comp" is a pointer to a function, defined by user, which
* compares keys during node operations.
*/
typedef struct rbtree_tree rbtree_tree;
struct rbtree_tree {
int node_count; /* Number of Nodes */
mempool_t mp; /* Memory pool */
rbtree_node nil; /* Sentinel */
rbtree_node *root; /* Root node */
tree_fcompare key_cmp; /* Key comparison function */
void *opt_data; /* Optional data for comparison */
};
/* Insert a node in an Red/Black tree */
int rbtree_insert(rbtree_tree *tree,void *key,void *value);
/* Removes a node out of a tree */
void *rbtree_remove(rbtree_tree *tree,void *key);
/*
* Lookup for a node corresponding to "key". If node does not exist,
* function returns null pointer.
*/
void *rbtree_lookup(rbtree_tree *tree,void *key);
/* Call the specified function for each node */
int rbtree_foreach(rbtree_tree *tree,tree_fforeach user_fn,void *opt);
/* Compute the height of a Red/Black tree */
int rbtree_height(rbtree_tree *tree);
/* Returns the number of nodes */
int rbtree_node_count(rbtree_tree *tree);
/* Purge all nodes */
void rbtree_purge(rbtree_tree *tree);
/* Check tree consistency */
int rbtree_check(rbtree_tree *tree);
/* Create a new Red/Black tree */
rbtree_tree *rbtree_create(tree_fcompare key_cmp,void *opt_data);
/* Delete an Red/Black tree */
void rbtree_delete(rbtree_tree *tree);
#endif