star-cad

Geometric operators for computer-aided design
git clone git://git.meso-star.fr/star-cad.git
Log | Files | Refs | README | LICENSE

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:
Msrc/scad.h | 16++++++++++++++++
Msrc/scad_geometry.c | 52++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/scad_geometry.h | 2++
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; };