Added flags to queue

This commit is contained in:
Leonardo committed 2020-03-13 14:29:29 -03:00
1 parent f82fb45242
commit db2de0b855
2 files changed
+106 -10

No files matched your search

+47 -10
View File
@@ -247,6 +247,7 @@ struct cmc_callbacks_queue
bool PFX##_full(struct SNAME *_queue_); \ bool PFX##_full(struct SNAME *_queue_); \
size_t PFX##_count(struct SNAME *_queue_); \ size_t PFX##_count(struct SNAME *_queue_); \
size_t PFX##_capacity(struct SNAME *_queue_); \ size_t PFX##_capacity(struct SNAME *_queue_); \
int PFX##_flag(struct SNAME *_queue_); \
/* Collection Utility */ \ /* Collection Utility */ \
bool PFX##_resize(struct SNAME *_queue_, size_t capacity); \ bool PFX##_resize(struct SNAME *_queue_, size_t capacity); \
struct SNAME *PFX##_copy_of(struct SNAME *_queue_); \ struct SNAME *PFX##_copy_of(struct SNAME *_queue_); \
@@ -378,6 +379,7 @@ struct cmc_callbacks_queue
_queue_->count = 0; \ _queue_->count = 0; \
_queue_->front = 0; \ _queue_->front = 0; \
_queue_->back = 0; \ _queue_->back = 0; \
_queue_->flag = cmc_flags.OK; \
} \ } \
\ \
void PFX##_free(struct SNAME *_queue_) \ void PFX##_free(struct SNAME *_queue_) \
@@ -404,13 +406,15 @@ struct cmc_callbacks_queue
\ \
if (callbacks) \ if (callbacks) \
_queue_->callbacks = callbacks; \ _queue_->callbacks = callbacks; \
\
_queue_->flag = cmc_flags.OK; \
} \ } \
\ \
bool PFX##_enqueue(struct SNAME *_queue_, V element) \ bool PFX##_enqueue(struct SNAME *_queue_, V element) \
{ \ { \
if (PFX##_full(_queue_)) \ if (PFX##_full(_queue_)) \
{ \ { \
if (!PFX##_resize(_queue_, PFX##_capacity(_queue_) * 2)) \ if (!PFX##_resize(_queue_, _queue_->capacity * 2)) \
return false; \ return false; \
} \ } \
\ \
@@ -419,6 +423,7 @@ struct cmc_callbacks_queue
_queue_->back = \ _queue_->back = \
(_queue_->back == _queue_->capacity - 1) ? 0 : _queue_->back + 1; \ (_queue_->back == _queue_->capacity - 1) ? 0 : _queue_->back + 1; \
_queue_->count++; \ _queue_->count++; \
_queue_->flag = cmc_flags.OK; \
\ \
return true; \ return true; \
} \ } \
@@ -426,7 +431,10 @@ struct cmc_callbacks_queue
bool PFX##_dequeue(struct SNAME *_queue_) \ bool PFX##_dequeue(struct SNAME *_queue_) \
{ \ { \
if (PFX##_empty(_queue_)) \ if (PFX##_empty(_queue_)) \
{ \
_queue_->flag = cmc_flags.EMPTY; \
return false; \ return false; \
} \
\ \
_queue_->buffer[_queue_->front] = (V){ 0 }; \ _queue_->buffer[_queue_->front] = (V){ 0 }; \
\ \
@@ -434,6 +442,7 @@ struct cmc_callbacks_queue
? 0 \ ? 0 \
: _queue_->front + 1; \ : _queue_->front + 1; \
_queue_->count--; \ _queue_->count--; \
_queue_->flag = cmc_flags.OK; \
\ \
return true; \ return true; \
} \ } \
@@ -441,13 +450,20 @@ struct cmc_callbacks_queue
V PFX##_peek(struct SNAME *_queue_) \ V PFX##_peek(struct SNAME *_queue_) \
{ \ { \
if (PFX##_empty(_queue_)) \ if (PFX##_empty(_queue_)) \
{ \
_queue_->flag = cmc_flags.EMPTY; \
return (V){ 0 }; \ return (V){ 0 }; \
} \
\
_queue_->flag = cmc_flags.OK; \
\ \
return _queue_->buffer[_queue_->front]; \ return _queue_->buffer[_queue_->front]; \
} \ } \
\ \
bool PFX##_contains(struct SNAME *_queue_, V element) \ bool PFX##_contains(struct SNAME *_queue_, V element) \
{ \ { \
_queue_->flag = cmc_flags.OK; \
\
for (size_t i = _queue_->front, j = 0; j < _queue_->count; j++) \ for (size_t i = _queue_->front, j = 0; j < _queue_->count; j++) \
{ \ { \
if (_queue_->f_val->cmp(_queue_->buffer[i], element) == 0) \ if (_queue_->f_val->cmp(_queue_->buffer[i], element) == 0) \
@@ -479,18 +495,31 @@ struct cmc_callbacks_queue
return _queue_->capacity; \ return _queue_->capacity; \
} \ } \
\ \
int PFX##_flag(struct SNAME *_queue_) \
{ \
return _queue_->flag; \
} \
\
bool PFX##_resize(struct SNAME *_queue_, size_t capacity) \ bool PFX##_resize(struct SNAME *_queue_, size_t capacity) \
{ \ { \
if (PFX##_capacity(_queue_) == capacity) \ _queue_->flag = cmc_flags.OK; \
\
if (_queue_->capacity == capacity) \
return true; \ return true; \
\ \
if (capacity < PFX##_count(_queue_)) \ if (capacity < _queue_->count) \
{ \
_queue_->flag = cmc_flags.INVALID; \
return false; \ return false; \
} \
\ \
V *new_buffer = _queue_->alloc->malloc(sizeof(V) * capacity); \ V *new_buffer = _queue_->alloc->malloc(sizeof(V) * capacity); \
\ \
if (!new_buffer) \ if (!new_buffer) \
{ \
_queue_->flag = cmc_flags.ALLOC; \
return false; \ return false; \
} \
\ \
for (size_t i = _queue_->front, j = 0; j < _queue_->count; j++) \ for (size_t i = _queue_->front, j = 0; j < _queue_->count; j++) \
{ \ { \
@@ -516,7 +545,10 @@ struct cmc_callbacks_queue
_queue_->alloc, _queue_->callbacks); \ _queue_->alloc, _queue_->callbacks); \
\ \
if (!result) \ if (!result) \
{ \
_queue_->flag = cmc_flags.ERROR; \
return NULL; \ return NULL; \
} \
\ \
if (_queue_->f_val->cpy) \ if (_queue_->f_val->cpy) \
{ \ { \
@@ -541,17 +573,22 @@ struct cmc_callbacks_queue
result->front = 0; \ result->front = 0; \
result->back = _queue_->count; \ result->back = _queue_->count; \
\ \
_queue_->flag = cmc_flags.OK; \
\
return result; \ return result; \
} \ } \
\ \
bool PFX##_equals(struct SNAME *_queue1_, struct SNAME *_queue2_) \ bool PFX##_equals(struct SNAME *_queue1_, struct SNAME *_queue2_) \
{ \ { \
if (PFX##_count(_queue1_) != PFX##_count(_queue2_)) \ _queue1_->flag = cmc_flags.OK; \
_queue2_->flag = cmc_flags.OK; \
\
if (_queue1_->count != _queue2_->count) \
return false; \ return false; \
\ \
size_t i, j, k; \ size_t i, j, k; \
for (i = _queue1_->front, j = _queue2_->front, k = 0; \ for (i = _queue1_->front, j = _queue2_->front, k = 0; \
k < PFX##_count(_queue1_); k++) \ k < _queue1_->count; k++) \
{ \ { \
if (_queue1_->f_val->cmp(_queue1_->buffer[i], \ if (_queue1_->f_val->cmp(_queue1_->buffer[i], \
_queue2_->buffer[j]) != 0) \ _queue2_->buffer[j]) != 0) \
@@ -644,7 +681,7 @@ struct cmc_callbacks_queue
if (iter->end) \ if (iter->end) \
return false; \ return false; \
\ \
if (iter->index + 1 == PFX##_count(iter->target)) \ if (iter->index + 1 == iter->target->count) \
{ \ { \
iter->end = true; \ iter->end = true; \
return false; \ return false; \
@@ -684,13 +721,13 @@ struct cmc_callbacks_queue
if (iter->end) \ if (iter->end) \
return false; \ return false; \
\ \
if (iter->index + 1 == PFX##_count(iter->target)) \ if (iter->index + 1 == iter->target->count) \
{ \ { \
iter->end = true; \ iter->end = true; \
return false; \ return false; \
} \ } \
\ \
if (steps == 0 || iter->index + steps >= PFX##_count(iter->target)) \ if (steps == 0 || iter->index + steps >= iter->target->count) \
return false; \ return false; \
\ \
iter->start = PFX##_empty(iter->target); \ iter->start = PFX##_empty(iter->target); \
@@ -722,7 +759,7 @@ struct cmc_callbacks_queue
\ \
/* Prevent underflow */ \ /* Prevent underflow */ \
if (iter->cursor < steps) \ if (iter->cursor < steps) \
iter->cursor += PFX##_capacity(iter->target); \ iter->cursor += iter->target->capacity; \
\ \
iter->cursor -= steps; \ iter->cursor -= steps; \
\ \
@@ -733,7 +770,7 @@ struct cmc_callbacks_queue
/* given index */ \ /* given index */ \
bool PFX##_iter_go_to(struct SNAME##_iter *iter, size_t index) \ bool PFX##_iter_go_to(struct SNAME##_iter *iter, size_t index) \
{ \ { \
if (index >= PFX##_count(iter->target)) \ if (index >= iter->target->count) \
return false; \ return false; \
\ \
if (iter->index > index) \ if (iter->index > index) \
+59
View File
@@ -419,4 +419,63 @@ CMC_CREATE_UNIT(queue_test, true, {
q_free(d1); q_free(d1);
q_free(d2); q_free(d2);
}); });
CMC_CREATE_TEST(flag, {
struct queue *q = q_new(100, q_ftab_val);
cmc_assert_not_equals(ptr, NULL, q);
cmc_assert_equals(int32_t, cmc_flags.OK, q_flag(q));
// clear
q->flag = cmc_flags.ERROR;
q_clear(q);
cmc_assert_equals(int32_t, cmc_flags.OK, q_flag(q));
// customize
q->flag = cmc_flags.ERROR;
q_customize(q, NULL, NULL);
cmc_assert_equals(int32_t, cmc_flags.OK, q_flag(q));
// enqueue
q->flag = cmc_flags.ERROR;
q_enqueue(q, 10);
cmc_assert_equals(int32_t, cmc_flags.OK, q_flag(q));
// dequeue
q->flag = cmc_flags.ERROR;
q_dequeue(q);
cmc_assert_equals(int32_t, cmc_flags.OK, q_flag(q));
q_dequeue(q);
cmc_assert_equals(int32_t, cmc_flags.EMPTY, q_flag(q));
// peek
q->flag = cmc_flags.ERROR;
q_peek(q);
cmc_assert_equals(int32_t, cmc_flags.EMPTY, q_flag(q));
cmc_assert(q_enqueue(q, 10));
q_peek(q);
cmc_assert_equals(int32_t, cmc_flags.OK, q_flag(q));
// contains
q->flag = cmc_flags.ERROR;
cmc_assert(q_contains(q, 10));
cmc_assert_equals(int32_t, cmc_flags.OK, q_flag(q));
// copy_of
q->flag = cmc_flags.OK;
struct queue *q2 = q_copy_of(q);
cmc_assert_equals(int32_t, cmc_flags.OK, q_flag(q));
cmc_assert_equals(int32_t, cmc_flags.OK, q_flag(q2));
// equals
q->flag = cmc_flags.OK;
q2->flag = cmc_flags.OK;
cmc_assert(q_equals(q, q2));
cmc_assert_equals(int32_t, cmc_flags.OK, q_flag(q));
cmc_assert_equals(int32_t, cmc_flags.OK, q_flag(q2));
q_free(q);
});
}); });