commit 3e45e459760fcef1a34fa401a8b11055ffc11148
parent 3460dc23aedbce3e7b89fb69003f5fd0333537f7
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Tue, 10 Oct 2023 18:05:53 +0200
Add new API calls to attach custom data to geometries
Diffstat:
3 files changed, 70 insertions(+), 0 deletions(-)
diff --git a/src/scad.h b/src/scad.h
@@ -183,6 +183,22 @@ scad_geometry_get_count
(const struct scad_geometry* geom,
size_t* count);
+/* Attach some custom data `data' to geometry `geom'.
+ * If provided, release() is called when `geom' is released or if
+ * set_custom_data is called again. */
+SCAD_API res_T
+scad_geometry_set_custom_data
+ (struct scad_geometry* geom,
+ void (*release) (void* data), /* Can be NULL */
+ void* data); /* Can be NULL */
+
+/* Get the custom data attached to geometry `geom'.
+ * If set_custom_data has not been called before, return NULL. */
+SCAD_API res_T
+scad_geometry_get_custom_data
+ (struct scad_geometry* geom,
+ void** data);
+
/* Get a pointer to `geom's name.
* Note that this reference is only valid during the lifetime of `geom' (don't
* use name after deleting `geom') */
diff --git a/src/scad_geometry.c b/src/scad_geometry.c
@@ -294,6 +294,9 @@ geometry_release(ref_T* ref)
str_release(&geom->name);
n = htable_geometries_erase(&dev->allgeom, &geom);
ASSERT(n == 1); (void)n;
+ if(geom->release && geom->custom) {
+ (*geom->release)(geom->custom);
+ }
MEM_RM(allocator, geom);
}
@@ -438,6 +441,55 @@ error:
}
res_T
+scad_geometry_set_custom_data
+ (struct scad_geometry* geom,
+ void (*release) (void* data),
+ void* data)
+{
+ res_T res = RES_OK;
+
+ if(!geom) {
+ res = RES_BAD_ARG;
+ goto error;
+ }
+
+ ERR(check_device(FUNC_NAME));
+
+ geom->custom = data;
+ geom->release = release;
+
+exit:
+ return res;
+error:
+ goto exit;
+}
+
+res_T
+scad_geometry_get_custom_data
+ (struct scad_geometry* geom,
+ void** data)
+{
+ res_T res = RES_OK;
+
+ if(!geom || !data) {
+ res = RES_BAD_ARG;
+ goto error;
+ }
+
+ ERR(check_device(FUNC_NAME));
+
+ if(geom->release && geom->custom) {
+ (*geom->release)(geom->custom);
+ }
+ *data = geom->custom;
+
+exit:
+ return res;
+error:
+ goto exit;
+}
+
+res_T
scad_geometry_get_name
(const struct scad_geometry* geom,
const char** name)
diff --git a/src/scad_geometry.h b/src/scad_geometry.h
@@ -27,6 +27,8 @@ struct scad_geometry {
int* gmsh_dimTags;
size_t gmsh_dimTags_n;
struct str name;
+ void* custom;
+ void (*release) (void* data);
ref_T ref;
};