[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