Compare commits

...

15 Commits

12 changed files with 681 additions and 760 deletions

View File

@ -26,6 +26,7 @@
"graph.h": "c",
"unicstl_config.h": "c",
"iter.h": "c",
"iterator.h": "c"
"iterator.h": "c",
"assert.h": "c"
}
}

View File

@ -16,10 +16,10 @@
struct _iterator
{
// ---------- private ----------
void* _parent;
void* _cur_node;
uint32_t _cur;
void* _container; // pointer to stack/queue/tree ...
void* _node; // current node
uint32_t _index; // current index
uint32_t _order;
// ---------- public ----------

View File

@ -22,29 +22,17 @@ typedef enum {
RBT_BLACK,
}rbt_color;
/**
* @brief dfs amd bfs traversal order
*
* pre-order traversal
* in-order traversal
* post-order traversal
* breadth-first search traversal [BFS]
*
* right-first pre-order traversal
* right-first in-order traversal
* right-first post-order traversal
* breadth-first search traversal [BFS]
*/
enum _order{
ORDER_PRE,
ORDER_IN,
ORDER_POST,
ORDER_BREADTH,
// dfs and bfs traversal order
enum _tree_order{
ORDER_PRE, // pre-order
ORDER_IN, // in-order
ORDER_POST, // post-order
ORDER_BREADTH, // breadth-first search [BFS]
ORDER_PRE_R,
ORDER_IN_R,
ORDER_POST_R,
ORDER_BREADTH_R,
ORDER_PRE_R, // right-first pre-order
ORDER_IN_R, // right-first in-order
ORDER_POST_R, // right-first post-order
ORDER_BREADTH_R,// right-first breadth-first search [BFS]
};
struct _tree_node
@ -71,22 +59,19 @@ struct _tree
uint32_t _capacity;
uint32_t _ratio;
enum _order _order;
bool _right_priority;
stack_t stack;
queue_t queue;
struct _iterator _iter;
bool (*_rebalance)(struct _tree* self, struct _tree_node* root);
void (*_destory)(struct _tree* self);
// -------------------- public --------------------
// kernel
bool (*insert)(struct _tree* self, void* obj);
bool (*delete)(struct _tree* self, void* obj);
bool (*rebalance)(struct _tree* self, struct _tree_node* root);
int32_t (*height)(struct _tree* self, struct _tree_node* root);
uint32_t (*height)(struct _tree* self);
// base
bool (*clear)(struct _tree* self);
@ -94,7 +79,7 @@ struct _tree
uint32_t (*size)(struct _tree* self);
// iter
iterator_t (*iter)(struct _tree* self, enum _order);
iterator_t (*iter)(struct _tree* self, enum _tree_order);
// others
bool (*min)(struct _tree* self, void* obj);

View File

@ -11,7 +11,7 @@
#ifndef _UNICSTL_CONFIG_H_
/**
* @brief unicstl container
* @brief unicstl contains which module
*
*/
#define UNICSTL_LIST
@ -27,7 +27,7 @@
* @brief debug
*
*/
#define NDEBUG // assert disable
// #define NDEBUG // assert disable
#define UNICSTL_DEBUG
@ -38,7 +38,6 @@
#define UNICSTL_DEBUG_TREE
#define UNICSTL_DEBUG_HEAP
#define UNICSTL_DEBUG_GRAPH
// #define UNICSTL_DEBUG_ITERATOR
#endif
#endif

View File

@ -295,32 +295,13 @@ static void deque_print(struct _deque* self)
}
}
iterator_t deque_iter(struct _deque* self, enum _deque_order order)
{
assert(self != NULL);
iterator_t iter = &self->_iter;
iter->_parent = self;
iter->_cur = 0;
iter->_order = order;
if(iter->_order == DEQUE_FORWARD)
{
iter->_cur_node = self->_head;
}
else
{
iter->_cur_node = self->_tail;
}
return iter;
}
bool deque_iter_hasnext(struct _iterator* iter)
{
assert(iter != NULL);
assert(iter->parent != NULL);
assert(iter->_container != NULL);
deque_t self = (deque_t)iter->_parent;
if(iter->_cur < self->size(self))
deque_t self = (deque_t)iter->_container;
if(iter->_index < self->size(self))
{
return true;
}
@ -330,12 +311,12 @@ bool deque_iter_hasnext(struct _iterator* iter)
const void* deque_iter_next(struct _iterator* iter)
{
assert(iter != NULL);
assert(iter->parent != NULL);
assert(iter->_container != NULL);
deque_t self = (deque_t)iter->_parent;
deque_t self = (deque_t)iter->_container;
void *obj = NULL;
struct _deque_node * cur_node = (struct _deque_node *)iter->_cur_node;
struct _deque_node * cur_node = (struct _deque_node *)iter->_node;
if(cur_node == NULL)
{
return NULL;
@ -344,17 +325,39 @@ const void* deque_iter_next(struct _iterator* iter)
obj = cur_node->obj;
if(iter->_order == DEQUE_FORWARD)
{
iter->_cur_node = cur_node->next;
iter->_node = cur_node->next;
}
else
{
iter->_cur_node = cur_node->prev;
iter->_node = cur_node->prev;
}
self->_iter._cur += 1;
iter->_index += 1;
return obj;
}
iterator_t deque_iter(struct _deque* self, enum _deque_order order)
{
assert(self != NULL);
iterator_t iter = &self->_iter;
iter->_container = self;
iter->_index = 0;
iter->_order = order;
if(iter->_order == DEQUE_FORWARD)
{
iter->_node = self->_head;
}
else
{
iter->_node = self->_tail;
}
iter->hasnext = deque_iter_hasnext;
iter->next = deque_iter_next;
return iter;
}
static bool deque_init(struct _deque* self, uint32_t obj_size)
{
assert(self != NULL);
@ -371,9 +374,6 @@ static bool deque_init(struct _deque* self, uint32_t obj_size)
self->_head = NULL;
self->_tail = NULL;
self->_iter.hasnext = deque_iter_hasnext;
self->_iter.next = deque_iter_next;
self->_destory = deque_destory;
// -------------------- public --------------------

View File

@ -822,59 +822,13 @@ static struct _graph_node * graph_find_next_unvisited_target(struct _graph *self
return NULL;
}
iterator_t graph_iter(struct _graph *self, enum _graph_search search_type, void *start)
{
assert(self != NULL);
iterator_t iter = &self->_iter;
iter->_parent = self;
iter->_cur = 0;
iter->_cur_node = self->_head->next;
struct _graph_node *start_node = find_node(self, start);
if (start_node == NULL)
{
goto done;
}
iter->_cur_node = start_node;
struct _graph_node *node = self->_head->next;
while (node != NULL)
{
node->visited = false;
node = node->next;
}
self->_search = search_type;
switch (self->_search)
{
case GRAPH_BFS:
{
self->queue->push(self->queue, &iter->_cur_node);
}
break;
case GRAPH_DFS:
{
// pass
}
break;
default:
{
}
break;
}
done:
return iter;
}
bool graph_iter_hasnext(struct _iterator *iter)
{
assert(iter != NULL);
assert(iter->parent != NULL);
assert(iter->_container != NULL);
graph_t self = (graph_t)iter->_parent;
if (iter->_cur < self->size(self))
graph_t self = (graph_t)iter->_container;
if (iter->_index < self->size(self))
{
return true;
}
@ -884,17 +838,16 @@ bool graph_iter_hasnext(struct _iterator *iter)
const void *graph_iter_next(struct _iterator *iter)
{
assert(iter != NULL);
assert(iter->parent != NULL);
graph_t self = (graph_t)iter->_parent;
assert(iter->_container != NULL);
graph_t self = (graph_t)iter->_container;
void *obj = NULL;
iter->_cur += 1;
iter->_index += 1;
switch (self->_search)
{
case GRAPH_BFS:
{
struct _graph_node *cur_node = iter->_cur_node;
struct _graph_node *cur_node = iter->_node;
struct _graph_edge *cur_edge = cur_node->edgehead;
struct _graph_node *target = NULL;
struct _graph_node *node = cur_node;
@ -933,14 +886,13 @@ const void *graph_iter_next(struct _iterator *iter)
cur_node = node;
}
iter->_cur_node = cur_node;
iter->_node = cur_node;
obj = cur_node->obj;
}
break;
case GRAPH_DFS:
{
// self->stack->push(self->stack, iter->_cur_node);
struct _graph_node *cur_node = self->_iter._cur_node;
struct _graph_node *cur_node = iter->_node;
struct _graph_node *node = NULL;
stack_t stack = self->stack;
@ -976,7 +928,7 @@ const void *graph_iter_next(struct _iterator *iter)
}
}
}
iter->_cur_node = cur_node;
iter->_node = cur_node;
obj = node->obj;
}
break;
@ -989,6 +941,55 @@ const void *graph_iter_next(struct _iterator *iter)
return obj;
}
iterator_t graph_iter(struct _graph *self, enum _graph_search search_type, void *start)
{
assert(self != NULL);
iterator_t iter = &self->_iter;
iter->_container = self;
iter->_index = 0;
// iter->_node = self->_head->next;
struct _graph_node *start_node = find_node(self, start);
if (start_node == NULL)
{
goto done;
}
iter->_node = start_node;
iter->hasnext = graph_iter_hasnext;
iter->next = graph_iter_next;
struct _graph_node *node = self->_head->next;
while (node != NULL)
{
node->visited = false;
node = node->next;
}
self->_search = search_type;
switch (self->_search)
{
case GRAPH_BFS:
{
self->queue->push(self->queue, &iter->_node);
}
break;
case GRAPH_DFS:
{
// pass
}
break;
default:
{
}
break;
}
done:
return iter;
}
static bool graph_init(struct _graph *self, uint32_t obj_size)
{
assert(self != NULL);
@ -1030,9 +1031,6 @@ static bool graph_init(struct _graph *self, uint32_t obj_size)
self->_type = GRAPH_UNDIRECTED;
// self->_type = GRAPH_DIRECTED;
self->_iter.hasnext = graph_iter_hasnext;
self->_iter.next = graph_iter_next;
self->_destory = graph_destory;
// -------------------- public --------------------

View File

@ -249,25 +249,13 @@ static void heap_print(struct _heap* self)
}
}
iterator_t heap_iter(struct _heap* self)
{
assert(self != NULL);
iterator_t iter = &self->_iter;
iter->_parent = self;
iter->_cur = 0;
iter->_cur_node = self->obj;
return iter;
}
bool heap_iter_hasnext(struct _iterator* iter)
{
assert(iter != NULL);
assert(iter->parent != NULL);
assert(iter->_container != NULL);
heap_t self = (heap_t)iter->_parent;
if(iter->_cur < self->size(self))
heap_t self = (heap_t)iter->_container;
if(iter->_index < self->size(self))
{
return true;
}
@ -277,18 +265,32 @@ bool heap_iter_hasnext(struct _iterator* iter)
const void* heap_iter_next(struct _iterator* iter)
{
assert(iter != NULL);
assert(iter->parent != NULL);
assert(iter->_container != NULL);
heap_t self = (heap_t)iter->_parent;
heap_t self = (heap_t)iter->_container;
void *obj = NULL;
uint32_t index = self->_iter._cur;
uint32_t index = iter->_index;
obj = self->obj + self->_obj_size * index;
self->_iter._cur += 1;
iter->_index += 1;
return obj;
}
iterator_t heap_iter(struct _heap* self)
{
assert(self != NULL);
iterator_t iter = &self->_iter;
iter->_container = self;
iter->_index = 0;
iter->_node = self->obj;
iter->hasnext = heap_iter_hasnext;
iter->next = heap_iter_next;
return iter;
}
static bool heap_init2(struct _heap* self, uint32_t obj_size, uint32_t capacity)
{
assert(self != NULL);
@ -305,9 +307,6 @@ static bool heap_init2(struct _heap* self, uint32_t obj_size, uint32_t capacity)
return false;
}
self->_iter.hasnext = heap_iter_hasnext;
self->_iter.next = heap_iter_next;
self->_destory = heap_destory;
// -------------------- public --------------------

View File

@ -179,37 +179,41 @@ static void list_print(struct _list* self)
}
}
static const void* list_iter_next(struct _iterator* iter)
{
list_t self = (list_t)iter->_parent;
void *obj = self->obj + self->_iter._cur * self->_obj_size;
self->_iter._cur += 1;
return obj;
}
static bool list_iter_hasnext(struct _iterator* iter)
{
list_t self = (list_t)iter->_parent;
list_t self = (list_t)iter->_container;
if(self->_iter._cur < self->size(self))
if(iter->_index < self->size(self))
{
return true;
}
return false;
}
static const void* list_iter_next(struct _iterator* iter)
{
list_t self = (list_t)iter->_container;
void *obj = self->obj + iter->_index * self->_obj_size;
iter->_index += 1;
return obj;
}
iterator_t list_iter(struct _list* self)
{
self->_iter._parent = self;
self->_iter._cur = 0;
return &self->_iter;
assert(self != NULL);
iterator_t iter = &self->_iter;
iter->_container = self;
iter->_index = 0;
iter->hasnext = list_iter_hasnext;
iter->next = list_iter_next;
return iter;
}
static bool list_init2(struct _list* list, uint32_t obj_size, uint32_t capacity)
{
assert(list != NULL);
assert(obj_size > 0);
assert(capacity > 0);
if(list == NULL || obj_size == 0 || capacity == 0)
{
return false;

View File

@ -306,24 +306,13 @@ static void queue2_print(struct _queue* self)
}
}
static iterator_t queue_iter(struct _queue* self)
{
assert(self != NULL);
iterator_t iter = &self->_iter;
iter->_parent = self;
iter->_cur = 0;
iter->_cur_node = self->_front;
return iter;
}
static bool queue_iter_hasnext(struct _iterator* iter)
{
assert(iter != NULL);
assert(iter->parent != NULL);
assert(iter->_container != NULL);
queue_t self = (queue_t)iter->_parent;
if(iter->_cur < self->size(self))
queue_t self = (queue_t)iter->_container;
if(iter->_index < self->size(self))
{
return true;
}
@ -333,42 +322,69 @@ static bool queue_iter_hasnext(struct _iterator* iter)
static const void* queue_iter_next(struct _iterator* iter)
{
assert(iter != NULL);
assert(iter->parent != NULL);
assert(iter->_container != NULL);
queue_t self = (queue_t)iter->_parent;
queue_t self = (queue_t)iter->_container;
void *obj = NULL;
// base on linklist
struct _queue_node * node = (struct _queue_node *)iter->_cur_node;
struct _queue_node * node = (struct _queue_node *)iter->_node;
if(node != NULL)
{
obj = node->obj;
iter->_cur_node = node->next;
iter->_node = node->next;
}
self->_iter._cur += 1;
iter->_index += 1;
return obj;
}
static iterator_t queue_iter(struct _queue* self)
{
assert(self != NULL);
iterator_t iter = &self->_iter;
iter->_container = self;
iter->_index = 0;
iter->_node = self->_front;
iter->hasnext = queue_iter_hasnext;
iter->next = queue_iter_next;
return iter;
}
static const void* queue2_iter_next(struct _iterator* iter)
{
assert(iter != NULL);
assert(iter->parent != NULL);
assert(iter->_container != NULL);
queue_t self = (queue_t)iter->_parent;
queue_t self = (queue_t)iter->_container;
void *obj = NULL;
// base on array
uint32_t index = self->_iter._cur;
uint32_t index = iter->_index;
obj = self->_front->obj + self->_obj_size * index;
self->_iter._cur += 1;
iter->_index += 1;
return obj;
}
static iterator_t queue2_iter(struct _queue* self)
{
assert(self != NULL);
iterator_t iter = &self->_iter;
iter->_container = self;
iter->_index = 0;
iter->_node = self->_front;
iter->hasnext = queue_iter_hasnext;
iter->next = queue2_iter_next;
return iter;
}
static bool queue_init(struct _queue * self, uint32_t obj_size)
{
assert(self != NULL);
assert(obj_size > 0);
if(self == NULL || obj_size == 0)
{
return false;
@ -387,10 +403,6 @@ static bool queue_init(struct _queue * self, uint32_t obj_size)
// base
self->_destory = queue_destory;
// iter
self->_iter.hasnext = queue_iter_hasnext;
self->_iter.next = queue_iter_next;
// -------------------- public --------------------
// kernel
self->push = queue_push;
@ -417,8 +429,6 @@ static bool queue_init(struct _queue * self, uint32_t obj_size)
static bool queue_init2(struct _queue * self, uint32_t obj_size, uint32_t capacity)
{
assert(self != NULL);
assert(obj_size > 0);
assert(capacity > 0);
if(self == NULL || obj_size == 0 || capacity == 0)
{
return false;
@ -471,7 +481,7 @@ static bool queue_init2(struct _queue * self, uint32_t obj_size, uint32_t capaci
self->clear = queue2_clear;
// iter
self->iter = queue_iter;
self->iter = queue2_iter;
// -------------------- debug --------------------
self->print = queue2_print;

View File

@ -254,63 +254,64 @@ static void stack2_print(struct _stack* self)
}
}
/**
* @brief iterator next
* from top to bottom
*
* @param iter
* @return const void*
* the value of return is const, so you can't modify it.
*/
const void* stack_iter_next(struct _iterator* iter)
{
assert(iter != NULL);
assert(iter->parent != NULL);
stack_t self = (stack_t)iter->_parent;
void *obj = NULL;
if(self->_head->obj == NULL)
{
// base on linklist
struct _stack_node* node = (struct _stack_node *)self->_iter._cur_node;
if(node != NULL)
{
obj = node->obj;
self->_iter._cur_node = node->next;
}
}
else
{
// base on array
uint32_t index = self->size(self) - 1 - self->_iter._cur;
obj = self->_head->obj + self->_obj_size * index;
}
self->_iter._cur += 1;
return obj;
}
bool stack_iter_hasnext(struct _iterator* iter)
{
assert(iter != NULL);
assert(iter->parent != NULL);
assert(iter->_container != NULL);
stack_t self = (stack_t)iter->_parent;
if(self->_iter._cur < self->size(self))
stack_t self = (stack_t)iter->_container;
if(iter->_index < self->size(self))
{
return true;
}
return false;
}
/**
* @brief iter next
* from top to bottom
*/
const void* stack_iter_next(struct _iterator* iter)
{
assert(iter != NULL);
assert(iter->_container != NULL);
stack_t self = (stack_t)iter->_container;
void *obj = NULL;
if(self->_head->obj == NULL)
{
// base on linklist
struct _stack_node* node = (struct _stack_node *)iter->_node;
if(node != NULL)
{
obj = node->obj;
iter->_node = node->next;
}
}
else
{
// base on array
uint32_t index = self->size(self) - 1 - iter->_index;
obj = self->_head->obj + self->_obj_size * index;
}
iter->_index += 1;
return obj;
}
iterator_t stack_iter(struct _stack* self)
{
assert(self != NULL);
self->_iter._parent = self;
self->_iter._cur = 0;
self->_iter._cur_node = self->_head->next;
return &self->_iter;
iterator_t iter = &self->_iter;
iter->_container = self;
iter->_index = 0;
iter->_node = self->_head->next;
iter->hasnext = stack_iter_hasnext;
iter->next = stack_iter_next;
return iter;
}
static bool stack_init(struct _stack* self, uint32_t obj_size)
@ -336,9 +337,6 @@ static bool stack_init(struct _stack* self, uint32_t obj_size)
self->_head->obj = NULL;
self->_head->next = NULL;
self->_iter.next = stack_iter_next;
self->_iter.hasnext = stack_iter_hasnext;
self->_destory = stack_destory;
// ---------- public ----------

File diff suppressed because it is too large Load Diff

View File

@ -67,7 +67,7 @@ static const int expected_int_array_orderpre_delete[15][15] = {
{ 13, },
};
static const enum _order order[8] = {
static const enum _tree_order order[8] = {
ORDER_PRE, ORDER_IN, ORDER_POST, ORDER_BREADTH,
ORDER_PRE_R, ORDER_IN_R, ORDER_POST_R, ORDER_BREADTH_R
};
@ -335,10 +335,6 @@ static void test_rbtree_delete(void)
int temp = 0;
int count = 0;
iterator_t iter = NULL;
enum _order order[8] = {
ORDER_PRE, ORDER_IN, ORDER_POST, ORDER_BREADTH,
ORDER_PRE_R, ORDER_IN_R, ORDER_POST_R, ORDER_BREADTH_R
};
tree_t tree = tree_rb_new(sizeof(int));
TEST_ASSERT_NOT_NULL(tree);