convert behavior list to a behavior map default tip

Mon, 18 Aug 2025 23:11:50 +0200

author
Mike Becker <universe@uap-core.de>
date
Mon, 18 Aug 2025 23:11:50 +0200
changeset 266
a73674e99e62
parent 265
5c915d01bdc0

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

mercurial