1/*
2 * = = == === ===== ======== ============= =====================
3 * == pt::rde (critcl) - Data Structures - Generic stack
4 */
5
6#ifndef _RDE_DS_STACK_H
7#define _RDE_DS_STACK_H 1
8
9#include <util.h> /* Scoping */
10
11/*
12 * The stack data structure declared in this file is an array of void*
13 * cells, with each cell either directly containing the data, or being
14 * a pointer to it.
15 *
16 * The structure maintains a max-size field, reallocating the array if
17 * and only if we go over this size. Each allocation doubles the
18 * available room.
19 *
20 * A pointer to a delete function is maintained, to delete cells which
21 * are references to the actual data.
22 */
23
24typedef void (*RDE_STACK_CELL_FREE) (void* cell);
25typedef struct RDE_STACK_* RDE_STACK;
26
27static const int RDE_STACK_INITIAL_SIZE = 256;
28
29/*
30 * Notes
31 * - push -- Item allocation is responsibility of caller.
32 *           Stack takes ownership of the item.
33 * - pop  -- Stack frees allocated item.
34 * - trim -- Ditto
35 * - top  -- Provides top item, no transfer of ownership.
36 * - del  -- Releases stack, cell array, and items, if any.
37 * - drop -- Like pop, but doesn't free, assumes that caller
38 *           is taking ownership of the pointer.
39 */
40
41/* SKIP START */
42SCOPE RDE_STACK rde_stack_new  (RDE_STACK_CELL_FREE freeCellProc);
43SCOPE void      rde_stack_del  (RDE_STACK s);
44
45SCOPE void*    rde_stack_top  (RDE_STACK s);
46SCOPE void     rde_stack_push (RDE_STACK s, void* item);
47SCOPE void     rde_stack_pop  (RDE_STACK s, long int n);
48SCOPE void     rde_stack_trim (RDE_STACK s, long int n);
49SCOPE void     rde_stack_drop (RDE_STACK s, long int n);
50SCOPE void     rde_stack_move (RDE_STACK dst, RDE_STACK src);
51SCOPE void     rde_stack_get  (RDE_STACK s, long int* cn, void*** cc);
52SCOPE long int rde_stack_size (RDE_STACK s);
53/* SKIP END */
54#endif /* _RDE_DS_STACK_H */
55
56/*
57 * Local Variables:
58 * mode: c
59 * c-basic-offset: 4
60 * fill-column: 78
61 * End:
62 */
63