summaryrefslogtreecommitdiffstats
path: root/src/fastdep/avl.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/fastdep/avl.h')
-rw-r--r--src/fastdep/avl.h102
1 files changed, 102 insertions, 0 deletions
diff --git a/src/fastdep/avl.h b/src/fastdep/avl.h
new file mode 100644
index 0000000..90db3da
--- /dev/null
+++ b/src/fastdep/avl.h
@@ -0,0 +1,102 @@
+/* $Id: avl.h 2243 2009-01-10 02:24:02Z bird $
+ *
+ * AVL-Tree (lookalike) declaration.
+ *
+ * This AVL implementation is configurable from this headerfile. By
+ * for example alterning the AVLKEY typedefinition an the AVL_<L|G|E|N>[E]
+ * macros you are able to create different trees. Currently you may only have
+ * one type of trees within one program (module).
+ *
+ * TREETYPE: Case Sensitive Strings (Key is pointer).
+ *
+ *
+ * Copyright (c) 1999-2009 knut st. osmundsen
+ *
+ * GPL
+ *
+ */
+#ifndef _AVL_H_
+#define _AVL_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * AVL configuration. PRIVATE!
+ */
+#define AVL_MAX_HEIGHT 19 /* Up to 2^16 nodes. */
+#define AVL_MAY_TRY_INSERT_EQUAL 1 /* Ignore attempts to insert existing nodes. */
+
+/*
+ * AVL Compare macros
+ */
+#define AVL_L(key1, key2) (strcmp(key1, key2) < 0)
+#define AVL_LE(key1, key2) (strcmp(key1, key2) <= 0)
+#define AVL_G(key1, key2) (strcmp(key1, key2) > 0)
+#define AVL_GE(key1, key2) (strcmp(key1, key2) >= 0)
+#define AVL_E(key1, key2) (strcmp(key1, key2) == 0)
+#define AVL_NE(key1, key2) (strcmp(key1, key2) != 0)
+#define AVL_CMP(key1, key2) strcmp(key1, key2)
+
+/**
+ * AVL key type
+ */
+typedef const char *AVLKEY;
+
+
+/**
+ * AVL Core node.
+ */
+typedef struct _AVLNodeCore
+{
+ AVLKEY Key; /* Key value. */
+ struct _AVLNodeCore * pLeft; /* Pointer to left leaf node. */
+ struct _AVLNodeCore * pRight; /* Pointer to right leaf node. */
+ unsigned char uchHeight; /* Height of this tree: max(heigth(left), heigth(right)) + 1 */
+} AVLNODECORE, *PAVLNODECORE, **PPAVLNODECORE;
+
+
+/**
+ * AVL Enum data - All members are PRIVATE! Don't touch!
+ */
+typedef struct _AVLEnumData
+{
+ char fFromLeft;
+ char cEntries;
+ char achFlags[AVL_MAX_HEIGHT];
+ PAVLNODECORE aEntries[AVL_MAX_HEIGHT];
+} AVLENUMDATA, *PAVLENUMDATA;
+
+
+/*
+ * callback type
+ */
+typedef unsigned ( _PAVLCALLBACK)(PAVLNODECORE, void*);
+typedef _PAVLCALLBACK *PAVLCALLBACK;
+
+
+BOOL AVLInsert(PPAVLNODECORE ppTree, PAVLNODECORE pNode);
+PAVLNODECORE AVLRemove(PPAVLNODECORE ppTree, AVLKEY Key);
+PAVLNODECORE AVLGet(PPAVLNODECORE ppTree, AVLKEY Key);
+PAVLNODECORE AVLGetWithParent(PPAVLNODECORE ppTree, PPAVLNODECORE ppParent, AVLKEY Key);
+PAVLNODECORE AVLGetWithAdjecentNodes(PPAVLNODECORE ppTree, AVLKEY Key, PPAVLNODECORE ppLeft, PPAVLNODECORE ppRight);
+unsigned AVLDoWithAll(PPAVLNODECORE ppTree, int fFromLeft, PAVLCALLBACK pfnCallBack, void *pvParam);
+PAVLNODECORE AVLBeginEnumTree(PPAVLNODECORE ppTree, PAVLENUMDATA pEnumData, int fFromLeft);
+PAVLNODECORE AVLGetNextNode(PAVLENUMDATA pEnumData);
+PAVLNODECORE AVLGetBestFit(PPAVLNODECORE ppTree, AVLKEY Key, int fAbove);
+
+
+
+/*
+ * Just in case NULL is undefined.
+ */
+#ifndef NULL
+ #define NULL ((void*)0)
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif