Mon, 18 Aug 2025 23:11:50 +0200
convert behavior list to a behavior map
prepares the by-name lookup functions for behaviors
src/ascension/behavior.h | file | annotate | diff | comparison | revisions | |
src/ascension/scene_node.h | file | annotate | diff | comparison | revisions | |
src/ascension/util.h | file | annotate | diff | comparison | revisions | |
src/behavior.c | file | annotate | diff | comparison | revisions | |
src/scene.c | file | annotate | diff | comparison | revisions | |
src/scene_node.c | file | annotate | diff | comparison | revisions | |
src/util.c | file | annotate | diff | comparison | revisions |
--- a/src/ascension/behavior.h Sat Aug 16 22:59:49 2025 +0200 +++ b/src/ascension/behavior.h Mon Aug 18 23:11:50 2025 +0200 @@ -92,14 +92,6 @@ void asc_behavior_trigger(AscBehavior *behavior); /** - * Assigns a name to a behavior. - * - * @param behavior the behavior - * @param name the new name - */ -void asc_behavior_name(AscBehavior *behavior, const char *name); - -/** * Returns the name of a behavior. * * @param behavior the behavior
--- a/src/ascension/scene_node.h Sat Aug 16 22:59:49 2025 +0200 +++ b/src/ascension/scene_node.h Mon Aug 18 23:11:50 2025 +0200 @@ -29,7 +29,7 @@ #define ASCENSION_SCENE_NODE_H #include <cx/allocator.h> -#include <cx/list.h> +#include <cx/map.h> #include <cx/string.h> #include "datatypes.h" @@ -58,10 +58,10 @@ AscSceneNode *last_child; cxmutstr name; /** - * List of AscBehavior structs. - * Not a pointer list! + * Maps name → AscBehavior. + * Not a pointer map! */ - CxList *behaviors; + CxMap *behaviors; asc_scene_node_destroy_func destroy_func; asc_scene_node_update_func update_func; asc_scene_node_draw_func draw_func;
--- a/src/ascension/util.h Sat Aug 16 22:59:49 2025 +0200 +++ b/src/ascension/util.h Mon Aug 18 23:11:50 2025 +0200 @@ -30,7 +30,7 @@ #include <cx/string.h> -cxmutstr asc_util_gen_name(void *obj); +cxmutstr asc_util_gen_name(const char *prefix); #define asc_util_check_and_set_impl if (*var == new_value) return false; *var = new_value; return true static inline bool asc_util_check_and_set_float(float *var, float new_value) {
--- a/src/behavior.c Sat Aug 16 22:59:49 2025 +0200 +++ b/src/behavior.c Mon Aug 18 23:11:50 2025 +0200 @@ -31,7 +31,7 @@ #include "ascension/util.h" #include "ascension/error.h" -#include <cx/array_list.h> +#include <cx/hash_map.h> #include <cx/tree.h> #include <assert.h> @@ -45,17 +45,20 @@ } } -static CxList *asc_behavior_new_list(void) { - CxList *list = cxArrayListCreate(NULL, NULL, sizeof(AscBehavior), 4); - cxDefineDestructor(list, asc_behavior_destroy); - return list; +static CxMap *asc_behavior_new_map(void) { + CxMap *map = cxHashMapCreateSimple(sizeof(AscBehavior)); + cxDefineDestructor(map, asc_behavior_destroy); + return map; } AscBehavior *asc_behavior_add_(AscSceneNode *node, struct asc_behavior_create_args args) { if (node->behaviors == NULL) { - node->behaviors = asc_behavior_new_list(); + node->behaviors = asc_behavior_new_map(); } - AscBehavior *behavior = cxListEmplace(node->behaviors); + cxmutstr name = args.name == NULL + ? asc_util_gen_name("behavior") + : cx_mutstr(strdup(args.name)); + AscBehavior *behavior = cxMapEmplace(node->behaviors, name); assert(behavior != NULL); behavior->enabled = true; behavior->killed = false; @@ -65,7 +68,7 @@ behavior->data = args.data; behavior->interval = args.interval; behavior->last_execution = 0; - asc_behavior_name(behavior, args.name); + behavior->name = name; asc_dprintf("Create behavior: %"CX_PRIstr, CX_SFMT(behavior->name)); return behavior; } @@ -84,16 +87,6 @@ behavior->last_execution = asc_context.total_nanos; } -void asc_behavior_name(AscBehavior *behavior, const char *name) { - cx_strfree(&behavior->name); - if (name == NULL) { - behavior->name = asc_util_gen_name(behavior); - } else { - behavior->name.ptr = strdup(name); - behavior->name.length = strlen(name); - } -} - cxstring asc_behavior_get_name(const AscBehavior *behavior) { assert(behavior != NULL); return cx_strcast(behavior->name); @@ -102,14 +95,14 @@ // TODO: add asc_behavior_find() and asc_behavior_find_global() void asc_behavior_enable_all(AscSceneNode *node) { - CxIterator iter = cxListIterator(node->behaviors); + CxMapIterator iter = cxMapIteratorValues(node->behaviors); cx_foreach(AscBehavior*, behavior, iter) { behavior->enabled = true; } } void asc_behavior_disable_all(AscSceneNode *node) { - CxIterator iter = cxListIterator(node->behaviors); + CxMapIterator iter = cxMapIteratorValues(node->behaviors); cx_foreach(AscBehavior*, behavior, iter) { behavior->enabled = false; }
--- a/src/scene.c Sat Aug 16 22:59:49 2025 +0200 +++ b/src/scene.c Mon Aug 18 23:11:50 2025 +0200 @@ -47,7 +47,7 @@ scene->internal.render_groups[i] = cxArrayListCreateSimple(CX_STORE_POINTERS, 32); } if (name == NULL) { - scene->name = asc_util_gen_name(scene); + scene->name = asc_util_gen_name("scene"); } else { scene->name.ptr = strdup(name); scene->name.length = strlen(name); @@ -73,7 +73,7 @@ offsetof(AscSceneNode, next) ); cx_foreach(AscSceneNode*, node, iter) { - CxIterator behavior_iter = cxListMutIterator(node->behaviors); + CxMapIterator behavior_iter = cxMapMutIteratorValues(node->behaviors); cx_foreach(AscBehavior*, behavior, behavior_iter) { if (behavior->enabled) { asc_behavior_trigger(behavior);
--- a/src/scene_node.c Sat Aug 16 22:59:49 2025 +0200 +++ b/src/scene_node.c Mon Aug 18 23:11:50 2025 +0200 @@ -53,7 +53,7 @@ } static void asc_scene_node_destroy(AscSceneNode *node) { - cxListFree(node->behaviors); + cxMapFree(node->behaviors); if (node->user_data_free_func != NULL) { node->user_data_free_func((void*)node->user_data_allocator, node->user_data); }
--- a/src/util.c Sat Aug 16 22:59:49 2025 +0200 +++ b/src/util.c Mon Aug 18 23:11:50 2025 +0200 @@ -31,7 +31,7 @@ #include <inttypes.h> #include <assert.h> -cxmutstr asc_util_gen_name(void *obj) { - assert(obj != NULL); - return cx_asprintf("%" PRIxPTR, (uintptr_t)obj); +cxmutstr asc_util_gen_name(const char *prefix) { + static unsigned counter = 0; + return cx_asprintf("%s_gen%u", prefix, ++counter); }