diff --git a/demo/demo_deque.c b/demo/demo_deque.c index e8bbb72..cc90e48 100644 --- a/demo/demo_deque.c +++ b/demo/demo_deque.c @@ -17,7 +17,7 @@ static void demo_deque_num(void) int temp = 0; size_t len = sizeof(data) / sizeof(data[0]); - deque_t deque = deque_new(sizeof(int)); + deque_t deque = deque_new(sizeof(int), len); deque->print_obj = print_num; printf("\n\n----- demo_deque_num -----\n"); @@ -190,7 +190,7 @@ static void demo_deque_struct(void) struct _student temp = {0}; size_t len = sizeof(data) / sizeof(data[0]); - deque_t deque = deque_new(sizeof(struct _student)); + deque_t deque = deque_new(sizeof(struct _student), len); deque->print_obj = print_struct; printf("\n\n----- demo_deque_struct -----\n"); diff --git a/doc/README.md b/doc/README.md index 77c14f7..7be8a8e 100644 --- a/doc/README.md +++ b/doc/README.md @@ -8,10 +8,10 @@ flowchart TB darray linklist dlinklist + ringbuffer[ringbuffer
小数据或尽量不扩容] end subgraph hal - ringbuffer[ringbuffer
小数据或尽量不扩容] --> darray segarray[segarray
大数据扩容优先] --> darray end diff --git a/include/deque.h b/include/deque.h index 145d5cb..d050202 100644 --- a/include/deque.h +++ b/include/deque.h @@ -12,6 +12,7 @@ #define _DEQUE_H_ #include "unicstl_internal.h" +#include "ringbuffer.h" enum _deque_order { @@ -19,26 +20,16 @@ enum _deque_order DEQUE_REVERSE, }; -struct _deque_node -{ - void* obj; - struct _deque_node* prev; - struct _deque_node* next; -}; - struct _deque { // -------------------- private -------------------- - struct _deque_node* _head; - struct _deque_node* _tail; - - size_t _obj_size; - size_t _size; - // size_t _capacity; - // size_t _ratio; - + union + { + ringbuffer_t ringbuf; + }; + iterator_t _iter_ringbuf; + struct _iterator _iter; - void (*_destory)(struct _deque* self); // -------------------- public -------------------- @@ -64,9 +55,7 @@ struct _deque }; typedef struct _deque* deque_t; -// create and free deque -deque_t deque_new(size_t obj_size); - +deque_t deque_new(size_t obj_size, size_t capacity); void deque_free(deque_t* deque); #endif diff --git a/include/ringbuffer.h b/include/ringbuffer.h index d2689f0..56b6075 100644 --- a/include/ringbuffer.h +++ b/include/ringbuffer.h @@ -23,11 +23,12 @@ enum _ringbuffer_order struct _ringbuffer { // -------------------- private -------------------- - // size_t _obj_size; + void *obj; + + size_t _obj_size; size_t _size; size_t _capacity; - darray_t darray; size_t _head; size_t _tail; @@ -36,8 +37,8 @@ struct _ringbuffer // -------------------- public -------------------- // kernel - bool (*push_back)(struct _ringbuffer* self, void* obj); - bool (*push_front)(struct _ringbuffer* self, void* obj); + bool (*push_back)(struct _ringbuffer* self, const void* obj); + bool (*push_front)(struct _ringbuffer* self, const void* obj); bool (*pop_back)(struct _ringbuffer* self, void* obj); bool (*pop_front)(struct _ringbuffer* self, void* obj); bool (*back)(struct _ringbuffer* self, void* obj); diff --git a/include/unicstl_config.h b/include/unicstl_config.h index d3020a0..50e81ea 100644 --- a/include/unicstl_config.h +++ b/include/unicstl_config.h @@ -54,7 +54,7 @@ * 3. ERROR * 9.None */ -#define LOG_LEVEL 9 +#define LOG_LEVEL 0 /** * @brief * 0. simple diff --git a/include/unicstl_internal.h b/include/unicstl_internal.h index b3e2d3d..2a21e80 100644 --- a/include/unicstl_internal.h +++ b/include/unicstl_internal.h @@ -28,6 +28,7 @@ #include "iterator.h" #include "logger.h" + /** * @brief default capacity and ratio * @@ -36,6 +37,24 @@ #define DEFAULT_CAPACITY 8 #endif + +/** + * @brief assert function + * + */ +#ifdef UNICSTL_ASSERT +#define unicstl_assert(expr) (void) ((!!(expr)) || (_unicstl_assert(#expr,__FILE__,__LINE__),0)) + +static inline void _unicstl_assert(const char *expr, const char *file, int line) +{ + printf("Assertion failed: %s, file:%s line:%d\n", expr, file, line); + exit(1); +} +#else +#define unicstl_assert assert +#endif + + /** * @brief malloc and free function * @@ -56,12 +75,53 @@ static inline void unicstl_free(void * ptr) { #error "UNICSTL_MALLOC not defined" #endif -#ifdef UNICSTL_ASSERT -#define unicstl_assert(expr) (void) ((!!(expr)) || (_unicstl_assert(#expr,__FILE__,__LINE__),0)) -void _unicstl_assert(const char *expr, const char *file, int line); -#else -#define unicstl_assert assert + + +static inline const void *obj_at(const void *objs, size_t index, size_t obj_size) +{ +#ifdef UNICSTL_DEBUG + unicstl_assert(objs != NULL); #endif + return (const char *)objs + obj_size * index; +} + +static inline void obj_set(void *objs, size_t index, const void *obj, size_t obj_size) +{ +#ifdef UNICSTL_DEBUG + unicstl_assert(objs != NULL); + unicstl_assert(obj != NULL); +#endif + memmove((char *)objs + obj_size * index, obj, obj_size); +} + +static inline void obj_get(const void *objs, size_t index, void *obj, size_t obj_size) +{ +#ifdef UNICSTL_DEBUG + unicstl_assert(objs != NULL); + unicstl_assert(obj != NULL); +#endif + memmove(obj, (const char *)objs + obj_size * index, obj_size); +} + +static inline void obj_copy(void *dst, const void *src, size_t count, size_t obj_size) +{ +#ifdef UNICSTL_DEBUG + unicstl_assert(dst != NULL); + unicstl_assert(src != NULL); +#endif + memmove(dst, src, obj_size * count); +} + +static inline size_t index_next(size_t index, size_t capacity) +{ + return (index + 1) % capacity; +} + +static inline size_t index_prev(size_t index, size_t capacity) +{ + return index == 0 ? (capacity - 1) : index - 1; +} + /** * @brief obj compare with obj2 diff --git a/src/deque.c b/src/deque.c index b52289e..1f9afb7 100644 --- a/src/deque.c +++ b/src/deque.c @@ -13,234 +13,80 @@ static bool deque_push_back(struct _deque* self, void* obj) { unicstl_assert(self != NULL); - struct _deque_node* front = NULL; - struct _deque_node* back = NULL; - - // create a new object - void* new_obj = (void*)malloc(self->_obj_size); - if (new_obj == NULL) - { - return false; - } - memmove(new_obj, obj, self->_obj_size); - - // create a new node - struct _deque_node* new_node = (struct _deque_node*)malloc(sizeof(struct _deque_node)); - if (new_node == NULL) - { - return false; - } - new_node->obj = new_obj; - - // link node - if(self->empty(self)) - { - // if this is first node - self->_tail = new_node; - self->_head = new_node; - } - new_node->prev = self->_tail; // step 1 - new_node->next = self->_head; // step 2 - - back = self->_tail; - back->next = new_node; // step 3 - - front = self->_head; - front->prev = new_node; // step 4 - - self->_tail = new_node; // step 5 - - self->_size += 1; - return true; + unicstl_assert(self->ringbuf != NULL); + return self->ringbuf->push_back(self->ringbuf, obj); } static bool deque_push_front(struct _deque* self, void* obj) { unicstl_assert(self != NULL); - struct _deque_node* front = NULL; - struct _deque_node* back = NULL; - - // create a new object - void* new_obj = (void*)malloc(self->_obj_size); - if (new_obj == NULL) - { - return false; - } - memmove(new_obj, obj, self->_obj_size); - - // create a new node - struct _deque_node* new_node = (struct _deque_node*)malloc(sizeof(struct _deque_node)); - if (new_node == NULL) - { - return false; - } - new_node->obj = new_obj; - - // link node - if (self->empty(self)) - { - // if this is first node - self->_tail = new_node; - self->_head = new_node; - } - new_node->prev = self->_tail; // step 1 - new_node->next = self->_head; // step 2 - - back = self->_tail; - back->next = new_node; // step 3 - - front = self->_head; - front->prev = new_node; // step 4 - - self->_head = new_node; // step 5 - - self->_size += 1; - return true; + unicstl_assert(self->ringbuf != NULL); + return self->ringbuf->push_front(self->ringbuf, obj); } static bool deque_pop_back(struct _deque* self, void* obj) { unicstl_assert(self != NULL); - struct _deque_node* node = NULL; - struct _deque_node* front = NULL; - - if (self->empty(self)) - { - return false; - } - - node = self->_tail; - if (obj != NULL) - { - memmove(obj, node->obj, self->_obj_size); - } - - if (self->size(self) == 1) - { - self->_tail = NULL; - self->_head = NULL; - } - else - { - self->_tail = node->prev; // step 1 - - front = self->_head; - front->prev = node->prev; // step 2 - } - - free(node->obj); - free(node); - - self->_size -= 1; - return true; + unicstl_assert(self->ringbuf != NULL); + return self->ringbuf->pop_back(self->ringbuf, obj); } static bool deque_pop_front(struct _deque* self, void* obj) { unicstl_assert(self != NULL); - struct _deque_node* node = NULL; - struct _deque_node* back = NULL; - - if (self->empty(self)) - { - return false; - } - - node = self->_head; - if (obj != NULL) - { - memmove(obj, node->obj, self->_obj_size); - } - - if (self->size(self) == 1) - { - self->_tail = NULL; - self->_head = NULL; - } - else - { - self->_head = node->next; // step 1 - - back = self->_tail; - back->next = node->next; // step 2 - } - - free(node->obj); - free(node); - - self->_size -= 1; - return true; + unicstl_assert(self->ringbuf != NULL); + return self->ringbuf->pop_front(self->ringbuf, obj); } static bool deque_back(struct _deque* self, void* obj) { unicstl_assert(self != NULL); - unicstl_assert(obj != NULL); - - if (self->empty(self)) - { - return false; - } - memmove(obj, self->_tail->obj, self->_obj_size); - return true; + unicstl_assert(self->ringbuf != NULL); + return self->ringbuf->back(self->ringbuf, obj); } static bool deque_front(struct _deque* self, void* obj) { unicstl_assert(self != NULL); - unicstl_assert(obj != NULL); - - if (self->empty(self)) - { - return false; - } - memmove(obj, self->_head->obj, self->_obj_size); - return true; + unicstl_assert(self->ringbuf != NULL); + return self->ringbuf->front(self->ringbuf, obj); } static bool deque_clear(struct _deque* self) { - while (!self->empty(self)) - { - deque_pop_back(self, NULL); - } - return true; + unicstl_assert(self != NULL); + unicstl_assert(self->ringbuf != NULL); + return self->ringbuf->clear(self->ringbuf); } static size_t deque_size(struct _deque* self) { unicstl_assert(self != NULL); - return self->_size; + unicstl_assert(self->ringbuf != NULL); + return self->ringbuf->size(self->ringbuf); } static bool deque_empty(struct _deque* self) { unicstl_assert(self != NULL); - return !self->size(self); + unicstl_assert(self->ringbuf != NULL); + return self->ringbuf->empty(self->ringbuf); } static void deque_destory(struct _deque* self) { unicstl_assert(self != NULL); self->clear(self); - if (self->_head != NULL) - { - free(self->_head); - self->_head = NULL; - } + ringbuffer_free(&self->ringbuf); } static void deque_print(struct _deque* self) { unicstl_assert(self != NULL); + unicstl_assert(self->ringbuf != NULL); - size_t i = 0; - struct _deque_node * node = self->_head; - for (size_t i = 0; i < self->size(self); i++) - { - self->print_obj(node->obj); - node = node->next; - } + self->ringbuf->print_obj = self->print_obj; + self->ringbuf->print(self->ringbuf); } bool deque_iter_hasnext(struct _iterator* iter) @@ -249,11 +95,7 @@ bool deque_iter_hasnext(struct _iterator* iter) unicstl_assert(iter->_container != NULL); deque_t self = (deque_t)iter->_container; - if(iter->_index < self->size(self)) - { - return true; - } - return false; + return self->_iter_ringbuf->hasnext(self->_iter_ringbuf); } const void* deque_iter_next(struct _iterator* iter) @@ -262,26 +104,7 @@ const void* deque_iter_next(struct _iterator* iter) unicstl_assert(iter->_container != NULL); deque_t self = (deque_t)iter->_container; - void *obj = NULL; - - struct _deque_node * cur_node = (struct _deque_node *)iter->_node; - if(cur_node == NULL) - { - return NULL; - } - - obj = cur_node->obj; - if(iter->_order == DEQUE_FORWARD) - { - iter->_node = cur_node->next; - } - else - { - iter->_node = cur_node->prev; - } - - iter->_index += 1; - return obj; + return self->_iter_ringbuf->next(self->_iter_ringbuf); } iterator_t deque_iter(struct _deque* self, enum _deque_order order) @@ -292,36 +115,26 @@ iterator_t deque_iter(struct _deque* self, enum _deque_order order) iter->_container = self; iter->_index = 0; iter->_order = order; - if(iter->_order == DEQUE_FORWARD) - { - iter->_node = self->_head; - } - else - { - iter->_node = self->_tail; - } + self->_iter_ringbuf = self->ringbuf->iter(self->ringbuf, order); iter->hasnext = deque_iter_hasnext; iter->next = deque_iter_next; return iter; } -static bool deque_init(struct _deque* self, size_t obj_size) +static bool deque_init(struct _deque* self, size_t obj_size, size_t capacity) { unicstl_assert(self != NULL); - if(obj_size == 0) + if(obj_size == 0 || capacity == 0) { return false; } // -------------------- private -------------------- - self->_obj_size = obj_size; - self->_size = 0; - // self->_capacity = 64; - // self->_ratio = 2; - - self->_head = NULL; - self->_tail = NULL; - + self->ringbuf = ringbuffer_new(obj_size, capacity); + if(self->ringbuf == NULL) + { + return false; + } self->_destory = deque_destory; // -------------------- public -------------------- @@ -350,7 +163,7 @@ static bool deque_init(struct _deque* self, size_t obj_size) return true; } -deque_t deque_new(size_t obj_size) +deque_t deque_new(size_t obj_size, size_t capacity) { struct _deque* deque = NULL; deque = (struct _deque*)malloc(sizeof(struct _deque)); @@ -359,7 +172,7 @@ deque_t deque_new(size_t obj_size) return NULL; } - if(deque_init(deque, obj_size) != true) + if(deque_init(deque, obj_size, capacity) != true) { free(deque); return NULL; diff --git a/src/ringbuffer.c b/src/ringbuffer.c index e81a0b9..fb438f2 100644 --- a/src/ringbuffer.c +++ b/src/ringbuffer.c @@ -10,49 +10,38 @@ */ #include "ringbuffer.h" -static size_t calc_index_next(size_t capacity, size_t index) -{ - return (index + 1) % capacity; -} - -static size_t calc_index_prev(size_t capacity, size_t index) -{ - return index == 0 ? (capacity - 1) : index - 1; -} - -static bool ringbuffer_push_back(struct _ringbuffer *self, void *obj) +static bool ringbuffer_push_back(struct _ringbuffer *self, const void *obj) { unicstl_assert(self != NULL); - unicstl_assert(self->darray != NULL); - darray_t darray = self->darray; - size_t capacity_total = darray->capacity(darray); - + unicstl_assert(self->obj != NULL); + unicstl_assert(obj != NULL); + if(self->full(self)) { return false; } - darray->set(darray, self->_tail, obj); - self->_tail = calc_index_next(capacity_total, self->_tail); - LOG_DEBUG("head: %lu, tail: %lu", self->_head, self->_tail); + size_t index = self->_tail; + obj_set(self->obj, index, obj, self->_obj_size); + self->_tail = index_next(index, self->_capacity); self->_size++; return true; } -static bool ringbuffer_push_front(struct _ringbuffer *self, void *obj) +static bool ringbuffer_push_front(struct _ringbuffer *self, const void *obj) { unicstl_assert(self != NULL); - unicstl_assert(self->darray != NULL); - darray_t darray = self->darray; - size_t capacity_total = darray->capacity(darray); + unicstl_assert(self->obj != NULL); + unicstl_assert(obj != NULL); if(self->full(self)) { return false; } - size_t index = calc_index_prev(capacity_total, self->_head); - darray->set(darray, index, obj); + + size_t index = index_prev(self->_head, self->_capacity); + obj_set(self->obj, index, obj, self->_obj_size); self->_head = index; self->_size++; @@ -62,17 +51,18 @@ static bool ringbuffer_push_front(struct _ringbuffer *self, void *obj) static bool ringbuffer_pop_back(struct _ringbuffer *self, void *obj) { unicstl_assert(self != NULL); - unicstl_assert(self->darray != NULL); - darray_t darray = self->darray; - size_t capacity_total = darray->capacity(darray); + unicstl_assert(self->obj != NULL); + unicstl_assert(obj != NULL); if(self->empty(self)) { return false; } - size_t index = calc_index_prev(capacity_total, self->_tail); - darray->get(darray, index, obj); + + size_t index = index_prev(self->_tail, self->_capacity); + obj_get(self->obj, index, obj, self->_obj_size); self->_tail = index; + self->_size--; return true; } @@ -80,16 +70,17 @@ static bool ringbuffer_pop_back(struct _ringbuffer *self, void *obj) static bool ringbuffer_pop_front(struct _ringbuffer *self, void *obj) { unicstl_assert(self != NULL); - unicstl_assert(self->darray != NULL); - darray_t darray = self->darray; - size_t capacity_total = darray->capacity(darray); + unicstl_assert(self->obj != NULL); + unicstl_assert(obj != NULL); if(self->empty(self)) { return false; } - darray->get(darray, self->_head, obj); - self->_head = calc_index_next(capacity_total, self->_head); + + obj_get(self->obj, self->_head, obj, self->_obj_size); + self->_head = index_next(self->_head, self->_capacity); + self->_size--; return true; } @@ -97,30 +88,33 @@ static bool ringbuffer_pop_front(struct _ringbuffer *self, void *obj) static bool ringbuffer_back(struct _ringbuffer *self, void *obj) { unicstl_assert(self != NULL); - unicstl_assert(self->darray != NULL); - darray_t darray = self->darray; + unicstl_assert(self->obj != NULL); + unicstl_assert(obj != NULL); if(self->empty(self)) { return false; } - size_t capacity_total = darray->capacity(darray); - size_t index = calc_index_prev(capacity_total, self->_tail); - darray->get(darray, index, obj); + + size_t index = index_prev(self->_tail, self->_capacity); + obj_get(self->obj, index, obj, self->_obj_size); + return true; } static bool ringbuffer_front(struct _ringbuffer *self, void *obj) { unicstl_assert(self != NULL); - unicstl_assert(self->darray != NULL); - darray_t darray = self->darray; + unicstl_assert(self->obj != NULL); + unicstl_assert(obj != NULL); if(self->empty(self)) { return false; } - darray->get(darray, self->_head, obj); + + obj_get(self->obj, self->_head, obj, self->_obj_size); + return true; } @@ -142,42 +136,39 @@ static size_t ringbuffer_size(struct _ringbuffer *self) static size_t ringbuffer_capacity(struct _ringbuffer* self) { unicstl_assert(self != NULL); - return self->_capacity; + return self->_capacity - 1; } static bool ringbuffer_empty(struct _ringbuffer *self) { unicstl_assert(self != NULL); - // return self->size(self) == 0; return self->_head == self->_tail; } static bool ringbuffer_full(struct _ringbuffer *self) { unicstl_assert(self != NULL); - // return self->size(self) == self->capacity(self) - 1; - return self->_head == calc_index_next(self->_capacity, self->_tail); + return self->_head == index_next(self->_tail, self->_capacity); } static void ringbuffer_destory(struct _ringbuffer *self) { unicstl_assert(self != NULL); - unicstl_assert(self->darray != NULL); - darray_free(&self->darray); -} - - -static void print_num(const void* obj) -{ - printf("(%2d ) ", *(int*)obj); + if(self->obj != NULL) + { + free(self->obj); + self->obj = NULL; + } } static void ringbuffer_print(struct _ringbuffer *self) { unicstl_assert(self != NULL); - unicstl_assert(self->darray != NULL); - self->darray->print_obj = self->print_obj; - self->darray->print(self->darray); + + for(size_t i = 0; i < self->size(self); i++) + { + self->print_obj(obj_at(self->obj, self->_obj_size, i)); + } } bool ringbuffer_iter_hasnext(struct _iterator *iter) @@ -186,8 +177,6 @@ bool ringbuffer_iter_hasnext(struct _iterator *iter) unicstl_assert(iter->_container != NULL); ringbuffer_t self = (ringbuffer_t)iter->_container; - darray_t darray = self->darray; - size_t capacity_total = darray->capacity(darray); if(iter->_order == RINGBUF_FORWARD) { @@ -212,19 +201,18 @@ const void *ringbuffer_iter_next(struct _iterator *iter) unicstl_assert(iter->_container != NULL); ringbuffer_t self = (ringbuffer_t)iter->_container; - darray_t darray = self->darray; - size_t capacity_total = darray->capacity(darray); size_t index = iter->_index; if(iter->_order == RINGBUF_FORWARD) { - iter->_index = calc_index_next(capacity_total, index); + iter->_index = index_next(index, self->_capacity); } else { - iter->_index = calc_index_prev(capacity_total, index); + iter->_index = index_prev(index, self->_capacity); } - return darray->at(darray, index); + + return obj_at(self->obj, index, self->_obj_size); } iterator_t ringbuffer_iter(struct _ringbuffer *self, enum _ringbuffer_order order) @@ -241,9 +229,7 @@ iterator_t ringbuffer_iter(struct _ringbuffer *self, enum _ringbuffer_order orde } else { - darray_t darray = self->darray; - size_t capacity_total = darray->capacity(darray); - iter->_index = calc_index_prev(capacity_total, self->_tail); + iter->_index = index_prev(self->_tail, self->_capacity); } iter->hasnext = ringbuffer_iter_hasnext; @@ -259,12 +245,16 @@ static bool ringbuffer_init(struct _ringbuffer *self, size_t obj_size, size_t ca return false; } // -------------------- private -------------------- - self->darray = darray_new(obj_size, capacity + 1); - self->darray->set_dynamic(self->darray, false); - self->darray->_size = capacity + 1; - + self->_obj_size = obj_size; self->_size = 0; self->_capacity = capacity + 1; + + self->obj = (char *)malloc(self->_obj_size * self->_capacity); + if(self->obj == NULL) + { + return false; + } + self->_head = 0; self->_tail = 0; diff --git a/src/unicstl_internal.c b/src/unicstl_internal.c index 6330838..f97ac33 100644 --- a/src/unicstl_internal.c +++ b/src/unicstl_internal.c @@ -10,12 +10,6 @@ */ #include "unicstl_internal.h" -void _unicstl_assert(const char *expr, const char *file, int line) -{ - printf("Assertion failed: %s, file:%s line:%d\n", expr, file, line); - exit(1); -} - int default_compare(const void* obj1, const void* obj2) { printf("compare is not implemented!\n"); diff --git a/test/test_deque.c b/test/test_deque.c index 4983552..c627515 100644 --- a/test/test_deque.c +++ b/test/test_deque.c @@ -10,6 +10,23 @@ */ #include "test.h" + +static void test_deque_new(void) +{ + // ------------------------------ + deque_t deque = deque_new(sizeof(int), 10); + TEST_ASSERT_NOT_NULL(deque); + deque_free(&deque); + + TEST_ASSERT_NULL(deque_new(0, 0)); + TEST_ASSERT_NULL(deque_new(0, 1)); + TEST_ASSERT_NULL(deque_new(sizeof(int), 0)); + + // ------------------------------ + TEST_ASSERT_NULL(deque); + deque_free(&deque); +} + static void test_deque_num(void) { size_t i = 0; @@ -17,7 +34,7 @@ static void test_deque_num(void) int temp = 0; size_t len = sizeof(data) / sizeof(data[0]); - deque_t deque = deque_new(sizeof(int)); + deque_t deque = deque_new(sizeof(int), len); TEST_ASSERT_NOT_NULL(deque); deque->print_obj = print_num; @@ -148,7 +165,7 @@ static void test_deque_struct(void) struct _student temp = {0}; size_t len = sizeof(data) / sizeof(data[0]); - deque_t deque = deque_new(sizeof(struct _student)); + deque_t deque = deque_new(sizeof(struct _student), len); TEST_ASSERT_NOT_NULL(deque); deque->print_obj = print_struct; @@ -275,7 +292,7 @@ static void test_deque_iter(void) int temp = 0; size_t len = sizeof(data) / sizeof(data[0]); - deque_t deque = deque_new(sizeof(int)); + deque_t deque = deque_new(sizeof(int), len); TEST_ASSERT_NOT_NULL(deque); deque->print_obj = print_num; @@ -327,6 +344,8 @@ void test_deque(void) { UnitySetTestFile(__FILE__); + RUN_TEST(test_deque_new); + RUN_TEST(test_deque_num); RUN_TEST(test_deque_struct); diff --git a/test/test_ringbuffer.c b/test/test_ringbuffer.c index 0abaf3e..3e95d79 100644 --- a/test/test_ringbuffer.c +++ b/test/test_ringbuffer.c @@ -10,6 +10,47 @@ */ #include "test.h" +static void test_ringbuffer_new(void) +{ + darray_t ringbuffer = darray_new(sizeof(int), 10); + TEST_ASSERT_NOT_NULL(ringbuffer); + darray_free(&ringbuffer); + + TEST_ASSERT_NULL(darray_new(0, 0)); + TEST_ASSERT_NULL(darray_new(0, 1)); + TEST_ASSERT_NULL(darray_new(sizeof(int), 0)); + + // ------------------------------ + TEST_ASSERT_NULL(ringbuffer); + darray_free(&ringbuffer); +} + +static void test_ringbuffer_push(void) +{ + size_t i = 0; + int data[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + int temp = 0; + size_t len = sizeof(data) / sizeof(data[0]); + + ringbuffer_t ringbuffer = ringbuffer_new(sizeof(int), len); + + for (i = 0; i < len; i++) + { + TEST_ASSERT_TRUE(ringbuffer->push_back(ringbuffer, &data[i])); + } + TEST_ASSERT_FALSE(ringbuffer->push_back(ringbuffer, &data[0])); + + TEST_ASSERT_TRUE(ringbuffer->clear(ringbuffer)); + + for (i = 0; i < len; i++) + { + TEST_ASSERT_TRUE(ringbuffer->push_front(ringbuffer, &data[i])); + } + TEST_ASSERT_FALSE(ringbuffer->push_front(ringbuffer, &data[0])); + + ringbuffer_free(&ringbuffer); +} + static void test_ringbuffer_num(void) { size_t i = 0; @@ -18,7 +59,6 @@ static void test_ringbuffer_num(void) size_t len = sizeof(data) / sizeof(data[0]); ringbuffer_t ringbuffer = ringbuffer_new(sizeof(int), len); - TEST_ASSERT_NOT_NULL(ringbuffer); ringbuffer->print_obj = print_num; TEST_ASSERT_TRUE(ringbuffer->empty(ringbuffer)); @@ -44,6 +84,7 @@ static void test_ringbuffer_num(void) { TEST_ASSERT_TRUE(ringbuffer->push_back(ringbuffer, &data[i])); } + // ringbuffer->print(ringbuffer); for (i = 0; i < len + 1; i++) { @@ -285,7 +326,7 @@ static void test_ringbuffer_iter(void) { ringbuffer->push_back(ringbuffer, &data[i]); } - + iterator_t iter = ringbuffer->iter(ringbuffer, RINGBUF_FORWARD); i = 0; while(iter->hasnext(iter)) @@ -311,6 +352,9 @@ void test_ringbuffer(void) { UnitySetTestFile(__FILE__); + RUN_TEST(test_ringbuffer_new); + RUN_TEST(test_ringbuffer_push); + RUN_TEST(test_ringbuffer_num); RUN_TEST(test_ringbuffer_struct);