#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; \ } \ }