summaryrefslogtreecommitdiffstats
path: root/src/tree.h
diff options
context:
space:
mode:
authorPatrick McDermott <pj@pehjota.net>2017-10-23 02:27:43 (EDT)
committer Patrick McDermott <pj@pehjota.net>2017-10-23 02:27:43 (EDT)
commit08b956e032e3257e04a0dfc90496437b98a7a176 (patch)
tree6d9c8f84c6295035517907b96e711de9076c40d4 /src/tree.h
parent4dc8025b8f2eb770280548198720cdbb5bd053d5 (diff)
downloadmarquee-08b956e032e3257e04a0dfc90496437b98a7a176.zip
marquee-08b956e032e3257e04a0dfc90496437b98a7a176.tar.gz
marquee-08b956e032e3257e04a0dfc90496437b98a7a176.tar.bz2
MqTree: New type
Diffstat (limited to 'src/tree.h')
-rw-r--r--src/tree.h85
1 files changed, 85 insertions, 0 deletions
diff --git a/src/tree.h b/src/tree.h
new file mode 100644
index 0000000..2fb41fe
--- /dev/null
+++ b/src/tree.h
@@ -0,0 +1,85 @@
+/*
+ * Tree data structure
+ *
+ * Copyright (C) 2017 Patrick McDermott
+ *
+ * This file is part of Marquee.
+ *
+ * Marquee is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Marquee is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Marquee. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef MQ_TREE_H
+#define MQ_TREE_H
+
+typedef struct _MqTree MqTree;
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+#define MQ_TREE(obj) (MqTree *) (obj)
+
+#define MQ_TREE_CONTINUE TRUE
+#define MQ_TREE_STOP FALSE
+
+struct _MqTree {
+ MqTree *root;
+ MqTree *parent;
+ MqTree *prev;
+ MqTree *next;
+ MqTree *first_child;
+ MqTree *last_child;
+ gint size;
+ gint position;
+ gpointer data;
+};
+
+MqTree *
+mq_tree_insert_root_allocated(MqTree *node, gpointer data);
+
+MqTree *
+mq_tree_insert_child_allocated(MqTree *node, MqTree *parent, gpointer data);
+
+MqTree *
+mq_tree_insert_sibling_allocated(MqTree *node, MqTree *sibling, gpointer data);
+
+#define mq_tree_insert_root(data) \
+ mq_tree_insert_root_allocated(g_new0(MqTree, 1), data)
+#define mq_tree_insert_child(parent, data) \
+ mq_tree_insert_child_allocated(g_new0(MqTree, 1), parent, data)
+#define mq_tree_insert_sibling(sibling, data) \
+ mq_tree_insert_sibling_allocated(g_new0(MqTree, 1), sibling, data)
+
+void
+mq_tree_remove(MqTree *node);
+
+#define mq_tree_size(node) ((node) ? (((MqTree *) (node))->size) : NULL)
+#define mq_tree_position(node) ((node) ? (((MqTree *) (node))->position) : NULL)
+#define mq_tree_root(node) ((node) ? (((MqTree *) (node))->root) : NULL)
+#define mq_tree_previous(node) ((node) ? (((MqTree *) (node))->prev) : NULL)
+#define mq_tree_next(node) ((node) ? (((MqTree *) (node))->prev) : NULL)
+
+MqTree *
+mq_tree_seek(MqTree *node, gint offset);
+
+void
+mq_tree_foreach(MqTree *node, gboolean (*cb)(MqTree *node, va_list ap), ...);
+
+void
+mq_tree_foreach_child(MqTree *node, gboolean (*cb)(MqTree *node, va_list ap),
+ ...);
+
+G_END_DECLS
+
+#endif /* MQ_TREE_H */