修改queue.c代码结构,能公用的代码就不独立了

This commit is contained in:
建峰 2024-08-29 17:23:17 +08:00
parent a48a285cc5
commit 43cfbfcda6
4 changed files with 84 additions and 83 deletions

View File

@ -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_

View File

@ -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

View File

@ -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:

View File

@ -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++)