summaryrefslogtreecommitdiffstats
path: root/tcllib/modules/pt/rde_critcl/stack.h
diff options
context:
space:
mode:
Diffstat (limited to 'tcllib/modules/pt/rde_critcl/stack.h')
-rw-r--r--tcllib/modules/pt/rde_critcl/stack.h62
1 files changed, 62 insertions, 0 deletions
diff --git a/tcllib/modules/pt/rde_critcl/stack.h b/tcllib/modules/pt/rde_critcl/stack.h
new file mode 100644
index 0000000..ca24666
--- /dev/null
+++ b/tcllib/modules/pt/rde_critcl/stack.h
@@ -0,0 +1,62 @@
+/*
+ * = = == === ===== ======== ============= =====================
+ * == pt::rde (critcl) - Data Structures - Generic stack
+ */
+
+#ifndef _RDE_DS_STACK_H
+#define _RDE_DS_STACK_H 1
+
+#include <util.h> /* Scoping */
+
+/*
+ * The stack data structure declared in this file is an array of void*
+ * cells, with each cell either directly containing the data, or being
+ * a pointer to it.
+ *
+ * The structure maintains a max-size field, reallocating the array if
+ * and only if we go over this size. Each allocation doubles the
+ * available room.
+ *
+ * A pointer to a delete function is maintained, to delete cells which
+ * are references to the actual data.
+ */
+
+typedef void (*RDE_STACK_CELL_FREE) (void* cell);
+typedef struct RDE_STACK_* RDE_STACK;
+
+static const int RDE_STACK_INITIAL_SIZE = 256;
+
+/*
+ * Notes
+ * - push -- Item allocation is responsibility of caller.
+ * Stack takes ownership of the item.
+ * - pop -- Stack frees allocated item.
+ * - trim -- Ditto
+ * - top -- Provides top item, no transfer of ownership.
+ * - del -- Releases stack, cell array, and items, if any.
+ * - drop -- Like pop, but doesn't free, assumes that caller
+ * is taking ownership of the pointer.
+ */
+
+/* SKIP START */
+SCOPE RDE_STACK rde_stack_new (RDE_STACK_CELL_FREE freeCellProc);
+SCOPE void rde_stack_del (RDE_STACK s);
+
+SCOPE void* rde_stack_top (RDE_STACK s);
+SCOPE void rde_stack_push (RDE_STACK s, void* item);
+SCOPE void rde_stack_pop (RDE_STACK s, long int n);
+SCOPE void rde_stack_trim (RDE_STACK s, long int n);
+SCOPE void rde_stack_drop (RDE_STACK s, long int n);
+SCOPE void rde_stack_move (RDE_STACK dst, RDE_STACK src);
+SCOPE void rde_stack_get (RDE_STACK s, long int* cn, void*** cc);
+SCOPE long int rde_stack_size (RDE_STACK s);
+/* SKIP END */
+#endif /* _RDE_DS_STACK_H */
+
+/*
+ * Local Variables:
+ * mode: c
+ * c-basic-offset: 4
+ * fill-column: 78
+ * End:
+ */