[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[tyndur-devel] [PATCH 1/2] libc: Baeume initialisieren ohne malloc
+ libc: tree_init() fuer nicht dynamisch allozierte Baeume
---
src/include/collections.h | 19 +++++++++++++++++++
src/lib/collections/tree.c | 18 +++++++++++++-----
2 files changed, 32 insertions(+), 5 deletions(-)
diff --git a/src/include/collections.h b/src/include/collections.h
index df9fa2a..2593e3a 100644
--- a/src/include/collections.h
+++ b/src/include/collections.h
@@ -100,6 +100,25 @@ typedef struct {
tree_t* tree_do_create(size_t tree_item_offset, size_t sort_key_offset);
/**
+ * Initialisiert einen neuen AVL-Baum. Dies ist eine Alternative zu
+ * tree_create, wenn der Baum nicht dynamisch alloziert werden soll, sondern
+ * z.B. fest in einer Struktur eingebettet ist.
+ *
+ * @param type Datentyp der Objekte im Baum
+ * @param tree_item Name des tree_item-Felds in der Struktur der Objekte
+ * @param sort_key Name des Schluessels in der Struktur der Objekte
+ */
+#define tree_init(tree, type, tree_item, sort_key) \
+ tree_do_init(tree, offsetof(type, tree_item), offsetof(type, sort_key))
+
+/**
+ * Initialisiert einen AVL-Baum. Nicht direkt verwenden, tree_do_init ist das
+ * Mittel der Wahl.
+ */
+void tree_do_init(tree_t* tree,
+ size_t tree_item_offset, size_t sort_key_offset);
+
+/**
* Gibt einen AVL-Baum frei. Zu beachten ist, dass keiner seiner Knoten
* freigegeben wird, da ein Knoten immer noch ueber eine andere Datenstruktur
* erreichbar sein koennte.
diff --git a/src/lib/collections/tree.c b/src/lib/collections/tree.c
index 40fc47d..01c0a71 100644
--- a/src/lib/collections/tree.c
+++ b/src/lib/collections/tree.c
@@ -56,6 +56,17 @@ static inline uint64_t get_key(tree_t* tree, struct tree_item* item) {
return *(uint64_t*)((char*) to_node(tree, item) + tree->sort_key_offset);
}
+/**
+ * Initilaisiert einen neuen AVL-Baum. Nicht direkt verwenden, tree_create ist
+ * das Mittel der Wahl.
+ */
+void tree_do_init(tree_t* tree,
+ size_t tree_item_offset, size_t sort_key_offset)
+{
+ memset(tree, 0, sizeof(*tree));
+ tree->tree_item_offset = tree_item_offset;
+ tree->sort_key_offset = sort_key_offset;
+}
/**
* Erzeugt einen neuen AVL-Baum. Nicht direkt verwenden, tree_create ist das
@@ -63,11 +74,8 @@ static inline uint64_t get_key(tree_t* tree, struct tree_item* item) {
*/
tree_t* tree_do_create(size_t tree_item_offset, size_t sort_key_offset)
{
- tree_t* tree = calloc(1, sizeof(*tree));
-
- tree->tree_item_offset = tree_item_offset;
- tree->sort_key_offset = sort_key_offset;
-
+ tree_t* tree = malloc(sizeof(*tree));
+ tree_do_init(tree, tree_item_offset, sort_key_offset);
return tree;
}
--
1.6.0.2