commit 03fdc536e376e12be60172cc0293adea915c4e7e
parent f258fc48fbe7fd7b13933413e0dbd2a99529a4b0
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Fri, 25 Oct 2019 16:39:20 +0200
Add a reserve API call
Diffstat:
5 files changed, 37 insertions(+), 3 deletions(-)
diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt
@@ -24,9 +24,9 @@ option(NO_TEST "Do not build tests" OFF)
# Check dependencies
################################################################################
find_package(RCMake 0.4 REQUIRED)
-find_package(Star2D 0.1 REQUIRED)
-find_package(RSys 0.6.1 REQUIRED)
-find_package(OpenMP 1.2 REQUIRED)
+find_package(Star2D 0.3.1 REQUIRED)
+find_package(RSys 0.8.1 REQUIRED)
+find_package(OpenMP 2.0 REQUIRED)
if(NOT NO_TEST)
find_package(StarSP 0.7 REQUIRED)
diff --git a/src/senc2d.h b/src/senc2d.h
@@ -150,6 +150,14 @@ senc2d_scene_create
const enum senc2d_convention convention,
struct senc2d_scene** scene);
+/* Reserve memory according to anticipated scene size. */
+SENC2D_API res_T
+senc2d_scene_reserve
+ (struct senc2d_scene* scene,
+ const unsigned vertices_count,
+ const unsigned triangles_count,
+ const unsigned media_count);
+
/* Add a new set of vertices and segments to the scene.
* Vertices can be duplicates and are deduplicated on the fly.
* Segments can be duplicates as long as they constantly define the same
diff --git a/src/senc2d_scene.c b/src/senc2d_scene.c
@@ -94,6 +94,28 @@ error:
}
res_T
+senc2d_scene_reserve
+ (struct senc2d_scene* scn,
+ const unsigned vertices_count,
+ const unsigned triangles_count,
+ const unsigned media_count)
+{
+ res_T res = RES_OK;
+ if(!scn) return RES_BAD_ARG;
+
+ OK(darray_position_reserve(&scn->vertices, vertices_count));
+ OK(darray_segment_in_reserve(&scn->segments_in, triangles_count));
+ OK(htable_vrtx_reserve(&scn->unique_vertices, vertices_count));
+ OK(htable_seg_reserve(&scn->unique_segments, triangles_count));
+ OK(darray_side_range_reserve(&scn->media_use, media_count));
+
+end:
+ return res;
+error:
+ goto end;
+}
+
+res_T
senc2d_scene_add_geometry
(struct senc2d_scene* scn,
const unsigned nsegs,
diff --git a/src/test_senc2d_many_enclosures.c b/src/test_senc2d_many_enclosures.c
@@ -94,6 +94,8 @@ main(int argc, char** argv)
&& sa_size(ctx.indices) / 2 < UINT_MAX);
circ_seg_count = (unsigned)sa_size(ctx.indices) / 2;
circ_vrtx_count = (unsigned)sa_size(ctx.positions) / 2;
+ CHK(senc2d_scene_reserve(scn, NB_CIRC * circ_vrtx_count, NB_CIRC * circ_seg_count, 0)
+ == RES_OK);
FOR_EACH(i, 0, NB_CIRC_1) {
double center_x = 2 * (1 + NB_CIRC_1) * (i - NB_CIRC_1 / 2);
FOR_EACH(j, 0, NB_CIRC_1) {
diff --git a/src/test_senc2d_many_segments.c b/src/test_senc2d_many_segments.c
@@ -92,6 +92,8 @@ main(int argc, char** argv)
&& sa_size(ctx.indices) / 2 < UINT_MAX);
circ_seg_count = (unsigned)sa_size(ctx.indices) / 2;
circ_vrtx_count = (unsigned)sa_size(ctx.positions) / 2;
+ CHK(senc2d_scene_reserve(scn, NB_CIRC * circ_vrtx_count, NB_CIRC * circ_seg_count, 0)
+ == RES_OK);
FOR_EACH(i, 0, NB_CIRC) {
m1 = i;
d2(ctx.offset, 0, i * 10);