Removed variadic arguments from looping linked list functions.
This commit is contained in:
parent
95167c91e8
commit
a7e3c16ad9
|
|
@ -109,36 +109,36 @@ int asset_manager_exit(void)
|
|||
|
||||
// Only for this file
|
||||
// No args
|
||||
static inline bool condition_is_asset_unused(elem_t *elem, va_list args __attribute__((unused)))
|
||||
static inline bool condition_is_asset_unused(elem_t *elem, void *arg __attribute__((unused)))
|
||||
{
|
||||
return !((asset_t *)elem->data)->nb_refs;
|
||||
}
|
||||
|
||||
inline int asset_manager_collect_garbage(void)
|
||||
{
|
||||
if(linked_list_remove_if(&game.asset_manager.assets, condition_is_asset_unused)) return_failure_int;
|
||||
if(linked_list_remove_if(&game.asset_manager.assets, condition_is_asset_unused, NULL)) return_failure_int;
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
// Only for this file
|
||||
// Arg : const char *asset_name
|
||||
static inline bool condition_is_asset_name(elem_t *elem, va_list args)
|
||||
static inline bool condition_is_asset_name(elem_t *elem, void *arg)
|
||||
{
|
||||
return !strcmp(((asset_t *)elem->data)->name, va_arg(args, const char *));
|
||||
return !strcmp(((asset_t *)elem->data)->name, (const char *)arg);
|
||||
}
|
||||
|
||||
//Only for this file
|
||||
// Arg : const char *asset_name
|
||||
static inline bool condition_is_asset_header_def_name(elem_t *elem, va_list args)
|
||||
static inline bool condition_is_asset_header_def_name(elem_t *elem, void *arg)
|
||||
{
|
||||
return !strcmp(((asset_header_def_t *)elem->data)->name, va_arg(args, const char *));
|
||||
return !strcmp(((asset_header_def_t *)elem->data)->name, (const char *)arg);
|
||||
}
|
||||
|
||||
asset_t *asset_manager_load_asset(const char *asset_name, asset_type_t asset_type)
|
||||
asset_t *asset_manager_load_asset(char *asset_name, asset_type_t asset_type)
|
||||
{
|
||||
// Check if asset has alread been loaded.
|
||||
elem_t *asset_elem = linked_list_get_if(&game.asset_manager.assets, condition_is_asset_name, asset_name);
|
||||
elem_t *asset_elem = linked_list_get_if(&game.asset_manager.assets, condition_is_asset_name, (void *)asset_name);
|
||||
if(asset_elem)
|
||||
{
|
||||
((asset_t *)asset_elem->data)->nb_refs++;
|
||||
|
|
@ -148,7 +148,7 @@ asset_t *asset_manager_load_asset(const char *asset_name, asset_type_t asset_typ
|
|||
else
|
||||
{
|
||||
// If it didn't, load it
|
||||
elem_t *asset_header_def_elem = linked_list_get_if(&game.asset_manager.assets_header_defs, condition_is_asset_header_def_name, asset_name);
|
||||
elem_t *asset_header_def_elem = linked_list_get_if(&game.asset_manager.assets_header_defs, condition_is_asset_header_def_name, (void *)asset_name);
|
||||
if(!asset_header_def_elem)
|
||||
{
|
||||
error_printf("Asset doesn't exist in asset file : %s", asset_name);
|
||||
|
|
@ -199,9 +199,9 @@ asset_t *asset_manager_load_asset(const char *asset_name, asset_type_t asset_typ
|
|||
return asset_elem->data;
|
||||
}
|
||||
|
||||
int asset_manager_let_go_asset(const char *asset_name)
|
||||
int asset_manager_let_go_asset(char *asset_name)
|
||||
{
|
||||
elem_t *asset_elem = linked_list_get_if(&game.asset_manager.assets, condition_is_asset_name, asset_name);
|
||||
elem_t *asset_elem = linked_list_get_if(&game.asset_manager.assets, condition_is_asset_name, (void *)asset_name);
|
||||
if(!asset_elem)
|
||||
{
|
||||
error_printf("Asset doesn't exists : %s", asset_name);
|
||||
|
|
@ -217,12 +217,12 @@ int asset_manager_let_go_asset(const char *asset_name)
|
|||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
asset_t *asset_manager_get_asset(const char *texture_name)
|
||||
asset_t *asset_manager_get_asset(char *asset_name)
|
||||
{
|
||||
elem_t *asset_elem = linked_list_get_if(&game.asset_manager.assets, condition_is_asset_name, texture_name);
|
||||
elem_t *asset_elem = linked_list_get_if(&game.asset_manager.assets, condition_is_asset_name, (void *)asset_name);
|
||||
if(!asset_elem)
|
||||
{
|
||||
error_printf("Asset \"%s\" hasn't been loaded yet.", texture_name);
|
||||
error_printf("Asset \"%s\" hasn't been loaded yet.", asset_name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
|||
43
src/ecs.c
43
src/ecs.c
|
|
@ -77,14 +77,14 @@ component_t *entity_new_component(entity_t *entity, component_type_t component_t
|
|||
|
||||
// Only for this file
|
||||
// Arg : component_type_t component_type
|
||||
static inline bool condition_is_component_type(elem_t *elem, va_list args)
|
||||
static inline bool condition_is_component_type(elem_t *elem, void *arg)
|
||||
{
|
||||
return ((component_t *)elem->data)->type == va_arg(args, component_type_t);
|
||||
return ((component_t *)elem->data)->type == *(component_type_t *)arg;
|
||||
}
|
||||
|
||||
inline component_t *entity_get_component(const entity_t *entity, component_type_t component_type)
|
||||
{
|
||||
elem_t *component_elem = linked_list_get_if(&entity->components, condition_is_component_type, component_type);
|
||||
elem_t *component_elem = linked_list_get_if(&entity->components, condition_is_component_type, &component_type);
|
||||
if(!component_elem) return NULL;
|
||||
|
||||
component_t *component = component_elem->data;
|
||||
|
|
@ -94,7 +94,7 @@ inline component_t *entity_get_component(const entity_t *entity, component_type_
|
|||
|
||||
// Only for this file
|
||||
// No args
|
||||
static inline int action_update_component(elem_t *elem, va_list args __attribute__((unused)))
|
||||
static inline int action_update_component(elem_t *elem, void *arg __attribute__((unused)))
|
||||
{
|
||||
component_t *component = elem->data;
|
||||
|
||||
|
|
@ -105,13 +105,13 @@ static inline int action_update_component(elem_t *elem, va_list args __attribute
|
|||
|
||||
inline int update_entity(entity_t *entity)
|
||||
{
|
||||
if(linked_list_for_each(&entity->components, action_update_component)) return_failure_int;
|
||||
if(linked_list_for_each(&entity->components, action_update_component, NULL)) return_failure_int;
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
// No args
|
||||
static inline int action_draw_component(elem_t *elem, va_list args __attribute__((unused)))
|
||||
static inline int action_draw_component(elem_t *elem, void *arg __attribute__((unused)))
|
||||
{
|
||||
component_t *component = elem->data;
|
||||
|
||||
|
|
@ -123,7 +123,7 @@ static inline int action_draw_component(elem_t *elem, va_list args __attribute__
|
|||
|
||||
inline int draw_entity(entity_t *entity)
|
||||
{
|
||||
if(linked_list_for_each(&entity->components, action_draw_component)) return_failure_int;
|
||||
if(linked_list_for_each(&entity->components, action_draw_component, NULL)) return_failure_int;
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
|
@ -148,50 +148,49 @@ inline entity_t *entity_manager_new_entity(size_t id)
|
|||
}
|
||||
|
||||
// No args
|
||||
static inline int action_update_entity(elem_t *elem, va_list args __attribute__((unused)))
|
||||
static inline int action_update_entity(elem_t *elem, void *arg __attribute__((unused)))
|
||||
{
|
||||
return update_entity((entity_t *)elem->data);
|
||||
}
|
||||
|
||||
inline int entity_manager_update(void)
|
||||
{
|
||||
if(linked_list_for_each(&game.entity_manager.entities, action_update_entity)) return_failure_int;
|
||||
if(linked_list_for_each(&game.entity_manager.entities, action_update_entity, NULL)) return_failure_int;
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
// Only for this file
|
||||
// No args
|
||||
static inline int action_draw_entity(elem_t *elem, va_list args __attribute__((unused)))
|
||||
{
|
||||
return draw_entity((entity_t *)elem->data);
|
||||
}
|
||||
|
||||
// No args
|
||||
static inline bool condition_is_draw_priority_higher(elem_t *elem, va_list args __attribute__((unused)))
|
||||
static inline bool condition_is_draw_priority_higher(elem_t *elem, void *arg __attribute__((unused)))
|
||||
{
|
||||
return ((entity_t *)elem->data)->draw_priority > ((entity_t *)elem->next->data)->draw_priority;
|
||||
}
|
||||
|
||||
// No args
|
||||
static inline int action_draw_entity(elem_t *elem, void *arg __attribute__((unused)))
|
||||
{
|
||||
return draw_entity((entity_t *)elem->data);
|
||||
}
|
||||
|
||||
inline int entity_manager_draw(void)
|
||||
{
|
||||
linked_list_insertion_sort(&game.entity_manager.entities, condition_is_draw_priority_higher);
|
||||
linked_list_insertion_sort(&game.entity_manager.entities, condition_is_draw_priority_higher, NULL);
|
||||
|
||||
if(linked_list_for_each(&game.entity_manager.entities, action_draw_entity)) return_failure_int;
|
||||
if(linked_list_for_each(&game.entity_manager.entities, action_draw_entity, NULL)) return_failure_int;
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
// Only for this file
|
||||
// Arg : unsigned int id
|
||||
static inline bool condition_is_entity_name(elem_t *elem, va_list args)
|
||||
static inline bool condition_is_entity_name(elem_t *elem, void *arg)
|
||||
{
|
||||
return ((entity_t *)elem->data)->id == va_arg(args, unsigned int);
|
||||
return ((entity_t *)elem->data)->id == *(unsigned int *)arg;
|
||||
}
|
||||
|
||||
inline int entity_manager_remove_entity(unsigned int id)
|
||||
{
|
||||
if(linked_list_remove_if(&game.entity_manager.entities, condition_is_entity_name, id)) return_failure_int;
|
||||
if(linked_list_remove_if(&game.entity_manager.entities, condition_is_entity_name, &id)) return_failure_int;
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -60,21 +60,21 @@ int event_bus_new_topic(size_t id)
|
|||
}
|
||||
|
||||
// Arg : size_t id
|
||||
static inline bool condition_is_topic_id(elem_t *elem, va_list args)
|
||||
static inline bool condition_is_topic_id(elem_t *elem, void *arg)
|
||||
{
|
||||
return ((topic_t *)elem->data)->id == va_arg(args, size_t);
|
||||
return ((topic_t *)elem->data)->id == *(size_t *)arg;
|
||||
}
|
||||
|
||||
inline int event_bus_remove_topic(size_t id)
|
||||
{
|
||||
if(linked_list_remove_if(&game.event_bus.topics, condition_is_topic_id, id)) return_failure_int;
|
||||
if(linked_list_remove_if(&game.event_bus.topics, condition_is_topic_id, &id)) return_failure_int;
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
int event_bus_change_topic_id(size_t old_id, size_t new_id)
|
||||
{
|
||||
elem_t *topic_elem = linked_list_get_if(&game.event_bus.topics, condition_is_topic_id, old_id);
|
||||
elem_t *topic_elem = linked_list_get_if(&game.event_bus.topics, condition_is_topic_id, &old_id);
|
||||
if(!topic_elem) return_failure_int;
|
||||
|
||||
topic_t *topic = topic_elem->data;
|
||||
|
|
@ -84,35 +84,23 @@ int event_bus_change_topic_id(size_t old_id, size_t new_id)
|
|||
}
|
||||
|
||||
// Args : va_list args
|
||||
static int action_execute_callback(elem_t *elem, va_list args)
|
||||
static int action_execute_callback(elem_t *elem, void *arg)
|
||||
{
|
||||
subscription_t *subscription = elem->data;
|
||||
|
||||
va_list args_copy;
|
||||
va_copy(args_copy, args);
|
||||
|
||||
if(subscription->callback(args_copy, subscription->data)) return_failure_int;
|
||||
|
||||
va_end(args_copy);
|
||||
if(subscription->callback(arg, subscription->data)) return_failure_int;
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
int event_bus_publish(size_t id, ...)
|
||||
int event_bus_publish(size_t id, void *arg)
|
||||
{
|
||||
elem_t *topic_elem = linked_list_get_if(&game.event_bus.topics, condition_is_topic_id, id);
|
||||
elem_t *topic_elem = linked_list_get_if(&game.event_bus.topics, condition_is_topic_id, &id);
|
||||
if(!topic_elem) return_failure_int;
|
||||
|
||||
topic_t *topic = topic_elem->data;
|
||||
|
||||
va_list args, args_copy;
|
||||
va_start(args, id);
|
||||
va_copy(args_copy, args);
|
||||
|
||||
if(linked_list_for_eachv(&topic->subscriptions, action_execute_callback, args_copy)) return_failure_int;
|
||||
|
||||
va_end(args_copy);
|
||||
va_end(args);
|
||||
if(linked_list_for_each(&topic->subscriptions, action_execute_callback, arg)) return_failure_int;
|
||||
|
||||
debug_printf("Published event on topic with id : %lu", id);
|
||||
|
||||
|
|
@ -121,7 +109,7 @@ int event_bus_publish(size_t id, ...)
|
|||
|
||||
int event_bus_subscribe(size_t id, callback_t callback, void *data)
|
||||
{
|
||||
elem_t *topic_elem = linked_list_get_if(&game.event_bus.topics, condition_is_topic_id, id);
|
||||
elem_t *topic_elem = linked_list_get_if(&game.event_bus.topics, condition_is_topic_id, &id);
|
||||
if(!topic_elem) return_failure_int;
|
||||
|
||||
topic_t *topic = topic_elem->data;
|
||||
|
|
@ -137,19 +125,19 @@ int event_bus_subscribe(size_t id, callback_t callback, void *data)
|
|||
}
|
||||
|
||||
// Arg : callback_t callback
|
||||
static inline bool condition_is_callback(elem_t *elem, va_list args)
|
||||
static inline bool condition_is_callback(elem_t *elem, void *arg)
|
||||
{
|
||||
return ((subscription_t *)elem->data)->callback == va_arg(args, callback_t);
|
||||
return ((subscription_t *)elem->data)->callback == *(callback_t *)arg;
|
||||
}
|
||||
|
||||
int event_bus_unsubscribe(size_t id, callback_t callback)
|
||||
{
|
||||
elem_t *topic_elem = linked_list_get_if(&game.event_bus.topics, condition_is_topic_id, id);
|
||||
elem_t *topic_elem = linked_list_get_if(&game.event_bus.topics, condition_is_topic_id, &id);
|
||||
if(!topic_elem) return_failure_int;
|
||||
|
||||
topic_t *topic = topic_elem->data;
|
||||
|
||||
if(linked_list_remove_if(&topic->subscriptions, condition_is_callback, callback)) return_failure_int;
|
||||
if(linked_list_remove_if(&topic->subscriptions, condition_is_callback, &callback)) return_failure_int;
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -38,8 +38,8 @@ int asset_manager_init(void);
|
|||
int asset_manager_exit(void);
|
||||
int asset_manager_collect_garbage(void);
|
||||
|
||||
asset_t *asset_manager_load_asset(const char *asset_name, asset_type_t asset_type);
|
||||
int asset_manager_let_go_asset(const char *asset_name);
|
||||
asset_t *asset_manager_get_asset(const char *asset_name);
|
||||
asset_t *asset_manager_load_asset(char *asset_name, asset_type_t asset_type);
|
||||
int asset_manager_let_go_asset(char *asset_name);
|
||||
asset_t *asset_manager_get_asset(char *asset_name);
|
||||
|
||||
#endif // ASSET_MANAGER_H
|
||||
|
|
@ -4,7 +4,7 @@
|
|||
#include <stdarg.h>
|
||||
#include "linked_list.h"
|
||||
|
||||
typedef int (*callback_t)(va_list event_args, void *subscribtion_args);
|
||||
typedef int (*callback_t)(void *event_arg, void *subscribtion_arg);
|
||||
|
||||
typedef struct subscription_t {
|
||||
callback_t callback;
|
||||
|
|
@ -32,7 +32,7 @@ int event_bus_new_topic(size_t id);
|
|||
int event_bus_remove_topic(size_t id);
|
||||
int event_bus_change_topic_id(size_t old_id, size_t new_id);
|
||||
|
||||
int event_bus_publish(size_t id, ...);
|
||||
int event_bus_publish(size_t id, void *arg);
|
||||
int event_bus_subscribe(size_t id, callback_t callback, void *data);
|
||||
int event_bus_unsubscribe(size_t id, callback_t callback);
|
||||
|
||||
|
|
|
|||
|
|
@ -59,11 +59,11 @@ typedef int (*deleter_t)(void *data);
|
|||
* bool name_of_your_condition(elem_t *elem, va_list);
|
||||
*
|
||||
* @param elem Processed element
|
||||
* @param args Arguments to pass to the function
|
||||
* @param arg Argument to pass to the function
|
||||
*
|
||||
* @return False, true for the element to be removed.
|
||||
*/
|
||||
typedef bool (*condition_t)(elem_t *elem, va_list args);
|
||||
typedef bool (*condition_t)(elem_t *elem, void *arg);
|
||||
|
||||
/**
|
||||
* @brief A type for action used for function like linked_list_for_each
|
||||
|
|
@ -73,11 +73,11 @@ typedef bool (*condition_t)(elem_t *elem, va_list args);
|
|||
* int name_of_your_condition(elem_t *elem, va_list);
|
||||
*
|
||||
* @param elem Processed element
|
||||
* @param args Arguments to pass to the function
|
||||
* @param arg Argument to pass to the function
|
||||
*
|
||||
* @return EXIT_SUCCESS, EXIT_FAILURE on error.
|
||||
*/
|
||||
typedef int (*action_t)(elem_t *elem, va_list args);
|
||||
typedef int (*action_t)(elem_t *elem, void *arg);
|
||||
|
||||
/**
|
||||
* @brief Base of linked lists.
|
||||
|
|
@ -244,7 +244,7 @@ int linked_list_remove(linked_list_t *linked_list, elem_t *elem);
|
|||
*
|
||||
* @return Pointer to element, NULL if no element verify the condition or if an error occurred.
|
||||
*/
|
||||
elem_t *linked_list_get_if(const linked_list_t *linked_list, const condition_t condition, ...);
|
||||
elem_t *linked_list_get_if(const linked_list_t *linked_list, const condition_t condition, void *arg);
|
||||
|
||||
/**
|
||||
* @brief Remove every elements that the condition verify, do nothing on error.
|
||||
|
|
@ -255,7 +255,7 @@ elem_t *linked_list_get_if(const linked_list_t *linked_list, const condition_t c
|
|||
*
|
||||
* @return EXIT_SUCCESS, EXIT_FAILURE on error.
|
||||
*/
|
||||
int linked_list_remove_if(linked_list_t *linked_list, const condition_t condition, ...);
|
||||
int linked_list_remove_if(linked_list_t *linked_list, const condition_t condition, void *arg);
|
||||
|
||||
/**
|
||||
* @brief Apply an action to every elements in the list.
|
||||
|
|
@ -267,19 +267,7 @@ int linked_list_remove_if(linked_list_t *linked_list, const condition_t conditio
|
|||
*
|
||||
* @return EXIT_SUCCESS, EXIT_FAILURE on error.
|
||||
*/
|
||||
int linked_list_for_each(const linked_list_t *linked_list, const action_t action, ...);
|
||||
|
||||
/**
|
||||
* @brief Apply an action to every elements in the list.
|
||||
* The action can be anything that doesn't destroy the element.
|
||||
*
|
||||
* @param linked_list Pointer to an linked list
|
||||
* @param action Action to apply
|
||||
* @param args Argument to pass to the action in the form of a va_list
|
||||
*
|
||||
* @return EXIT_SUCCESS, EXIT_FAILURE on error.
|
||||
*/
|
||||
int linked_list_for_eachv(const linked_list_t *linked_list, const action_t action, va_list args);
|
||||
int linked_list_for_each(const linked_list_t *linked_list, const action_t action, void *arg);
|
||||
|
||||
/**
|
||||
* @brief Do an insertion sort data of the given linked list.
|
||||
|
|
@ -290,6 +278,6 @@ int linked_list_for_eachv(const linked_list_t *linked_list, const action_t actio
|
|||
*
|
||||
* @return EXIT_SUCCESS, EXIT_FAILURE on error.
|
||||
*/
|
||||
void linked_list_insertion_sort(linked_list_t *linked_list, const condition_t condition, ...);
|
||||
void linked_list_insertion_sort(linked_list_t *linked_list, const condition_t condition, void *arg);
|
||||
|
||||
#endif // LINKED_LIST_H
|
||||
|
|
|
|||
|
|
@ -329,14 +329,11 @@ int linked_list_remove(linked_list_t *linked_list, elem_t *elem)
|
|||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
elem_t *linked_list_get_if(const linked_list_t *linked_list, const condition_t condition, ...)
|
||||
elem_t *linked_list_get_if(const linked_list_t *linked_list, const condition_t condition, void *arg)
|
||||
{
|
||||
assert("Linked list cannot be NULL" && linked_list);
|
||||
assert("Condition cannot be NULL" && condition);
|
||||
|
||||
va_list args;
|
||||
va_start(args, condition);
|
||||
|
||||
elem_t *current_elem = linked_list->first;
|
||||
elem_t *next_elem;
|
||||
|
||||
|
|
@ -344,35 +341,22 @@ elem_t *linked_list_get_if(const linked_list_t *linked_list, const condition_t c
|
|||
{
|
||||
next_elem = current_elem->next;
|
||||
|
||||
va_list args_copy;
|
||||
va_copy(args_copy, args);
|
||||
|
||||
if(condition(current_elem, args_copy))
|
||||
if(condition(current_elem, arg))
|
||||
{
|
||||
va_end(args_copy);
|
||||
va_end(args);
|
||||
|
||||
return current_elem;
|
||||
}
|
||||
|
||||
va_end(args_copy);
|
||||
|
||||
current_elem = next_elem;
|
||||
}
|
||||
|
||||
va_end(args);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int linked_list_remove_if(linked_list_t *linked_list, const condition_t condition, ...)
|
||||
int linked_list_remove_if(linked_list_t *linked_list, const condition_t condition, void *arg)
|
||||
{
|
||||
assert("Linked list cannot be NULL" && linked_list);
|
||||
assert("Condition cannot be NULL" && condition);
|
||||
|
||||
va_list args;
|
||||
va_start(args, condition);
|
||||
|
||||
elem_t *actual_elem = linked_list->first;
|
||||
elem_t *next_elem;
|
||||
|
||||
|
|
@ -380,64 +364,21 @@ int linked_list_remove_if(linked_list_t *linked_list, const condition_t conditio
|
|||
{
|
||||
next_elem = actual_elem->next;
|
||||
|
||||
va_list args_copy;
|
||||
va_copy(args_copy, args);
|
||||
|
||||
if(condition(actual_elem, args_copy))
|
||||
if(condition(actual_elem, arg))
|
||||
{
|
||||
if(linked_list_remove(linked_list, actual_elem))
|
||||
{
|
||||
va_end(args_copy);
|
||||
va_end(args);
|
||||
|
||||
return_failure_int;
|
||||
}
|
||||
}
|
||||
|
||||
va_end(args_copy);
|
||||
|
||||
actual_elem = next_elem;
|
||||
}
|
||||
|
||||
va_end(args);
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
int linked_list_for_each(const linked_list_t *linked_list, const action_t action, ...)
|
||||
{
|
||||
assert("Linked list cannot be NULL" && linked_list);
|
||||
assert("Action cannot be NULL" && action);
|
||||
|
||||
va_list args;
|
||||
va_start(args, action);
|
||||
|
||||
elem_t *current_elem = linked_list->first;
|
||||
|
||||
while(current_elem)
|
||||
{
|
||||
va_list args_copy;
|
||||
va_copy(args_copy, args);
|
||||
|
||||
if(action(current_elem, args_copy))
|
||||
{
|
||||
va_end(args_copy);
|
||||
va_end(args);
|
||||
|
||||
return_failure_int;
|
||||
}
|
||||
|
||||
va_end(args_copy);
|
||||
|
||||
current_elem = current_elem->next;
|
||||
}
|
||||
|
||||
va_end(args);
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
int linked_list_for_eachv(const linked_list_t *linked_list, const action_t action, va_list args)
|
||||
int linked_list_for_each(const linked_list_t *linked_list, const action_t action, void *arg)
|
||||
{
|
||||
assert("Linked list cannot be NULL" && linked_list);
|
||||
assert("Action cannot be NULL" && action);
|
||||
|
|
@ -446,19 +387,11 @@ int linked_list_for_eachv(const linked_list_t *linked_list, const action_t actio
|
|||
|
||||
while(current_elem)
|
||||
{
|
||||
va_list args_copy;
|
||||
va_copy(args_copy, args);
|
||||
|
||||
if(action(current_elem, args_copy))
|
||||
if(action(current_elem, arg))
|
||||
{
|
||||
va_end(args_copy);
|
||||
va_end(args);
|
||||
|
||||
return_failure_int;
|
||||
}
|
||||
|
||||
va_end(args_copy);
|
||||
|
||||
current_elem = current_elem->next;
|
||||
}
|
||||
|
||||
|
|
@ -472,14 +405,11 @@ static inline void swap_elems_data(elem_t *elem_a, elem_t *elem_b)
|
|||
elem_b->data = tmp_data;
|
||||
}
|
||||
|
||||
void linked_list_insertion_sort(linked_list_t *linked_list, const condition_t condition, ...)
|
||||
void linked_list_insertion_sort(linked_list_t *linked_list, const condition_t condition, void *arg)
|
||||
{
|
||||
assert("Linked list cannot be NULL" && linked_list);
|
||||
assert("Condition cannot be NULL" && condition);
|
||||
|
||||
va_list args;
|
||||
va_start(args, condition);
|
||||
|
||||
elem_t *actual_elem = linked_list->first;
|
||||
elem_t *next_elem;
|
||||
|
||||
|
|
@ -487,18 +417,11 @@ void linked_list_insertion_sort(linked_list_t *linked_list, const condition_t co
|
|||
{
|
||||
next_elem = actual_elem->next;
|
||||
|
||||
va_list args_copy;
|
||||
va_copy(args_copy, args);
|
||||
|
||||
if(condition(actual_elem, args_copy))
|
||||
if(condition(actual_elem, arg))
|
||||
{
|
||||
swap_elems_data(actual_elem, next_elem);
|
||||
}
|
||||
|
||||
va_end(args_copy);
|
||||
|
||||
actual_elem = next_elem;
|
||||
}
|
||||
|
||||
va_end(args);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue