Compare commits
2 commits
a2a41a80e5
...
f7b00eb5dc
Author | SHA1 | Date | |
---|---|---|---|
f7b00eb5dc | |||
10ed0d4172 |
2 changed files with 84 additions and 14 deletions
|
@ -19,15 +19,16 @@ struct ordinary_list {
|
|||
typedef uint8_t (*callback)(struct ordinary_node *node, uint32_t idx);
|
||||
|
||||
void ordinary_list_new(struct ordinary_list *list, uint32_t limit);
|
||||
void ordinary_list_del(struct ordinary_list *list);
|
||||
void ordinary_list_delete(struct ordinary_list *list);
|
||||
|
||||
struct ordinary_node *ordinary_list_add(struct ordinary_list *list, void *val);
|
||||
void standard_list_mov(struct standard_list *list, struct standard_node *node);
|
||||
struct ordinary_node *ordinary_list_pop(struct ordinary_list *list);
|
||||
|
||||
struct ordinary_node *ordinary_list_at(struct ordinary_list *list, uint32_t idx);
|
||||
uint8_t ordinary_list_empty(struct ordinary_list *list);
|
||||
uint8_t ordinary_list_full(struct ordinary_list *list);
|
||||
struct ordinary_node *ordinary_list_at(struct ordinary_list *list, uint32_t idx);
|
||||
struct ordinary_node *ordinary_list_find(struct ordinary_list *list, callback cb);
|
||||
uint8_t ordinary_list_for(struct ordinary_list *list, callback cb);
|
||||
|
||||
struct ordinary_node *ordinary_list_add(struct ordinary_list *list, void *val);
|
||||
void ordinary_list_move(struct standard_list *dst, struct standard_list *src, struct standard_node *node);
|
||||
struct ordinary_node *ordinary_list_pop(struct ordinary_list *list);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -8,14 +8,81 @@ void ordinary_list_new(struct ordinary_list *list, uint32_t limit) {
|
|||
list->limit = limit;
|
||||
}
|
||||
|
||||
void ordinary_list_del(struct ordinary_list *list) {
|
||||
struct ordinary_node *at = list->head;
|
||||
void ordinary_list_delete(struct ordinary_list *list) {
|
||||
struct ordinary_node *node = list->head;
|
||||
|
||||
while(at) {
|
||||
struct ordinary_node *next = at->next;
|
||||
free(at);
|
||||
at = next;
|
||||
while(node) {
|
||||
struct ordinary_node *next = node->next;
|
||||
free(node); // R.I.P.
|
||||
node = next;
|
||||
}
|
||||
|
||||
list->head = NULL;
|
||||
list->tail = NULL;
|
||||
list->count = 0;
|
||||
list->limit = 0;
|
||||
}
|
||||
|
||||
uint8_t ordinary_list_empty(struct ordinary_list *list) {
|
||||
if(!list->limit) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return list->count == 0;
|
||||
}
|
||||
|
||||
uint8_t ordinary_list_full(struct ordinary_list *list) {
|
||||
if(!list->limit) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return list->count == list->limit;
|
||||
}
|
||||
|
||||
struct ordinary_node *ordinary_list_at(struct ordinary_list *list, uint32_t idx) {
|
||||
struct ordinary_node *node = list->head;
|
||||
|
||||
for(; node; node = node->next) {
|
||||
idx -= 1;
|
||||
|
||||
if(!idx) {
|
||||
return node;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct ordinary_node *ordinary_list_find(struct ordinary_list *list, callback cb) {
|
||||
struct ordinary_node *node = list->head;
|
||||
uint32_t idx = 0;
|
||||
|
||||
for(; node; node = node->next) {
|
||||
if(cb(node, idx)) {
|
||||
return node;
|
||||
}
|
||||
|
||||
if(list->limit) {
|
||||
idx += 1;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
uint8_t ordinary_list_for(struct ordinary_list *list, callback cb) {
|
||||
struct ordinary_node *node = list->head;
|
||||
uint32_t idx = 0, res = 0;
|
||||
|
||||
for(; node; node = node->next) {
|
||||
res |= cb(list, idx);
|
||||
|
||||
if(list->limit) {
|
||||
idx += 1;
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static void ordinary_list_insert(struct ordinary_list *list, struct ordinary_node *node) {
|
||||
|
@ -57,7 +124,9 @@ struct ordinary_node *ordinary_list_add(struct ordinary_list *list, void *val) {
|
|||
return node;
|
||||
}
|
||||
|
||||
void ordinary_list_mov(struct standard_list *list, struct standard_node *node) {
|
||||
void ordinary_list_mov(struct standard_list *dst, struct standard_list *src, struct standard_node *node) {
|
||||
if(dst->limit &&)
|
||||
|
||||
struct ordinary_node *prev = node->prev;
|
||||
struct ordinary_node *next = node->next;
|
||||
|
||||
|
@ -71,5 +140,5 @@ void ordinary_list_mov(struct standard_list *list, struct standard_node *node) {
|
|||
node->next = NULL;
|
||||
}
|
||||
|
||||
ordinary_list_insert(list, node);
|
||||
ordinary_list_insert(dst, node);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue