#ifndef __HYBRID_ALLOC__
#define __HYBRID_ALLOC__
#include <sys/types.h>
#include "RedBlackTree.h"
typedef struct extent_node extent_node_t;
struct extent_node
{
u_int32_t length;
u_int32_t offset;
struct extent_node *offset_next;
rb_node(extent_node_t) offset_link;
};
typedef rb_tree(extent_node_t) extent_tree_offset_t;
extern extent_node_t *
alloc_node(u_int32_t length, u_int32_t offset);
extern void
free_node(extent_node_t *node);
extern extent_node_t *
extent_tree_free_space( extent_tree_offset_t *offset_tree, u_int32_t size, u_int32_t offset);
extern void
extent_tree_offset_print(extent_tree_offset_t *offset_tree);
extern int32_t
extent_tree_offset_alloc_space(extent_tree_offset_t *offset_tree, u_int32_t size, u_int32_t offset);
extern int32_t
extent_tree_offset_alloc_unaligned(extent_tree_offset_t *tree, u_int32_t size, u_int32_t offset);
extern void
extent_tree_remove_node (extent_tree_offset_t *offset_tree, extent_node_t * node);
extern extent_node_t *
extent_tree_off_first (extent_tree_offset_t *offset_tree);
extern extent_node_t *
extent_tree_off_search(extent_tree_offset_t *offset_tree, extent_node_t *node);
extern extent_node_t *
extent_tree_off_search_next(extent_tree_offset_t *offset_tree, extent_node_t *node);
extern extent_node_t*
extent_tree_off_search_nextWithSize (extent_tree_offset_t *offset_tree, extent_node_t *node);
extern extent_node_t *
extent_tree_off_search_prev(extent_tree_offset_t *offset_tree, extent_node_t *node);
extern extent_node_t *
extent_tree_off_next(extent_tree_offset_t *offset_tree, extent_node_t *node);
extern extent_node_t *
extent_tree_off_prev(extent_tree_offset_t *offset_tree, extent_node_t *node);
extern void
extent_tree_init(extent_tree_offset_t *offset_tree);
extern void
extent_tree_destroy(extent_tree_offset_t *offset_tree);
extern int
cmp_offset_node(extent_node_t *node_1, extent_node_t *node_2);
#endif