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_POP(name) \
|
||||||
CREATE_FOREACH(name) \
|
CREATE_FOREACH(name) \
|
||||||
CREATE_FOREACH_REVERSE(name) \
|
CREATE_FOREACH_REVERSE(name) \
|
||||||
|
CREATE_FOREACH_TWOPASS(name) \
|
||||||
CREATE_DELETE(name) \
|
CREATE_DELETE(name) \
|
||||||
CREATE_SAVE(name) \
|
CREATE_SAVE(name) \
|
||||||
CREATE_PRINT(name) \
|
CREATE_PRINT(name) \
|
||||||
|
|
@ -35,6 +36,7 @@
|
||||||
return -1; \
|
return -1; \
|
||||||
} \
|
} \
|
||||||
_list->head->next = second; \
|
_list->head->next = second; \
|
||||||
|
\
|
||||||
_list->head->val = element; \
|
_list->head->val = element; \
|
||||||
return 0; \
|
return 0; \
|
||||||
}
|
}
|
||||||
|
|
@ -103,6 +105,24 @@
|
||||||
return _foreach_reverse_##name(_list->head, fun, args); \
|
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) \
|
#define CREATE_DELETE(name) \
|
||||||
int _delete_##name(name##_node* node, void* args) { \
|
int _delete_##name(name##_node* node, void* args) { \
|
||||||
free(node); \
|
free(node); \
|
||||||
|
|
@ -152,16 +172,24 @@ typedef struct save_args {
|
||||||
return 0; \
|
return 0; \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define CREATE_REMOVE(name, type) \
|
#define CREATE_REMOVE(name, type) \
|
||||||
int _remove_##name(name##_node* node, void* args) { \
|
struct _remove_args_##name { \
|
||||||
name##_node* next = node->next; \
|
int (*eql)(type, type); \
|
||||||
if (!next) return -1; \
|
type to_remove; \
|
||||||
if (next->val != *((type*)args)) return 0; \
|
}; \
|
||||||
name##_node* new_next = next->next; \
|
int _remove_##name(name##_node* node, void* args) { \
|
||||||
free(next); \
|
name##_node* next = node->next; \
|
||||||
node->next = new_next; \
|
struct _remove_args_##name* args_typed = \
|
||||||
return 1; \
|
(struct _remove_args_##name*)args; \
|
||||||
} \
|
if (!next) return -1; \
|
||||||
int remove_##name(name* _list, type element) { \
|
if (!args_typed->eql(next->val, *((type*)args))) return 0; \
|
||||||
return foreach_##name(_list, _remove_##name, (void*)&element); \
|
name##_node* new_next = next->next; \
|
||||||
|
free(next); \
|
||||||
|
node->next = new_next; \
|
||||||
|
return 1; \
|
||||||
|
} \
|
||||||
|
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