New doc system done for core
[io.git] / libs / basekit / source / Stack.h
blobfaf2725fc0948c52df35ad1042e011cd5ecf8be5
1 //metadoc Stack copyright Steve Dekorte 2002
2 //metadoc Stack license BSD revised
3 /*metadoc Stack description
4 Stack - array of void pointers
5 supports setting marks - when a mark is popped,
6 all stack items above it are popped as well
8 Designed to optimize push, pushMark and popMark
9 at the expense of pop (since pop requires a mark check)
12 #ifndef STACK_DEFINED
13 #define STACK_DEFINED 1
15 #include "Common.h"
16 #include <stdlib.h>
17 #include <stdio.h>
18 #include <string.h>
19 #include <stddef.h>
20 #include "List.h"
22 #ifdef __cplusplus
23 extern "C" {
24 #endif
26 #ifdef LOW_MEMORY_SYSTEM
27 #define STACK_START_SIZE 512
28 #define STACK_RESIZE_FACTOR 2
29 #else
30 #define STACK_START_SIZE 512
31 #define STACK_RESIZE_FACTOR 2
32 #endif
34 typedef void (StackDoCallback)(void *);
35 typedef void (StackDoOnCallback)(void *, void *);
37 //#define STACK_POP_CALLBACK
39 #ifdef STACK_POP_CALLBACK
40 typedef void (StackPopCallback)(void *);
41 #endif
43 typedef struct
45 void **items;
46 void **memEnd;
47 void **top;
48 intptr_t lastMark;
50 #ifdef STACK_POP_CALLBACK
51 StackPopCallback *popCallback;
52 #endif
53 } Stack;
55 #define Stack_popCallback_(self, callback) self->popCallback = callback;
57 BASEKIT_API Stack *Stack_new(void);
58 BASEKIT_API void Stack_free(Stack *self);
59 BASEKIT_API Stack *Stack_clone(const Stack *self);
60 BASEKIT_API void Stack_copy_(Stack *self, const Stack *other);
62 BASEKIT_API size_t Stack_memorySize(const Stack *self);
63 BASEKIT_API void Stack_compact(Stack *self);
65 BASEKIT_API void Stack_resize(Stack *self);
67 BASEKIT_API void Stack_popToMark_(Stack *self, intptr_t mark);
69 // not high performance
71 BASEKIT_API void Stack_makeMarksNull(Stack *self);
72 BASEKIT_API Stack *Stack_newCopyWithNullMarks(const Stack *self);
73 BASEKIT_API void Stack_do_on_(const Stack *self, StackDoOnCallback *callback, void *target);
75 BASEKIT_API List *Stack_asList(const Stack *self);
77 #include "Stack_inline.h"
79 #ifdef __cplusplus
81 #endif
82 #endif