/*#io
docCopyright("Steve Dekorte", 2002)
docLicense("BSD revised")
docDescription("""
Stack - array of void pointers
supports setting marks - when a mark is popped,
all stack items above it are popped as well
Designed to optimize push, pushMark and popMark
at the expense of pop (since pop requires a mark check)
""")
*/
#ifndef STACK_DEFINED
#define STACK_DEFINED 1
#include "Common.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stddef.h>
#include "List.h"
#ifdef __cplusplus
extern "C" {
#endif
#ifdef LOW_MEMORY_SYSTEM
#define STACK_START_SIZE 512
#define STACK_RESIZE_FACTOR 2
#else
#define STACK_START_SIZE 512
#define STACK_RESIZE_FACTOR 2
#endif
typedef void (StackDoCallback)(void *);
typedef void (StackDoOnCallback)(void *, void *);
typedef struct
{
void **items;
void **memEnd;
void **top;
ptrdiff_t lastMark;
} Stack;
BASEKIT_API Stack *Stack_new(void);
BASEKIT_API void Stack_free(Stack *self);
BASEKIT_API Stack *Stack_clone(Stack *self);
BASEKIT_API void Stack_copy_(Stack *self, Stack *other);
BASEKIT_API size_t Stack_memorySize(Stack *self);
BASEKIT_API void Stack_compact(Stack *self);
BASEKIT_API void Stack_resize(Stack *self);
BASEKIT_API void Stack_popToMark_(Stack *self, ptrdiff_t mark);
// not high performance
BASEKIT_API void Stack_makeMarksNull(Stack *self);
BASEKIT_API Stack *Stack_newCopyWithNullMarks(Stack *self);
BASEKIT_API void Stack_do_on_(Stack *self, StackDoOnCallback *callback, void *target);
BASEKIT_API List *Stack_asList(Stack *self);
#include "Stack_inline.h"
#ifdef __cplusplus
}
#endif
#endif
syntax highlighted by Code2HTML, v. 0.9.1