Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #if !defined PREFIX
- # error("PREFIX")
- #endif
- #if !defined ITEM
- # error("ITEM")
- #endif
- #if !defined NAME
- # error("NAME")
- #endif
- #define FUNC(ACTION) PREFIX#_##ACTION
- typedef struct NAME {
- ITEM* buffer;
- int capacity;
- ITEM* front;
- ITEM* back;
- } NAME;
- NAME FUNC(new)(int capacity){
- assert(capacity > 0);
- ITEM* buffer = (ITEM*)malloc(capacity*sizeof(ITEM));
- assert(buffer);
- NAME vector = { buffer, capacity, buffer, buffer};
- return vector;
- }
- void FUNC(delete)(NAME* vec){
- free(vec->buffer);
- vec->capacity = 0;
- vec->buffer = NULL;
- vec->front = NULL;
- vec->back = NULL;
- }
- void FUNC(as_queue)(NAME* vec){
- assert(vec);
- assert(vec->buffer);
- assert(vec->capacity > 0);
- vec->front = vec->buffer + vec->capacity/2;
- vec->back = vec->front + 1;
- }
- void FUNC(push_back)(NAME* vec, ITEM item){
- assert(vec);
- assert(vec->buffer);
- assert(vec->back);
- assert(vec->back < vec->buffer + vec->capacity);
- *vec->back = item;
- vec->back++;
- }
- ITEM FUNC(pop_back)(NAME* vec){
- assert(vec);
- assert(vec->buffer);
- assert(vec->back);
- assert(vec->back > vec->buffer);
- vec->back--;
- return *(vec->back + 1);
- }
- void FUNC(push_front)(NAME* vec, ITEM item){
- assert(vec);
- assert(vec->buffer);
- assert(vec->front);
- assert(vec->front > vec->buffer);
- vec->front--;
- *vec->front = item;
- }
- ITEM FUNC(pop_front)(NAME* vec){
- assert(vec);
- assert(vec->buffer);
- assert(vec->front);
- assert(vec->front < vec->buffer + vec->capacity);
- vec->front++;
- return *(vec->front - 1);
- }
- ITEM FUNC(get)(NAME* vec, int idx){
- assert(vec->front + idx < vec->buffer + vec->capacity);
- return *(vec->front + idx);
- }
- ITEM* FUNC(top)(NAME* vec){
- assert(vec);
- assert(vec->buffer);
- assert(vec->back);
- return vec->back-1;
- }
- #define FOR_EACH_IN_VECTOR(VEC, VAR, STMT) \
- { ITEM *__p##VAR, VAR; \
- for(__p##VAR = (VEC)->front; __p##VAR < (VEC)->back; __p##VAR++){ \
- VAR = *__p##VAR; \
- STMT; \
- } \
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement