Advertisement
Guest User

Untitled

a guest
Dec 12th, 2010
397
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.28 KB | None | 0 0
  1. #if !defined PREFIX
  2. #   error("PREFIX")
  3. #endif
  4.  
  5. #if !defined ITEM
  6. #   error("ITEM")
  7. #endif
  8. #if !defined NAME
  9. #   error("NAME")
  10. #endif
  11.  
  12. #define FUNC(ACTION) PREFIX#_##ACTION
  13.  
  14.  
  15. typedef struct NAME {  
  16.     ITEM* buffer;                                              
  17.     int capacity;                                              
  18.     ITEM* front;                                                
  19.     ITEM* back;                                                
  20. } NAME;
  21.  
  22. NAME FUNC(new)(int capacity){                                
  23.     assert(capacity > 0);                                      
  24.     ITEM* buffer = (ITEM*)malloc(capacity*sizeof(ITEM));        
  25.     assert(buffer);                                            
  26.     NAME vector = { buffer, capacity, buffer, buffer};          
  27.     return vector;                                              
  28. }                                                              
  29. void FUNC(delete)(NAME* vec){                            
  30.     free(vec->buffer);                                      
  31.     vec->capacity = 0;                                      
  32.     vec->buffer = NULL;                                      
  33.     vec->front = NULL;                                      
  34.     vec->back = NULL;                                        
  35. }                                                              
  36. void FUNC(as_queue)(NAME* vec){
  37.     assert(vec);
  38.     assert(vec->buffer);                                    
  39.     assert(vec->capacity > 0);                              
  40.     vec->front = vec->buffer + vec->capacity/2;            
  41.     vec->back = vec->front + 1;                          
  42. }                                                              
  43. void FUNC(push_back)(NAME* vec, ITEM item){
  44.     assert(vec);
  45.     assert(vec->buffer);
  46.     assert(vec->back);
  47.     assert(vec->back < vec->buffer + vec->capacity);
  48.     *vec->back = item;
  49.     vec->back++;
  50. }
  51.  
  52. ITEM FUNC(pop_back)(NAME* vec){
  53.     assert(vec);
  54.     assert(vec->buffer);
  55.     assert(vec->back);
  56.     assert(vec->back > vec->buffer);
  57.     vec->back--;
  58.     return *(vec->back + 1);
  59. }
  60.  
  61. void FUNC(push_front)(NAME* vec, ITEM item){
  62.     assert(vec);
  63.     assert(vec->buffer);
  64.     assert(vec->front);
  65.     assert(vec->front > vec->buffer);
  66.     vec->front--;
  67.     *vec->front = item;
  68. }
  69.  
  70. ITEM FUNC(pop_front)(NAME* vec){
  71.     assert(vec);
  72.     assert(vec->buffer);
  73.     assert(vec->front);
  74.     assert(vec->front < vec->buffer + vec->capacity);
  75.     vec->front++;
  76.     return *(vec->front - 1);
  77. }
  78.  
  79. ITEM FUNC(get)(NAME* vec, int idx){
  80.     assert(vec->front + idx < vec->buffer + vec->capacity);
  81.     return *(vec->front + idx);
  82. }                                                            
  83.  
  84. ITEM* FUNC(top)(NAME* vec){
  85.     assert(vec);
  86.     assert(vec->buffer);
  87.     assert(vec->back);
  88.     return vec->back-1;
  89. }
  90.  
  91. #define FOR_EACH_IN_VECTOR(VEC, VAR, STMT)                               \
  92.     { ITEM *__p##VAR, VAR;                                              \
  93.         for(__p##VAR = (VEC)->front; __p##VAR < (VEC)->back; __p##VAR++){ \
  94.             VAR = *__p##VAR;                                            \
  95.             STMT;                                                       \
  96.         }                                                               \
  97.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement