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)
13 #define STACK_DEFINED 1
26 #ifdef LOW_MEMORY_SYSTEM
27 #define STACK_START_SIZE 512
28 #define STACK_RESIZE_FACTOR 2
30 #define STACK_START_SIZE 512
31 #define STACK_RESIZE_FACTOR 2
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 *);
50 #ifdef STACK_POP_CALLBACK
51 StackPopCallback
*popCallback
;
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"