This commit is contained in:
Dario48 2025-12-06 12:10:38 +01:00
commit 83210aa292

View file

@ -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); \
@ -152,16 +172,24 @@ typedef struct save_args {
return 0; \
}
#define CREATE_REMOVE(name, type) \
int _remove_##name(name##_node* node, void* args) { \
name##_node* next = node->next; \
if (!next) return -1; \
if (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); \
#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 (!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, 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; \
}