update
This commit is contained in:
parent
7343039dc9
commit
83210aa292
1 changed files with 41 additions and 13 deletions
|
|
@ -11,6 +11,7 @@
|
|||
CREATE_POP(name) \
|
||||
CREATE_FOREACH(name) \
|
||||
CREATE_FOREACH_REVERSE(name) \
|
||||
CREATE_FOREACH_TWOPASS(name) \
|
||||
CREATE_DELETE(name) \
|
||||
CREATE_SAVE(name) \
|
||||
CREATE_PRINT(name) \
|
||||
|
|
@ -35,6 +36,7 @@
|
|||
return -1; \
|
||||
} \
|
||||
_list->head->next = second; \
|
||||
\
|
||||
_list->head->val = element; \
|
||||
return 0; \
|
||||
}
|
||||
|
|
@ -103,6 +105,24 @@
|
|||
return _foreach_reverse_##name(_list->head, fun, args); \
|
||||
}
|
||||
|
||||
#define CREATE_FOREACH_TWOPASS(name) \
|
||||
int _foreach_twopass_##name( \
|
||||
name##_node* node, int (*fun)(name##_node*, void*), void* args \
|
||||
) { \
|
||||
if (node) { \
|
||||
int ret = fun(node, args); \
|
||||
if (ret) return ret; \
|
||||
ret = _foreach_twopass_##name(node->next, fun, args); \
|
||||
return ret ? ret : fun(node, args); \
|
||||
} \
|
||||
return 0; \
|
||||
} \
|
||||
int foreach_twopass_##name( \
|
||||
name* _list, int (*fun)(name##_node*, void*), void* args \
|
||||
) { \
|
||||
return _foreach_twopass_##name(_list->head, fun, args); \
|
||||
}
|
||||
|
||||
#define CREATE_DELETE(name) \
|
||||
int _delete_##name(name##_node* node, void* args) { \
|
||||
free(node); \
|
||||
|
|
@ -153,15 +173,23 @@ typedef struct save_args {
|
|||
}
|
||||
|
||||
#define CREATE_REMOVE(name, type) \
|
||||
struct _remove_args_##name { \
|
||||
int (*eql)(type, type); \
|
||||
type to_remove; \
|
||||
}; \
|
||||
int _remove_##name(name##_node* node, void* args) { \
|
||||
name##_node* next = node->next; \
|
||||
struct _remove_args_##name* args_typed = \
|
||||
(struct _remove_args_##name*)args; \
|
||||
if (!next) return -1; \
|
||||
if (next->val != *((type*)args)) return 0; \
|
||||
if (!args_typed->eql(next->val, *((type*)args))) return 0; \
|
||||
name##_node* new_next = next->next; \
|
||||
free(next); \
|
||||
node->next = new_next; \
|
||||
return 1; \
|
||||
} \
|
||||
int remove_##name(name* _list, type element) { \
|
||||
return foreach_##name(_list, _remove_##name, (void*)&element); \
|
||||
int remove_##name(name* _list, type element, int (*eql)(type, type)) { \
|
||||
if (!eql) return -2; \
|
||||
struct _remove_args_##name args = {.eql = eql, .to_remove = element}; \
|
||||
return foreach_##name(_list, _remove_##name, (void*)&args) != 1; \
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue