add node and entry size as parameters to b_tree_init
This commit is contained in:
26
src/b-tree.c
26
src/b-tree.c
@@ -1,5 +1,6 @@
|
|||||||
#include <blue/core/queue.h>
|
#include <blue/core/queue.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <assert.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "b-tree.h"
|
#include "b-tree.h"
|
||||||
@@ -18,7 +19,7 @@ struct cache_entry {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#define GET_ENTRY(tree, entries, index) \
|
#define GET_ENTRY(tree, entries, index) \
|
||||||
(b_tree_node_entry *)((unsigned char *)(entries) + ((index) * (tree)->tree_ops->entry_size));
|
(b_tree_node_entry *)((unsigned char *)(entries) + ((index) * (tree)->tree_entry_size));
|
||||||
|
|
||||||
|
|
||||||
static b_tree_node *cache_alloc_node(struct b_tree *tree)
|
static b_tree_node *cache_alloc_node(struct b_tree *tree)
|
||||||
@@ -32,7 +33,7 @@ static b_tree_node *cache_alloc_node(struct b_tree *tree)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct cache_entry *e = malloc(sizeof *e + tree->tree_ops->node_size);
|
struct cache_entry *e = malloc(sizeof *e + tree->tree_node_size);
|
||||||
if (!e) {
|
if (!e) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -52,10 +53,13 @@ static void cache_free_node(struct b_tree *tree, b_tree_node *node)
|
|||||||
e->c_allocated = 0;
|
e->c_allocated = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void b_tree_init(struct b_tree *tree, const struct b_tree_ops *ops, unsigned int order)
|
void b_tree_init(struct b_tree *tree, const struct b_tree_ops *ops, unsigned int node_size, unsigned int entry_size, unsigned int order)
|
||||||
{
|
{
|
||||||
memset(tree, 0x0, sizeof *tree);
|
memset(tree, 0x0, sizeof *tree);
|
||||||
|
assert((order % 2) == 0);
|
||||||
tree->tree_ops = ops;
|
tree->tree_ops = ops;
|
||||||
|
tree->tree_node_size = node_size;
|
||||||
|
tree->tree_entry_size = entry_size;
|
||||||
tree->tree_order = order;
|
tree->tree_order = order;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -114,14 +118,14 @@ static void node_set_entry(struct b_tree *tree, b_tree_node *node, unsigned long
|
|||||||
{
|
{
|
||||||
b_tree_node_entry *entries = tree->tree_ops->node_get_entries(node);
|
b_tree_node_entry *entries = tree->tree_ops->node_get_entries(node);
|
||||||
b_tree_node_entry *dest = GET_ENTRY(tree, entries, index);
|
b_tree_node_entry *dest = GET_ENTRY(tree, entries, index);
|
||||||
memcpy(dest, entry, tree->tree_ops->entry_size);
|
memcpy(dest, entry, tree->tree_entry_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void node_kill_entry(struct b_tree *tree, b_tree_node *node, unsigned long index)
|
static void node_kill_entry(struct b_tree *tree, b_tree_node *node, unsigned long index)
|
||||||
{
|
{
|
||||||
b_tree_node_entry *entries = tree->tree_ops->node_get_entries(node);
|
b_tree_node_entry *entries = tree->tree_ops->node_get_entries(node);
|
||||||
b_tree_node_entry *dest = GET_ENTRY(tree, entries, index);
|
b_tree_node_entry *dest = GET_ENTRY(tree, entries, index);
|
||||||
memset(dest, 0x0, tree->tree_ops->entry_size);
|
memset(dest, 0x0, tree->tree_entry_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void node_shift_entries(struct b_tree *tree, b_tree_node *node, unsigned long shift_from, long shift_by)
|
static void node_shift_entries(struct b_tree *tree, b_tree_node *node, unsigned long shift_from, long shift_by)
|
||||||
@@ -137,7 +141,7 @@ static void node_shift_entries(struct b_tree *tree, b_tree_node *node, unsigned
|
|||||||
b_tree_node_entry *dest = GET_ENTRY(tree, entries, shift_from + shift_by);
|
b_tree_node_entry *dest = GET_ENTRY(tree, entries, shift_from + shift_by);
|
||||||
unsigned int count = nr_entries - shift_from;
|
unsigned int count = nr_entries - shift_from;
|
||||||
|
|
||||||
memmove(dest, src, tree->tree_ops->entry_size * count);
|
memmove(dest, src, tree->tree_entry_size * count);
|
||||||
if (shift_by < 0) {
|
if (shift_by < 0) {
|
||||||
dest = GET_ENTRY(tree, entries, nr_entries + shift_by);
|
dest = GET_ENTRY(tree, entries, nr_entries + shift_by);
|
||||||
count = abs(shift_by);
|
count = abs(shift_by);
|
||||||
@@ -147,8 +151,8 @@ static void node_shift_entries(struct b_tree *tree, b_tree_node *node, unsigned
|
|||||||
count = shift_by;
|
count = shift_by;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(dest, 0x0, count * tree->tree_ops->entry_size);
|
memset(dest, 0x0, count * tree->tree_entry_size);
|
||||||
return 0;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void node_shift_children(struct b_tree *tree, b_tree_node *node, unsigned long shift_from, long shift_by)
|
static void node_shift_children(struct b_tree *tree, b_tree_node *node, unsigned long shift_from, long shift_by)
|
||||||
@@ -195,9 +199,9 @@ static void node_move_entries(struct b_tree *tree, b_tree_node *from, b_tree_nod
|
|||||||
b_tree_node_entry *src = GET_ENTRY(tree, from_entries, src_index);
|
b_tree_node_entry *src = GET_ENTRY(tree, from_entries, src_index);
|
||||||
b_tree_node_entry *dest = GET_ENTRY(tree, to_entries, dest_index);
|
b_tree_node_entry *dest = GET_ENTRY(tree, to_entries, dest_index);
|
||||||
|
|
||||||
memmove(dest, src, count * tree->tree_ops->entry_size);
|
memmove(dest, src, count * tree->tree_entry_size);
|
||||||
if (src_index + count >= from_nr_entries) {
|
if (src_index + count >= from_nr_entries) {
|
||||||
memset(src, 0x0, count * tree->tree_ops->entry_size);
|
memset(src, 0x0, count * tree->tree_entry_size);
|
||||||
} else {
|
} else {
|
||||||
node_shift_entries(tree, from, src_index + count, (int)count * -1);
|
node_shift_entries(tree, from, src_index + count, (int)count * -1);
|
||||||
}
|
}
|
||||||
@@ -268,7 +272,7 @@ static int node_is_leaf(struct b_tree *tree, b_tree_node *node)
|
|||||||
|
|
||||||
static void node_init(struct b_tree *tree, b_tree_node *out)
|
static void node_init(struct b_tree *tree, b_tree_node *out)
|
||||||
{
|
{
|
||||||
memset(out, 0x0, tree->tree_ops->node_size);
|
memset(out, 0x0, tree->tree_node_size);
|
||||||
for (unsigned int i = 0; i < tree->tree_order; i++) {
|
for (unsigned int i = 0; i < tree->tree_order; i++) {
|
||||||
node_set_child(tree, out, i, B_TREE_INVALID_PTR);
|
node_set_child(tree, out, i, B_TREE_INVALID_PTR);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,9 +12,6 @@ typedef struct { char _x; } b_tree_node;
|
|||||||
typedef struct { char _x; }b_tree_node_entry;
|
typedef struct { char _x; }b_tree_node_entry;
|
||||||
|
|
||||||
struct b_tree_ops {
|
struct b_tree_ops {
|
||||||
size_t node_size;
|
|
||||||
size_t entry_size;
|
|
||||||
|
|
||||||
int (*tree_get_node)(struct b_tree *, unsigned long, b_tree_node *);
|
int (*tree_get_node)(struct b_tree *, unsigned long, b_tree_node *);
|
||||||
int (*tree_put_node)(struct b_tree *, unsigned long, const b_tree_node *);
|
int (*tree_put_node)(struct b_tree *, unsigned long, const b_tree_node *);
|
||||||
long (*tree_alloc_node)(struct b_tree *);
|
long (*tree_alloc_node)(struct b_tree *);
|
||||||
@@ -29,12 +26,14 @@ struct b_tree_ops {
|
|||||||
|
|
||||||
struct b_tree {
|
struct b_tree {
|
||||||
const struct b_tree_ops *tree_ops;
|
const struct b_tree_ops *tree_ops;
|
||||||
|
unsigned int tree_node_size;
|
||||||
|
unsigned int tree_entry_size;
|
||||||
b_queue tree_cache;
|
b_queue tree_cache;
|
||||||
unsigned int tree_order;
|
unsigned int tree_order;
|
||||||
long tree_root;
|
long tree_root;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern void b_tree_init(struct b_tree *tree, const struct b_tree_ops *ops, unsigned int order);
|
extern void b_tree_init(struct b_tree *tree, const struct b_tree_ops *ops, unsigned int node_size, unsigned int entry_size, unsigned int order);
|
||||||
extern int b_tree_put(struct b_tree *tree, const b_tree_node_entry *entry);
|
extern int b_tree_put(struct b_tree *tree, const b_tree_node_entry *entry);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -124,9 +124,6 @@ static int entry_compare(const b_tree_node_entry *e0, const b_tree_node_entry *e
|
|||||||
}
|
}
|
||||||
|
|
||||||
static const struct b_tree_ops ops = {
|
static const struct b_tree_ops ops = {
|
||||||
.node_size = sizeof(struct node),
|
|
||||||
.entry_size = sizeof(struct entry),
|
|
||||||
|
|
||||||
.tree_get_node = tree_get_node,
|
.tree_get_node = tree_get_node,
|
||||||
.tree_put_node = tree_put_node,
|
.tree_put_node = tree_put_node,
|
||||||
.tree_alloc_node = tree_alloc_node,
|
.tree_alloc_node = tree_alloc_node,
|
||||||
@@ -221,6 +218,8 @@ static int create(
|
|||||||
const b_arglist *opt,
|
const b_arglist *opt,
|
||||||
const b_array *args)
|
const b_array *args)
|
||||||
{
|
{
|
||||||
|
printf("%zu\n", sizeof(struct ec3_cluster_group));
|
||||||
|
return 0;
|
||||||
const char *in_path = NULL, *out_path = NULL;
|
const char *in_path = NULL, *out_path = NULL;
|
||||||
|
|
||||||
b_arglist_get_string(
|
b_arglist_get_string(
|
||||||
@@ -241,7 +240,7 @@ static int create(
|
|||||||
fwrite(&root, sizeof root, 1, fp);
|
fwrite(&root, sizeof root, 1, fp);
|
||||||
|
|
||||||
struct data_tree tree;
|
struct data_tree tree;
|
||||||
b_tree_init(&tree.base, &ops, ORDER);
|
b_tree_init(&tree.base, &ops, sizeof(struct node), sizeof(struct entry), ORDER);
|
||||||
tree.fp = fp;
|
tree.fp = fp;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user