From bddb9252f350d405ddea989ead1a8ded8c4aab67 Mon Sep 17 00:00:00 2001 From: Leonardo Date: Thu, 11 Apr 2019 14:43:28 -0300 Subject: [PATCH] Fixing iterators --- src/deque.h | 564 +++++++++++++++++++++++------------------------ src/hashmap.h | 4 +- src/hashset.h | 4 +- src/heap.h | 4 +- src/linkedlist.h | 4 +- src/list.h | 4 +- src/queue.h | 449 +++++++++++++++++++------------------ src/stack.h | 4 +- src/treemap.h | 4 +- src/treeset.h | 4 +- 10 files changed, 521 insertions(+), 524 deletions(-) diff --git a/src/deque.h b/src/deque.h index 4cfff52..26bfa3c 100644 --- a/src/deque.h +++ b/src/deque.h @@ -90,289 +90,287 @@ FMOD bool PFX##_iter_prev(SNAME##_iter *iter, V *result, size_t *index); \ \ /* SOURCE ********************************************************************/ -#define DEQUE_GENERATE_SOURCE(PFX, SNAME, FMOD, V) \ - \ - FMOD bool PFX##_grow(SNAME *_deque_); \ - \ - FMOD SNAME *PFX##_new(size_t size) \ - { \ - if (size < 1) \ - return NULL; \ - \ - SNAME *_deque_ = malloc(sizeof(SNAME)); \ - \ - if (!_deque_) \ - return NULL; \ - \ - _deque_->buffer = malloc(sizeof(V) * size); \ - \ - if (!_deque_->buffer) \ - { \ - free(_deque_); \ - return NULL; \ - } \ - \ - memset(_deque_->buffer, 0, sizeof(V) * size); \ - \ - _deque_->capacity = size; \ - _deque_->count = 0; \ - _deque_->front = 0; \ - _deque_->rear = 0; \ - \ - return _deque_; \ - } \ - \ - FMOD void PFX##_clear(SNAME *_deque_) \ - { \ - memset(_deque_->buffer, 0, sizeof(V) * _deque_->capacity); \ - \ - _deque_->count = 0; \ - _deque_->front = 0; \ - _deque_->rear = 0; \ - } \ - \ - FMOD void PFX##_free(SNAME *_deque_) \ - { \ - free(_deque_->buffer); \ - free(_deque_); \ - } \ - \ - FMOD bool PFX##_push_front(SNAME *_deque_, V element) \ - { \ - if (PFX##_full(_deque_)) \ - { \ - if (!PFX##_grow(_deque_)) \ - return false; \ - } \ - \ - _deque_->front = (_deque_->front == 0) ? _deque_->capacity - 1 : _deque_->front - 1; \ - \ - _deque_->buffer[_deque_->front] = element; \ - \ - _deque_->count++; \ - \ - return true; \ - } \ - \ - FMOD bool PFX##_push_back(SNAME *_deque_, V element) \ - { \ - if (PFX##_full(_deque_)) \ - { \ - if (!PFX##_grow(_deque_)) \ - return false; \ - } \ - \ - _deque_->buffer[_deque_->rear] = element; \ - \ - _deque_->rear = (_deque_->rear == _deque_->capacity - 1) ? 0 : _deque_->rear + 1; \ - \ - _deque_->count++; \ - \ - return true; \ - } \ - \ - FMOD bool PFX##_pop_front(SNAME *_deque_) \ - { \ - if (PFX##_empty(_deque_)) \ - return false; \ - \ - _deque_->buffer[_deque_->front] = 0; \ - \ - _deque_->front = (_deque_->front == _deque_->capacity - 1) ? 0 : _deque_->front + 1; \ - \ - _deque_->count--; \ - \ - return true; \ - } \ - \ - FMOD bool PFX##_pop_back(SNAME *_deque_) \ - { \ - if (PFX##_empty(_deque_)) \ - return false; \ - \ - _deque_->rear = (_deque_->rear == 0) ? _deque_->capacity - 1 : _deque_->rear - 1; \ - \ - _deque_->buffer[_deque_->rear] = 0; \ - \ - _deque_->count--; \ - \ - return true; \ - } \ - \ - FMOD bool PFX##_push_front_if(SNAME *_deque_, V element, bool condition) \ - { \ - if (condition) \ - return PFX##_push_front(_deque_, element); \ - \ - return false; \ - } \ - \ - FMOD bool PFX##_push_back_if(SNAME *_deque_, V element, bool condition) \ - { \ - if (condition) \ - return PFX##_push_back(_deque_, element); \ - \ - return false; \ - } \ - \ - FMOD bool PFX##_pop_front_if(SNAME *_deque_, bool condition) \ - { \ - if (condition) \ - return PFX##_pop_front(_deque_); \ - \ - return false; \ - } \ - \ - FMOD bool PFX##_pop_back_if(SNAME *_deque_, bool condition) \ - { \ - if (condition) \ - return PFX##_pop_back(_deque_); \ - \ - return false; \ - } \ - \ - FMOD V PFX##_front(SNAME *_deque_) \ - { \ - if (PFX##_empty(_deque_)) \ - return 0; \ - \ - return _deque_->buffer[_deque_->front]; \ - } \ - \ - FMOD V PFX##_back(SNAME *_deque_) \ - { \ - if (PFX##_empty(_deque_)) \ - return 0; \ - \ - return _deque_->buffer[(_deque_->rear == 0) ? _deque_->capacity - 1 : _deque_->rear - 1]; \ - } \ - \ - FMOD bool PFX##_empty(SNAME *_deque_) \ - { \ - return _deque_->count == 0; \ - } \ - \ - FMOD bool PFX##_full(SNAME *_deque_) \ - { \ - return _deque_->count >= _deque_->capacity; \ - } \ - \ - FMOD size_t PFX##_count(SNAME *_deque_) \ - { \ - return _deque_->count; \ - } \ - \ - FMOD size_t PFX##_capacity(SNAME *_deque_) \ - { \ - return _deque_->capacity; \ - } \ - \ - FMOD void PFX##_iter_new(SNAME##_iter *iter, SNAME *target) \ - { \ - iter->target = target; \ - iter->cursor = target->front; \ - iter->index = 0; \ - iter->start = true; \ - iter->end = PFX##_empty(target); \ - } \ - \ - FMOD bool PFX##_iter_start(SNAME##_iter *iter) \ - { \ - return iter->cursor == iter->target->front && iter->start; \ - } \ - \ - FMOD bool PFX##_iter_end(SNAME##_iter *iter) \ - { \ - size_t real_rear = iter->target->rear == 0 ? iter->target->capacity - 1 : iter->target->rear - 1; \ - \ - return iter->cursor == real_rear && iter->end; \ - } \ - \ - FMOD void PFX##_iter_tostart(SNAME##_iter *iter) \ - { \ - iter->cursor = iter->target->front; \ - iter->index = 0; \ - iter->start = true; \ - iter->end = PFX##_empty(iter->target); \ - } \ - \ - FMOD void PFX##_iter_toend(SNAME##_iter *iter) \ - { \ - if (PFX##_empty(iter->target)) \ - iter->cursor = 0; \ - else \ - iter->cursor = (iter->target->rear == 0) ? iter->target->count - 1 : iter->target->rear - 1; \ - \ - iter->index = iter->target->count - 1; \ - iter->start = PFX##_empty(iter->target); \ - iter->end = true; \ - } \ - \ - FMOD bool PFX##_iter_next(SNAME##_iter *iter, V *result, size_t *index) \ - { \ - if (iter->end) \ - return false; \ - \ - *index = iter->index; \ - *result = iter->target->buffer[iter->cursor]; \ - \ - iter->start = false; \ - \ - if (iter->index == iter->target->count - 1) \ - iter->end = true; \ - else \ - { \ - iter->cursor = (iter->cursor + 1) % (iter->target->capacity); \ - iter->index++; \ - } \ - \ - return true; \ - } \ - \ - FMOD bool PFX##_iter_prev(SNAME##_iter *iter, V *result, size_t *index) \ - { \ - if (iter->start) \ - return false; \ - \ - *index = iter->index; \ - *result = iter->target->buffer[iter->cursor]; \ - \ - iter->end = false; \ - \ - if (iter->index == 0) \ - iter->start = true; \ - else \ - { \ - iter->cursor = (iter->cursor == 0) ? iter->target->capacity - 1 : iter->cursor - 1; \ - iter->index--; \ - } \ - \ - return true; \ - } \ - \ - FMOD bool PFX##_grow(SNAME *_deque_) \ - { \ - \ - size_t new_capacity = _deque_->capacity * 2; \ - \ - V *new_buffer = malloc(sizeof(V) * new_capacity); \ - \ - if (!new_buffer) \ - return false; \ - \ - for (size_t i = _deque_->front, j = 0; j < _deque_->count; i = (i + 1) % _deque_->capacity, j++) \ - { \ - new_buffer[j] = _deque_->buffer[i]; \ - } \ - \ - free(_deque_->buffer); \ - \ - _deque_->buffer = new_buffer; \ - _deque_->capacity = new_capacity; \ - _deque_->front = 0; \ - _deque_->rear = _deque_->count; \ - \ - return true; \ +#define DEQUE_GENERATE_SOURCE(PFX, SNAME, FMOD, V) \ + \ + FMOD bool PFX##_grow(SNAME *_deque_); \ + \ + FMOD SNAME *PFX##_new(size_t size) \ + { \ + if (size < 1) \ + return NULL; \ + \ + SNAME *_deque_ = malloc(sizeof(SNAME)); \ + \ + if (!_deque_) \ + return NULL; \ + \ + _deque_->buffer = malloc(sizeof(V) * size); \ + \ + if (!_deque_->buffer) \ + { \ + free(_deque_); \ + return NULL; \ + } \ + \ + memset(_deque_->buffer, 0, sizeof(V) * size); \ + \ + _deque_->capacity = size; \ + _deque_->count = 0; \ + _deque_->front = 0; \ + _deque_->rear = 0; \ + \ + return _deque_; \ + } \ + \ + FMOD void PFX##_clear(SNAME *_deque_) \ + { \ + memset(_deque_->buffer, 0, sizeof(V) * _deque_->capacity); \ + \ + _deque_->count = 0; \ + _deque_->front = 0; \ + _deque_->rear = 0; \ + } \ + \ + FMOD void PFX##_free(SNAME *_deque_) \ + { \ + free(_deque_->buffer); \ + free(_deque_); \ + } \ + \ + FMOD bool PFX##_push_front(SNAME *_deque_, V element) \ + { \ + if (PFX##_full(_deque_)) \ + { \ + if (!PFX##_grow(_deque_)) \ + return false; \ + } \ + \ + _deque_->front = (_deque_->front == 0) ? _deque_->capacity - 1 : _deque_->front - 1; \ + \ + _deque_->buffer[_deque_->front] = element; \ + \ + _deque_->count++; \ + \ + return true; \ + } \ + \ + FMOD bool PFX##_push_back(SNAME *_deque_, V element) \ + { \ + if (PFX##_full(_deque_)) \ + { \ + if (!PFX##_grow(_deque_)) \ + return false; \ + } \ + \ + _deque_->buffer[_deque_->rear] = element; \ + \ + _deque_->rear = (_deque_->rear == _deque_->capacity - 1) ? 0 : _deque_->rear + 1; \ + \ + _deque_->count++; \ + \ + return true; \ + } \ + \ + FMOD bool PFX##_pop_front(SNAME *_deque_) \ + { \ + if (PFX##_empty(_deque_)) \ + return false; \ + \ + _deque_->buffer[_deque_->front] = 0; \ + \ + _deque_->front = (_deque_->front == _deque_->capacity - 1) ? 0 : _deque_->front + 1; \ + \ + _deque_->count--; \ + \ + return true; \ + } \ + \ + FMOD bool PFX##_pop_back(SNAME *_deque_) \ + { \ + if (PFX##_empty(_deque_)) \ + return false; \ + \ + _deque_->rear = (_deque_->rear == 0) ? _deque_->capacity - 1 : _deque_->rear - 1; \ + \ + _deque_->buffer[_deque_->rear] = 0; \ + \ + _deque_->count--; \ + \ + return true; \ + } \ + \ + FMOD bool PFX##_push_front_if(SNAME *_deque_, V element, bool condition) \ + { \ + if (condition) \ + return PFX##_push_front(_deque_, element); \ + \ + return false; \ + } \ + \ + FMOD bool PFX##_push_back_if(SNAME *_deque_, V element, bool condition) \ + { \ + if (condition) \ + return PFX##_push_back(_deque_, element); \ + \ + return false; \ + } \ + \ + FMOD bool PFX##_pop_front_if(SNAME *_deque_, bool condition) \ + { \ + if (condition) \ + return PFX##_pop_front(_deque_); \ + \ + return false; \ + } \ + \ + FMOD bool PFX##_pop_back_if(SNAME *_deque_, bool condition) \ + { \ + if (condition) \ + return PFX##_pop_back(_deque_); \ + \ + return false; \ + } \ + \ + FMOD V PFX##_front(SNAME *_deque_) \ + { \ + if (PFX##_empty(_deque_)) \ + return 0; \ + \ + return _deque_->buffer[_deque_->front]; \ + } \ + \ + FMOD V PFX##_back(SNAME *_deque_) \ + { \ + if (PFX##_empty(_deque_)) \ + return 0; \ + \ + return _deque_->buffer[(_deque_->rear == 0) ? _deque_->capacity - 1 : _deque_->rear - 1]; \ + } \ + \ + FMOD bool PFX##_empty(SNAME *_deque_) \ + { \ + return _deque_->count == 0; \ + } \ + \ + FMOD bool PFX##_full(SNAME *_deque_) \ + { \ + return _deque_->count >= _deque_->capacity; \ + } \ + \ + FMOD size_t PFX##_count(SNAME *_deque_) \ + { \ + return _deque_->count; \ + } \ + \ + FMOD size_t PFX##_capacity(SNAME *_deque_) \ + { \ + return _deque_->capacity; \ + } \ + \ + FMOD void PFX##_iter_new(SNAME##_iter *iter, SNAME *target) \ + { \ + iter->target = target; \ + iter->cursor = target->front; \ + iter->index = 0; \ + iter->start = true; \ + iter->end = PFX##_empty(target); \ + } \ + \ + FMOD bool PFX##_iter_start(SNAME##_iter *iter) \ + { \ + return PFX##_empty(iter->target) || iter->start; \ + } \ + \ + FMOD bool PFX##_iter_end(SNAME##_iter *iter) \ + { \ + return PFX##_empty(iter->target) || iter->end; \ + } \ + \ + FMOD void PFX##_iter_tostart(SNAME##_iter *iter) \ + { \ + iter->cursor = iter->target->front; \ + iter->index = 0; \ + iter->start = true; \ + iter->end = PFX##_empty(iter->target); \ + } \ + \ + FMOD void PFX##_iter_toend(SNAME##_iter *iter) \ + { \ + if (PFX##_empty(iter->target)) \ + iter->cursor = 0; \ + else \ + iter->cursor = (iter->target->rear == 0) ? iter->target->count - 1 : iter->target->rear - 1; \ + \ + iter->index = iter->target->count - 1; \ + iter->start = PFX##_empty(iter->target); \ + iter->end = true; \ + } \ + \ + FMOD bool PFX##_iter_next(SNAME##_iter *iter, V *result, size_t *index) \ + { \ + if (iter->end) \ + return false; \ + \ + *index = iter->index; \ + *result = iter->target->buffer[iter->cursor]; \ + \ + iter->start = false; \ + \ + if (iter->index == iter->target->count - 1) \ + iter->end = true; \ + else \ + { \ + iter->cursor = (iter->cursor + 1) % (iter->target->capacity); \ + iter->index++; \ + } \ + \ + return true; \ + } \ + \ + FMOD bool PFX##_iter_prev(SNAME##_iter *iter, V *result, size_t *index) \ + { \ + if (iter->start) \ + return false; \ + \ + *index = iter->index; \ + *result = iter->target->buffer[iter->cursor]; \ + \ + iter->end = false; \ + \ + if (iter->index == 0) \ + iter->start = true; \ + else \ + { \ + iter->cursor = (iter->cursor == 0) ? iter->target->capacity - 1 : iter->cursor - 1; \ + iter->index--; \ + } \ + \ + return true; \ + } \ + \ + FMOD bool PFX##_grow(SNAME *_deque_) \ + { \ + \ + size_t new_capacity = _deque_->capacity * 2; \ + \ + V *new_buffer = malloc(sizeof(V) * new_capacity); \ + \ + if (!new_buffer) \ + return false; \ + \ + for (size_t i = _deque_->front, j = 0; j < _deque_->count; i = (i + 1) % _deque_->capacity, j++) \ + { \ + new_buffer[j] = _deque_->buffer[i]; \ + } \ + \ + free(_deque_->buffer); \ + \ + _deque_->buffer = new_buffer; \ + _deque_->capacity = new_capacity; \ + _deque_->front = 0; \ + _deque_->rear = _deque_->count; \ + \ + return true; \ } #endif /* CMC_DEQUE_H */ diff --git a/src/hashmap.h b/src/hashmap.h index ff858a2..6634538 100644 --- a/src/hashmap.h +++ b/src/hashmap.h @@ -379,12 +379,12 @@ static const size_t cmc_hashtable_primes[] = {53, 97, 193, 389, 769, 1543, 3079, \ FMOD bool PFX##_iter_start(SNAME##_iter *iter) \ { \ - return iter->start && iter->cursor == iter->first; \ + return PFX##_empty(iter->target) || iter->start; \ } \ \ FMOD bool PFX##_iter_end(SNAME##_iter *iter) \ { \ - return iter->end && iter->cursor == iter->last; \ + return PFX##_empty(iter->target) || iter->end; \ } \ \ FMOD void PFX##_iter_tostart(SNAME##_iter *iter) \ diff --git a/src/hashset.h b/src/hashset.h index 81a59c2..2a5a8f3 100644 --- a/src/hashset.h +++ b/src/hashset.h @@ -460,12 +460,12 @@ static const size_t cmc_hashtable_primes[] = {53, 97, 193, 389, 769, 1543, 3079, \ FMOD bool PFX##_iter_start(SNAME##_iter *iter) \ { \ - return iter->start && iter->cursor == iter->first; \ + return PFX##_empty(iter->target) || iter->start; \ } \ \ FMOD bool PFX##_iter_end(SNAME##_iter *iter) \ { \ - return iter->end && iter->cursor == iter->last; \ + return PFX##_empty(iter->target) || iter->end; \ } \ \ FMOD void PFX##_iter_tostart(SNAME##_iter *iter) \ diff --git a/src/heap.h b/src/heap.h index e7e0364..513e136 100644 --- a/src/heap.h +++ b/src/heap.h @@ -236,12 +236,12 @@ typedef enum HeapOrder \ FMOD bool PFX##_iter_start(SNAME##_iter *iter) \ { \ - return iter->cursor == 0 && iter->start; \ + return PFX##_empty(iter->target) || iter->start; \ } \ \ FMOD bool PFX##_iter_end(SNAME##_iter *iter) \ { \ - return iter->cursor == iter->target->count - 1 && iter->end; \ + return PFX##_empty(iter->target) || iter->end; \ } \ \ FMOD void PFX##_iter_tostart(SNAME##_iter *iter) \ diff --git a/src/linkedlist.h b/src/linkedlist.h index 2c39b2d..4f4c48c 100644 --- a/src/linkedlist.h +++ b/src/linkedlist.h @@ -534,12 +534,12 @@ \ FMOD bool PFX##_iter_start(SNAME##_iter *iter) \ { \ - return iter->cursor->prev == NULL && iter->start; \ + return PFX##_empty(iter->target) || iter->start; \ } \ \ FMOD bool PFX##_iter_end(SNAME##_iter *iter) \ { \ - return iter->cursor->next == NULL && iter->end; \ + return PFX##_empty(iter->target) || iter->end; \ } \ \ FMOD void PFX##_iter_tostart(SNAME##_iter *iter) \ diff --git a/src/list.h b/src/list.h index 5b8a436..bbbe684 100644 --- a/src/list.h +++ b/src/list.h @@ -457,12 +457,12 @@ \ FMOD bool PFX##_iter_start(SNAME##_iter *iter) \ { \ - return iter->cursor == 0 && iter->start; \ + return PFX##_empty(iter->target) || iter->start; \ } \ \ FMOD bool PFX##_iter_end(SNAME##_iter *iter) \ { \ - return iter->cursor == iter->target->count - 1 && iter->end; \ + return PFX##_empty(iter->target) || iter->end; \ } \ \ FMOD void PFX##_iter_tostart(SNAME##_iter *iter) \ diff --git a/src/queue.h b/src/queue.h index 9ccd152..1d76bd7 100644 --- a/src/queue.h +++ b/src/queue.h @@ -85,231 +85,230 @@ FMOD bool PFX##_iter_prev(SNAME##_iter *iter, V *result, size_t *index); \ \ /* SOURCE ********************************************************************/ -#define QUEUE_GENERATE_SOURCE(PFX, SNAME, FMOD, V) \ - \ - FMOD bool PFX##_grow(SNAME *_queue_); \ - \ - FMOD SNAME *PFX##_new(size_t size) \ - { \ - if (size < 1) \ - return NULL; \ - \ - SNAME *_queue_ = malloc(sizeof(SNAME)); \ - \ - if (!_queue_) \ - return NULL; \ - \ - _queue_->buffer = malloc(sizeof(V) * size); \ - \ - if (!_queue_->buffer) \ - { \ - free(_queue_); \ - return NULL; \ - } \ - \ - memset(_queue_->buffer, 0, sizeof(V) * size); \ - \ - _queue_->capacity = size; \ - _queue_->count = 0; \ - _queue_->front = 0; \ - _queue_->rear = 0; \ - \ - return _queue_; \ - } \ - \ - FMOD void PFX##_clear(SNAME *_queue_) \ - { \ - memset(_queue_->buffer, 0, sizeof(V) * _queue_->capacity); \ - \ - _queue_->count = 0; \ - _queue_->front = 0; \ - _queue_->rear = 0; \ - } \ - \ - FMOD void PFX##_free(SNAME *_queue_) \ - { \ - free(_queue_->buffer); \ - free(_queue_); \ - } \ - \ - FMOD bool PFX##_enqueue(SNAME *_queue_, V element) \ - { \ - if (PFX##_full(_queue_)) \ - { \ - if (!PFX##_grow(_queue_)) \ - return false; \ - } \ - \ - _queue_->buffer[_queue_->rear] = element; \ - \ - _queue_->rear = (_queue_->rear == _queue_->capacity - 1) ? 0 : _queue_->rear + 1; \ - _queue_->count++; \ - \ - return true; \ - } \ - \ - FMOD bool PFX##_dequeue(SNAME *_queue_) \ - { \ - if (PFX##_empty(_queue_)) \ - return false; \ - \ - _queue_->buffer[_queue_->front] = 0; \ - \ - _queue_->front = (_queue_->front == _queue_->capacity - 1) ? 0 : _queue_->front + 1; \ - _queue_->count--; \ - \ - return true; \ - } \ - \ - FMOD bool PFX##_enqueue_if(SNAME *_queue_, V element, bool condition) \ - { \ - if (condition) \ - return PFX##_enqueue(_queue_, element); \ - \ - return false; \ - } \ - \ - FMOD bool PFX##_dequeue_if(SNAME *_queue_, bool condition) \ - { \ - if (condition) \ - return PFX##_dequeue(_queue_); \ - \ - return false; \ - } \ - \ - FMOD V PFX##_peek(SNAME *_queue_) \ - { \ - if (PFX##_empty(_queue_)) \ - return 0; \ - \ - return _queue_->buffer[_queue_->front]; \ - } \ - \ - FMOD bool PFX##_empty(SNAME *_queue_) \ - { \ - return _queue_->count == 0; \ - } \ - \ - FMOD bool PFX##_full(SNAME *_queue_) \ - { \ - return _queue_->count >= _queue_->capacity; \ - } \ - \ - FMOD size_t PFX##_count(SNAME *_queue_) \ - { \ - return _queue_->count; \ - } \ - \ - FMOD size_t PFX##_capacity(SNAME *_queue_) \ - { \ - return _queue_->capacity; \ - } \ - \ - FMOD void PFX##_iter_new(SNAME##_iter *iter, SNAME *target) \ - { \ - iter->target = target; \ - iter->cursor = target->front; \ - iter->index = 0; \ - iter->start = true; \ - iter->end = PFX##_empty(target); \ - } \ - \ - FMOD bool PFX##_iter_start(SNAME##_iter *iter) \ - { \ - return iter->cursor == iter->target->front && iter->start; \ - } \ - \ - FMOD bool PFX##_iter_end(SNAME##_iter *iter) \ - { \ - size_t real_rear = iter->target->rear == 0 ? iter->target->capacity - 1 : iter->target->rear - 1; \ - return iter->cursor == real_rear && iter->end; \ - } \ - \ - FMOD void PFX##_iter_tostart(SNAME##_iter *iter) \ - { \ - iter->cursor = iter->target->front; \ - iter->index = 0; \ - iter->start = true; \ - iter->end = PFX##_empty(iter->target); \ - } \ - \ - FMOD void PFX##_iter_toend(SNAME##_iter *iter) \ - { \ - if (PFX##_empty(iter->target)) \ - iter->cursor = 0; \ - else \ - iter->cursor = (iter->target->rear == 0) ? iter->target->count - 1 : iter->target->rear - 1; \ - \ - iter->index = iter->target->count - 1; \ - iter->start = PFX##_empty(iter->target); \ - iter->end = true; \ - } \ - \ - FMOD bool PFX##_iter_next(SNAME##_iter *iter, V *result, size_t *index) \ - { \ - if (iter->end) \ - return false; \ - \ - *index = iter->index; \ - *result = iter->target->buffer[iter->cursor]; \ - \ - iter->start = false; \ - \ - if (iter->index == iter->target->count - 1) \ - iter->end = true; \ - else \ - { \ - iter->cursor = (iter->cursor + 1) % (iter->target->capacity); \ - iter->index++; \ - } \ - \ - return true; \ - } \ - \ - FMOD bool PFX##_iter_prev(SNAME##_iter *iter, V *result, size_t *index) \ - { \ - if (iter->start) \ - return false; \ - \ - *index = iter->index; \ - *result = iter->target->buffer[iter->cursor]; \ - \ - iter->end = false; \ - \ - if (iter->index == 0) \ - iter->start = true; \ - else \ - { \ - iter->cursor = (iter->cursor == 0) ? iter->target->capacity - 1 : iter->cursor - 1; \ - iter->index--; \ - } \ - \ - return true; \ - } \ - \ - FMOD bool PFX##_grow(SNAME *_queue_) \ - { \ - \ - size_t new_capacity = _queue_->capacity * 2; \ - \ - V *new_buffer = malloc(sizeof(V) * new_capacity); \ - \ - if (!new_buffer) \ - return false; \ - \ - for (size_t i = _queue_->front, j = 0; j < _queue_->count; i = (i + 1) % _queue_->capacity, j++) \ - { \ - new_buffer[j] = _queue_->buffer[i]; \ - } \ - \ - free(_queue_->buffer); \ - \ - _queue_->buffer = new_buffer; \ - _queue_->capacity = new_capacity; \ - _queue_->front = 0; \ - _queue_->rear = _queue_->count; \ - \ - return true; \ +#define QUEUE_GENERATE_SOURCE(PFX, SNAME, FMOD, V) \ + \ + FMOD bool PFX##_grow(SNAME *_queue_); \ + \ + FMOD SNAME *PFX##_new(size_t size) \ + { \ + if (size < 1) \ + return NULL; \ + \ + SNAME *_queue_ = malloc(sizeof(SNAME)); \ + \ + if (!_queue_) \ + return NULL; \ + \ + _queue_->buffer = malloc(sizeof(V) * size); \ + \ + if (!_queue_->buffer) \ + { \ + free(_queue_); \ + return NULL; \ + } \ + \ + memset(_queue_->buffer, 0, sizeof(V) * size); \ + \ + _queue_->capacity = size; \ + _queue_->count = 0; \ + _queue_->front = 0; \ + _queue_->rear = 0; \ + \ + return _queue_; \ + } \ + \ + FMOD void PFX##_clear(SNAME *_queue_) \ + { \ + memset(_queue_->buffer, 0, sizeof(V) * _queue_->capacity); \ + \ + _queue_->count = 0; \ + _queue_->front = 0; \ + _queue_->rear = 0; \ + } \ + \ + FMOD void PFX##_free(SNAME *_queue_) \ + { \ + free(_queue_->buffer); \ + free(_queue_); \ + } \ + \ + FMOD bool PFX##_enqueue(SNAME *_queue_, V element) \ + { \ + if (PFX##_full(_queue_)) \ + { \ + if (!PFX##_grow(_queue_)) \ + return false; \ + } \ + \ + _queue_->buffer[_queue_->rear] = element; \ + \ + _queue_->rear = (_queue_->rear == _queue_->capacity - 1) ? 0 : _queue_->rear + 1; \ + _queue_->count++; \ + \ + return true; \ + } \ + \ + FMOD bool PFX##_dequeue(SNAME *_queue_) \ + { \ + if (PFX##_empty(_queue_)) \ + return false; \ + \ + _queue_->buffer[_queue_->front] = 0; \ + \ + _queue_->front = (_queue_->front == _queue_->capacity - 1) ? 0 : _queue_->front + 1; \ + _queue_->count--; \ + \ + return true; \ + } \ + \ + FMOD bool PFX##_enqueue_if(SNAME *_queue_, V element, bool condition) \ + { \ + if (condition) \ + return PFX##_enqueue(_queue_, element); \ + \ + return false; \ + } \ + \ + FMOD bool PFX##_dequeue_if(SNAME *_queue_, bool condition) \ + { \ + if (condition) \ + return PFX##_dequeue(_queue_); \ + \ + return false; \ + } \ + \ + FMOD V PFX##_peek(SNAME *_queue_) \ + { \ + if (PFX##_empty(_queue_)) \ + return 0; \ + \ + return _queue_->buffer[_queue_->front]; \ + } \ + \ + FMOD bool PFX##_empty(SNAME *_queue_) \ + { \ + return _queue_->count == 0; \ + } \ + \ + FMOD bool PFX##_full(SNAME *_queue_) \ + { \ + return _queue_->count >= _queue_->capacity; \ + } \ + \ + FMOD size_t PFX##_count(SNAME *_queue_) \ + { \ + return _queue_->count; \ + } \ + \ + FMOD size_t PFX##_capacity(SNAME *_queue_) \ + { \ + return _queue_->capacity; \ + } \ + \ + FMOD void PFX##_iter_new(SNAME##_iter *iter, SNAME *target) \ + { \ + iter->target = target; \ + iter->cursor = target->front; \ + iter->index = 0; \ + iter->start = true; \ + iter->end = PFX##_empty(target); \ + } \ + \ + FMOD bool PFX##_iter_start(SNAME##_iter *iter) \ + { \ + return PFX##_empty(iter->target) || iter->start; \ + } \ + \ + FMOD bool PFX##_iter_end(SNAME##_iter *iter) \ + { \ + return PFX##_empty(iter->target) || iter->end; \ + } \ + \ + FMOD void PFX##_iter_tostart(SNAME##_iter *iter) \ + { \ + iter->cursor = iter->target->front; \ + iter->index = 0; \ + iter->start = true; \ + iter->end = PFX##_empty(iter->target); \ + } \ + \ + FMOD void PFX##_iter_toend(SNAME##_iter *iter) \ + { \ + if (PFX##_empty(iter->target)) \ + iter->cursor = 0; \ + else \ + iter->cursor = (iter->target->rear == 0) ? iter->target->count - 1 : iter->target->rear - 1; \ + \ + iter->index = iter->target->count - 1; \ + iter->start = PFX##_empty(iter->target); \ + iter->end = true; \ + } \ + \ + FMOD bool PFX##_iter_next(SNAME##_iter *iter, V *result, size_t *index) \ + { \ + if (iter->end) \ + return false; \ + \ + *index = iter->index; \ + *result = iter->target->buffer[iter->cursor]; \ + \ + iter->start = false; \ + \ + if (iter->index == iter->target->count - 1) \ + iter->end = true; \ + else \ + { \ + iter->cursor = (iter->cursor + 1) % (iter->target->capacity); \ + iter->index++; \ + } \ + \ + return true; \ + } \ + \ + FMOD bool PFX##_iter_prev(SNAME##_iter *iter, V *result, size_t *index) \ + { \ + if (iter->start) \ + return false; \ + \ + *index = iter->index; \ + *result = iter->target->buffer[iter->cursor]; \ + \ + iter->end = false; \ + \ + if (iter->index == 0) \ + iter->start = true; \ + else \ + { \ + iter->cursor = (iter->cursor == 0) ? iter->target->capacity - 1 : iter->cursor - 1; \ + iter->index--; \ + } \ + \ + return true; \ + } \ + \ + FMOD bool PFX##_grow(SNAME *_queue_) \ + { \ + \ + size_t new_capacity = _queue_->capacity * 2; \ + \ + V *new_buffer = malloc(sizeof(V) * new_capacity); \ + \ + if (!new_buffer) \ + return false; \ + \ + for (size_t i = _queue_->front, j = 0; j < _queue_->count; i = (i + 1) % _queue_->capacity, j++) \ + { \ + new_buffer[j] = _queue_->buffer[i]; \ + } \ + \ + free(_queue_->buffer); \ + \ + _queue_->buffer = new_buffer; \ + _queue_->capacity = new_capacity; \ + _queue_->front = 0; \ + _queue_->rear = _queue_->count; \ + \ + return true; \ } #endif /* CMC_QUEUE_H */ diff --git a/src/stack.h b/src/stack.h index 8e493a1..2634a3c 100644 --- a/src/stack.h +++ b/src/stack.h @@ -202,12 +202,12 @@ \ FMOD bool PFX##_iter_start(SNAME##_iter *iter) \ { \ - return iter->cursor == iter->target->count - 1 && iter->start; \ + return PFX##_empty(iter->target) || iter->start; \ } \ \ FMOD bool PFX##_iter_end(SNAME##_iter *iter) \ { \ - return iter->cursor == 0 && iter->end; \ + return PFX##_empty(iter->target) || iter->end; \ } \ \ FMOD void PFX##_iter_tostart(SNAME##_iter *iter) \ diff --git a/src/treemap.h b/src/treemap.h index e12cc88..ced66ab 100644 --- a/src/treemap.h +++ b/src/treemap.h @@ -448,12 +448,12 @@ \ FMOD bool PFX##_iter_start(SNAME##_iter *iter) \ { \ - return iter->start && iter->cursor == iter->first; \ + return PFX##_empty(iter->target) || iter->start; \ } \ \ FMOD bool PFX##_iter_end(SNAME##_iter *iter) \ { \ - return iter->end && iter->cursor == iter->last; \ + return PFX##_empty(iter->target) || iter->end; \ } \ \ FMOD void PFX##_iter_tostart(SNAME##_iter *iter) \ diff --git a/src/treeset.h b/src/treeset.h index 2969a24..a875f89 100644 --- a/src/treeset.h +++ b/src/treeset.h @@ -540,12 +540,12 @@ \ FMOD bool PFX##_iter_start(SNAME##_iter *iter) \ { \ - return iter->start && iter->cursor == iter->first; \ + return PFX##_empty(iter->target) || iter->start; \ } \ \ FMOD bool PFX##_iter_end(SNAME##_iter *iter) \ { \ - return iter->end && iter->cursor == iter->last; \ + return PFX##_empty(iter->target) || iter->end; \ } \ \ FMOD void PFX##_iter_tostart(SNAME##_iter *iter) \