commit 668c253f552fed1165dd95ee51ddcf1ecb55839c
parent c329a88d5ad9d982d50de47a914fea2423e3fe65
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Sat, 1 Oct 2022 13:23:58 +0200
Discrete phase function support
Diffstat:
1 file changed, 33 insertions(+), 18 deletions(-)
diff --git a/src/rnatm_properties.c b/src/rnatm_properties.c
@@ -310,47 +310,62 @@ static INLINE res_T
create_phase_fn_hg
(struct rnatm* atm,
const struct rnsf_phase_fn_hg* hg,
- struct ssf_phase** phase_fn)
+ struct ssf_phase** out_ssf_phase)
{
+ struct ssf_phase* ssf_phase = NULL;
res_T res = RES_OK;
- ASSERT(atm && hg && phase_fn);
+ ASSERT(atm && hg && out_ssf_phase);
- res = ssf_phase_create(atm->allocator, &ssf_phase_hg, phase_fn);
+ res = ssf_phase_create(atm->allocator, &ssf_phase_hg, &ssf_phase);
if(res != RES_OK) goto error;
- res = ssf_phase_hg_setup(*phase_fn, hg->g);
+ res = ssf_phase_hg_setup(ssf_phase, hg->g);
if(res != RES_OK) goto error;
exit:
+ *out_ssf_phase = ssf_phase;
return res;
error:
- if(*phase_fn) { SSF(phase_ref_put(*phase_fn)); *phase_fn = NULL; }
+ if(ssf_phase) { SSF(phase_ref_put(ssf_phase)); ssf_phase = NULL; }
goto exit;
}
+static void
+phase_fn_discrete_get_item
+ (const size_t iitem,
+ struct ssf_discrete_item* item,
+ void* context)
+{
+ const struct rnsf_phase_fn_discrete* discrete = context;
+ ASSERT(item && context && iitem < discrete->nitems);
+ item->theta = discrete->items[iitem].theta;
+ item->value = discrete->items[iitem].value;
+}
+
static INLINE res_T
create_phase_fn_discrete
(struct rnatm* atm,
- const struct rnsf_phase_fn_discrete* discrete,
- struct ssf_phase** phase_fn)
+ struct rnsf_phase_fn_discrete* discrete,
+ struct ssf_phase** out_ssf_phase)
{
- struct mem_allocator* allocator = NULL;
+ struct ssf_discrete_setup_args args = SSF_DISCRETE_SETUP_ARGS_NULL;
+ struct ssf_phase* ssf_phase = NULL;
res_T res = RES_OK;
- ASSERT(atm && discrete && phase_fn);
+ ASSERT(atm && discrete && out_ssf_phase);
- /* TODO speed up allocation by using a [per thread] fifo allocator */
- allocator = atm->allocator;
+ res = ssf_phase_create(atm->allocator, &ssf_phase_discrete, &ssf_phase);
+ if(res != RES_OK) goto error;
- VFATAL("%s: function not implemented\n", ARG1(FUNC_NAME));
- (void)allocator;
- (void)atm;
- (void)discrete;
- (void)phase_fn;
- goto error;
+ args.get_item = phase_fn_discrete_get_item;
+ args.context = discrete;
+ args.nitems = discrete->nitems;
+ res = ssf_phase_discrete_setup(ssf_phase, &args);
+ if(res != RES_OK) goto error;
exit:
+ *out_ssf_phase = ssf_phase;
return res;
error:
- if(*phase_fn) { SSF(phase_ref_put(*phase_fn)); *phase_fn = NULL; }
+ if(ssf_phase) { SSF(phase_ref_put(ssf_phase)); ssf_phase = NULL; }
goto exit;
}