/* Copyright vishpat at gmail
* This code is being released under GPL version 2.
*
*
http://www.gossamer-threads.com/lists/linux/kernel/667935?page=last
*/
#ifndef _BTREE_H_
#define _BTREE_H_
// Platform dependent headers
#include <stdlib.h>
#include <stdio.h>
#include <strings.h>
#define mem_alloc malloc
#define mem_free free
#define bcopy bcopy
#define print printf
typedef enum {false,true} bool;
typedef struct {
void * key;
void * val;
} bt_key_val;
typedef struct bt_node {
struct bt_node * next; // Pointer used for linked list
bool leaf; // Used to indicate whether leaf or not
unsigned int nr_active; // Number of active keys
unsigned int level; // Level in the B-Tree
bt_key_val ** key_vals; // Array of keys and values
struct bt_node ** children; // Array of pointers to child nodes
}bt_node;
typedef struct {
unsigned int order; // B-Tree order
bt_node * root; // Root of the B-Tree
unsigned int (*value)(void * key); // Generate uint value for the key
unsigned int (*key_size)(void * key); // Return the key size
unsigned int (*data_size)(void * data); // Return the data size
void (*print_key)(void * key); // Print the key
}btree;
extern btree * btree_create(unsigned int order);
extern int btree_insert_key(btree * btree, bt_key_val * key_val);
extern int btree_delete_key(btree * btree,bt_node * subtree ,void * key);
extern bt_key_val * btree_search(btree * btree, void * key);
extern void btree_destroy(btree * btree);
extern void * btree_get_max_key(btree * btree);
extern void * btree_get_min_key(btree * btree);
#ifdef DEBUG
extern void print_subtree(btree * btree,bt_node * node);
#endif
#endif