mirror of
https://gitee.com/apaki/unicstl.git
synced 2025-07-03 23:56:54 +08:00
修改queue.c代码结构,能公用的代码就不独立了
This commit is contained in:
parent
a48a285cc5
commit
43cfbfcda6
@ -18,6 +18,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <limits.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
#endif // _COMMON_H_
|
#endif // _COMMON_H_
|
||||||
|
@ -41,11 +41,11 @@ struct _queue
|
|||||||
|
|
||||||
bool (*clear)(struct _queue* self);
|
bool (*clear)(struct _queue* self);
|
||||||
bool (*empty)(struct _queue* self);
|
bool (*empty)(struct _queue* self);
|
||||||
bool (*full)(struct _queue* self); // only for queue2
|
bool (*full)(struct _queue* self);
|
||||||
uint32_t (*size)(struct _queue* self);
|
uint32_t (*size)(struct _queue* self);
|
||||||
uint32_t (*capacity)(struct _queue* self);
|
uint32_t (*capacity)(struct _queue* self);
|
||||||
|
|
||||||
// free
|
// clear and free node pointer
|
||||||
void (*destory)(struct _queue* self);
|
void (*destory)(struct _queue* self);
|
||||||
|
|
||||||
// print
|
// print
|
||||||
|
159
src/queue.c
159
src/queue.c
@ -34,25 +34,29 @@ done:
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void queue_node_free(struct _queue_node** node)
|
||||||
|
{
|
||||||
|
if(node != NULL && *node != NULL)
|
||||||
|
{
|
||||||
|
if((*node)->obj != NULL)
|
||||||
|
{
|
||||||
|
free((*node)->obj);
|
||||||
|
}
|
||||||
|
free(*node);
|
||||||
|
*node = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static bool queue_push(struct _queue* self, void* obj)
|
static bool queue_push(struct _queue* self, void* obj)
|
||||||
{
|
{
|
||||||
assert(self != NULL);
|
assert(self != NULL);
|
||||||
assert(obj != NULL);
|
assert(obj != NULL);
|
||||||
|
|
||||||
void * obj_new = malloc(self->_obj_size);
|
struct _queue_node* node_new = queue_node_new(obj, self->_obj_size);
|
||||||
if (obj_new == NULL)
|
|
||||||
{
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
memmove(obj_new, obj, self->_obj_size);
|
|
||||||
|
|
||||||
struct _queue_node* node_new = (struct _queue_node*)malloc(sizeof(struct _queue_node));
|
|
||||||
if(node_new == NULL)
|
if(node_new == NULL)
|
||||||
{
|
{
|
||||||
goto done1;
|
return false;
|
||||||
}
|
}
|
||||||
node_new->obj = obj_new;
|
|
||||||
node_new->next = NULL;
|
|
||||||
|
|
||||||
if(self->empty(self))
|
if(self->empty(self))
|
||||||
{
|
{
|
||||||
@ -67,10 +71,6 @@ static bool queue_push(struct _queue* self, void* obj)
|
|||||||
self->_size++;
|
self->_size++;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
done1:
|
|
||||||
free(obj_new);
|
|
||||||
done:
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool queue_pop(struct _queue* self, void* obj)
|
static bool queue_pop(struct _queue* self, void* obj)
|
||||||
@ -87,8 +87,8 @@ static bool queue_pop(struct _queue* self, void* obj)
|
|||||||
}
|
}
|
||||||
self->_front = node->next;
|
self->_front = node->next;
|
||||||
self->_size--;
|
self->_size--;
|
||||||
free(node->obj);
|
|
||||||
free(node);
|
queue_node_free(&node);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -122,8 +122,7 @@ static bool queue_clear(struct _queue* self)
|
|||||||
while (node)
|
while (node)
|
||||||
{
|
{
|
||||||
next = node->next;
|
next = node->next;
|
||||||
free(node->obj);
|
queue_node_free(&node);
|
||||||
free(node);
|
|
||||||
node = next;
|
node = next;
|
||||||
}
|
}
|
||||||
self->_front = NULL;
|
self->_front = NULL;
|
||||||
@ -141,7 +140,7 @@ static bool queue_empty(struct _queue* self)
|
|||||||
static bool queue_full(struct _queue* self)
|
static bool queue_full(struct _queue* self)
|
||||||
{
|
{
|
||||||
assert(self != NULL);
|
assert(self != NULL);
|
||||||
return false;
|
return self->size(self) == self->capacity(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t queue_size(struct _queue* self)
|
static uint32_t queue_size(struct _queue* self)
|
||||||
@ -150,6 +149,12 @@ static uint32_t queue_size(struct _queue* self)
|
|||||||
return self->_size;
|
return self->_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint32_t queue_capacity(struct _queue* self)
|
||||||
|
{
|
||||||
|
assert(self != NULL);
|
||||||
|
return self->_capacity;
|
||||||
|
}
|
||||||
|
|
||||||
static void queue_destory(struct _queue* self)
|
static void queue_destory(struct _queue* self)
|
||||||
{
|
{
|
||||||
assert(self != NULL);
|
assert(self != NULL);
|
||||||
@ -168,46 +173,6 @@ static void queue_print(struct _queue* self)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool queue_init(struct _queue * queue, uint32_t obj_size)
|
|
||||||
{
|
|
||||||
// assert(queue != NULL);
|
|
||||||
// assert(obj_size > 0);
|
|
||||||
if(queue == NULL || obj_size == 0)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The queue is only initialized once
|
|
||||||
if(queue->_obj_size != 0)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// attribute init
|
|
||||||
queue->_size = 0;
|
|
||||||
queue->_obj_size = obj_size;
|
|
||||||
// queue->_capacity = 0;
|
|
||||||
// queue->_ratio = 0;
|
|
||||||
|
|
||||||
// function init
|
|
||||||
queue->push = queue_push;
|
|
||||||
queue->pop = queue_pop;
|
|
||||||
queue->back = queue_back;
|
|
||||||
queue->front = queue_front;
|
|
||||||
queue->clear = queue_clear;
|
|
||||||
queue->empty = queue_empty;
|
|
||||||
queue->size = queue_size;
|
|
||||||
queue->destory = queue_destory;
|
|
||||||
queue->print = queue_print;
|
|
||||||
queue->full = queue_full;
|
|
||||||
|
|
||||||
// init front & back
|
|
||||||
queue->_front = NULL;
|
|
||||||
queue->_back = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static bool queue2_push(struct _queue* self, void* obj)
|
static bool queue2_push(struct _queue* self, void* obj)
|
||||||
{
|
{
|
||||||
assert(self != NULL);
|
assert(self != NULL);
|
||||||
@ -303,22 +268,16 @@ static bool queue2_clear(struct _queue* self)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool queue2_full(struct _queue* self)
|
|
||||||
{
|
|
||||||
assert(self != NULL);
|
|
||||||
return self->size(self) == self->capacity(self);
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint32_t queue2_capacity(struct _queue* self)
|
|
||||||
{
|
|
||||||
assert(self != NULL);
|
|
||||||
return self->_capacity;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void queue2_destory(struct _queue* self)
|
static void queue2_destory(struct _queue* self)
|
||||||
{
|
{
|
||||||
assert(self != NULL);
|
assert(self != NULL);
|
||||||
self->clear(self);
|
self->clear(self);
|
||||||
|
if(self->_front != NULL)
|
||||||
|
{
|
||||||
|
free(self->_front->obj);
|
||||||
|
free(self->_front);
|
||||||
|
self->_front = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void queue2_print(struct _queue* self)
|
static void queue2_print(struct _queue* self)
|
||||||
@ -339,6 +298,47 @@ static void queue2_print(struct _queue* self)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool queue_init(struct _queue * queue, uint32_t obj_size)
|
||||||
|
{
|
||||||
|
// assert(queue != NULL);
|
||||||
|
// assert(obj_size > 0);
|
||||||
|
if(queue == NULL || obj_size == 0)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The queue is only initialized once
|
||||||
|
if(queue->_obj_size != 0)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// attribute init
|
||||||
|
queue->_size = 0;
|
||||||
|
queue->_obj_size = obj_size;
|
||||||
|
queue->_capacity = UINT32_MAX;
|
||||||
|
queue->_ratio = 1;
|
||||||
|
|
||||||
|
// function init
|
||||||
|
queue->push = queue_push;
|
||||||
|
queue->pop = queue_pop;
|
||||||
|
|
||||||
|
queue->back = queue_back;
|
||||||
|
queue->front = queue_front;
|
||||||
|
|
||||||
|
queue->clear = queue_clear;
|
||||||
|
queue->empty = queue_empty;
|
||||||
|
queue->full = queue_full;
|
||||||
|
queue->size = queue_size;
|
||||||
|
|
||||||
|
queue->destory = queue_destory;
|
||||||
|
queue->print = queue_print;
|
||||||
|
|
||||||
|
// init front & back
|
||||||
|
queue->_front = NULL;
|
||||||
|
queue->_back = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
bool queue_init2(struct _queue * queue, uint32_t obj_size, uint32_t capacity)
|
bool queue_init2(struct _queue * queue, uint32_t obj_size, uint32_t capacity)
|
||||||
{
|
{
|
||||||
// assert(queue != NULL);
|
// assert(queue != NULL);
|
||||||
@ -364,13 +364,16 @@ bool queue_init2(struct _queue * queue, uint32_t obj_size, uint32_t capacity)
|
|||||||
// function init
|
// function init
|
||||||
queue->push = queue2_push;
|
queue->push = queue2_push;
|
||||||
queue->pop = queue2_pop;
|
queue->pop = queue2_pop;
|
||||||
|
|
||||||
queue->back = queue2_back;
|
queue->back = queue2_back;
|
||||||
queue->front = queue2_front;
|
queue->front = queue2_front;
|
||||||
|
|
||||||
queue->clear = queue2_clear;
|
queue->clear = queue2_clear;
|
||||||
queue->empty = queue_empty;
|
queue->empty = queue_empty;
|
||||||
queue->full = queue2_full;
|
queue->full = queue_full;
|
||||||
queue->size = queue_size;
|
queue->size = queue_size;
|
||||||
queue->capacity = queue2_capacity;
|
queue->capacity = queue_capacity;
|
||||||
|
|
||||||
queue->destory = queue2_destory;
|
queue->destory = queue2_destory;
|
||||||
queue->print = queue2_print;
|
queue->print = queue2_print;
|
||||||
|
|
||||||
@ -379,22 +382,20 @@ bool queue_init2(struct _queue * queue, uint32_t obj_size, uint32_t capacity)
|
|||||||
if(queue->_front == NULL)
|
if(queue->_front == NULL)
|
||||||
{
|
{
|
||||||
goto done;
|
goto done;
|
||||||
// return false;
|
|
||||||
}
|
}
|
||||||
queue->_back = queue->_front;
|
queue->_back = queue->_front;
|
||||||
|
|
||||||
// queue->_front->obj = calloc(queue->_capacity + 1, queue->_obj_size);
|
// use queue->_front->obj as obj_array
|
||||||
queue->_front->obj = calloc(queue->_capacity, queue->_obj_size);
|
// queue->_front->obj = calloc(queue->_capacity, queue->_obj_size);
|
||||||
|
queue->_front->obj = malloc(queue->_capacity * queue->_obj_size);
|
||||||
if(queue->_front->obj == NULL)
|
if(queue->_front->obj == NULL)
|
||||||
{
|
{
|
||||||
goto done1;
|
goto done1;
|
||||||
// return false;
|
|
||||||
}
|
}
|
||||||
queue->_index_front = 0;
|
queue->_index_front = 0;
|
||||||
queue->_index_back = 0;
|
queue->_index_back = 0;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
done1:
|
done1:
|
||||||
free(queue->_front);
|
free(queue->_front);
|
||||||
done:
|
done:
|
||||||
|
@ -56,8 +56,7 @@ static void test_queue_push(void)
|
|||||||
|
|
||||||
queue_t queue = NULL;
|
queue_t queue = NULL;
|
||||||
|
|
||||||
// ------------------------------
|
// ------------------------------ queue = queue_new();
|
||||||
queue = queue_new();
|
|
||||||
queue_init(queue, sizeof(int));
|
queue_init(queue, sizeof(int));
|
||||||
TEST_ASSERT_TRUE(queue->empty(queue));
|
TEST_ASSERT_TRUE(queue->empty(queue));
|
||||||
for(i = 0; i < len; i++)
|
for(i = 0; i < len; i++)
|
||||||
|
Loading…
Reference in New Issue
Block a user