Removed variadic arguments from looping linked list functions.

This commit is contained in:
Ulysse Cura 2026-08-14 19:06:25 +02:00
parent 95167c91e8
commit a7e3c16ad9
7 changed files with 70 additions and 172 deletions

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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

View File

@ -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);

View File

@ -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

View File

@ -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);
}