rnsf

Define and load a phase function data format
git clone git://git.meso-star.fr/rnsf.git
Log | Files | Refs | README | LICENSE

commit 14d833ff0970e3255de48bb50a57ecfbc6c27e46
parent b8b6a3cb74cc201ff11c80cbef0ac934a7d5ea80
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Mon, 20 Jun 2022 14:58:10 +0200

Implemente rnsf_create and rnsf_ref_<get|put>

Diffstat:
Acmake/CMakeLists.txt | 125+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/rnsf.c | 116+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/rnsf_c.h | 45+++++++++++++++++++++++++++++++++++++++++++++
Asrc/rnsf_log.c | 134+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/rnsf_log.h | 78++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/rnsf_phase_fn.h | 180+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
6 files changed, 678 insertions(+), 0 deletions(-)

diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt @@ -0,0 +1,125 @@ +# Copyright (C) 2022 GSMA - Université de Reims Champgne-Ardenne, CNRS +# Copyright (C) 2022 IPGP, Université Paris Cité, CNRS +# Copyright (C) 2022 LAPLACE - Université de Toulouse, CNRS, INPT, UPS +# Copyright (C) 2022 LATMOS/IPSL - UVSQ, Université Paris-Saclay, +# Sorbonne Université, CNRS +# Copyright (C) 2022 LESIA - Observatoire de Paris, Université PSL, +# Sorbonne Université, Université Paris Cité +# Copyright (C) 2022 LMD/IPSL - Sorbonne Université, Université PSL, +# Ecole Polytechnique, Institut Polytechnique de Paris, +# CNRS +# Copyright (C) 2022 |Meso|Star> (contact@meso-star.com) +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +cmake_minimum_required(VERSION 3.1) +project(rnsf C) +enable_testing() + +set(RNSF_SOURCE_DIR ${PROJECT_SOURCE_DIR}/../src) +option(NO_TEST "Do not build tests" OFF) + +################################################################################ +# Check dependencies +################################################################################ +find_package(RCMake 0.4 REQUIRED) +find_package(RSys 0.9 REQUIRED) + +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${RCMAKE_SOURCE_DIR}) +include(rcmake) +include(rcmake_runtime) + +include_directories(${RSys_INCLUDE_DIR}) + +################################################################################ +# Configure and define targets +################################################################################ +set(VERSION_MAJOR 0) +set(VERSION_MINOR 0) +set(VERSION_PATCH 0) +set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}) + +set(RNSF_FILES_SRC + rnsf.c + rnsf_log.c) +set(RNSF_FILES_INC + rnsf_c.h + rnsf_log.h + rnsf_phase_fn.h) +set(RNSF_FILES_INC_API rnsf.h) +set(RNSF_FILES_DOC COPYING README.md) + +# Prepend each file in the `RNSF_FILES_<SRC|INC>' list by `RNSF_SOURCE_DIR' +rcmake_prepend_path(RNSF_FILES_SRC ${RNSF_SOURCE_DIR}) +rcmake_prepend_path(RNSF_FILES_INC ${RNSF_SOURCE_DIR}) +rcmake_prepend_path(RNSF_FILES_INC_API ${RNSF_SOURCE_DIR}) +rcmake_prepend_path(RNSF_FILES_DOC ${PROJECT_SOURCE_DIR}/../) + +add_library(rnsf SHARED ${RNSF_FILES_SRC} ${RNSF_FILES_INC} ${RNSF_FILES_INC_API}) +target_link_libraries(rnsf RSys) + +set_target_properties(rnsf PROPERTIES + DEFINE_SYMBOL RNSF_SHARED_BUILD + VERSION ${VERSION} + SOVERSION ${VERSION_MAJOR}) + +rcmake_setup_devel(rnsf RNSF ${VERSION} rad-net/rnsf_version.h) + +################################################################################ +# Add tests +################################################################################ +if(NOT NO_TEST) + function(build_test _name) + add_executable(${_name} + ${RNSF_SOURCE_DIR}/${_name}.c) + target_link_libraries(${_name} rnsf RSys) + endfunction() + + function(new_test _name) + build_test(${_name}) + add_test(${_name} ${_name}) + endfunction() +endif() + +################################################################################ +# Man pages +############################################################################### +find_program(SCDOC NAMES scdoc) +if(NOT SCDOC) + message(WARNING + "The `scdoc' program is missing. " + "The rnsf man page cannot be generated.") +else() + set(_src ${PROJECT_SOURCE_DIR}/../doc/rnsf.5.scd) + add_custom_command( + OUTPUT rnsf.5 + COMMAND ${SCDOC} < ${_src} > rnsf.5 + DEPENDS ${_src} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Buid ROFF man page rnsf.5" + VERBATIM) + add_custom_target(man-roff ALL DEPENDS rnsf.5) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/rnsf.5 DESTINATION share/man/man5) +endif() + +################################################################################ +# Define output & install directories +################################################################################ +install(TARGETS rnsf + ARCHIVE DESTINATION bin + LIBRARY DESTINATION lib + RUNTIME DESTINATION bin) +install(FILES ${RNSF_FILES_INC_API} DESTINATION include/rad-net) +install(FILES ${RNSF_FILES_DOC} DESTINATION share/doc/rnsf) + diff --git a/src/rnsf.c b/src/rnsf.c @@ -0,0 +1,116 @@ +/* Copyright (C) 2022 GSMA - Université de Reims Champgne-Ardenne, CNRS + * Copyright (C) 2022 IPGP, Université Paris Cité, CNRS + * Copyright (C) 2022 LAPLACE - Université de Toulouse, CNRS, INPT, UPS + * Copyright (C) 2022 LATMOS/IPSL - UVSQ, Université Paris-Saclay, + * Sorbonne Université, CNRS + * Copyright (C) 2022 LESIA - Observatoire de Paris, Université PSL, + * Sorbonne Université, Université Paris Cité + * Copyright (C) 2022 LMD/IPSL - Sorbonne Université, Université PSL, + * Ecole Polytechnique, Institut Polytechnique de Paris, + * CNRS + * Copyright (C) 2022 |Meso|Star> (contact@meso-star.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#include "rnsf.h" +#include "rnsf_c.h" +#include "rnsf_log.h" + +/******************************************************************************* + * Helper functions + ******************************************************************************/ +static INLINE res_T +check_rnsf_create_args(const struct rnsf_create_args* args) +{ + /* Nothing to check. Only return RES_BAD_ARG if args is NULL */ + return args ? RES_OK : RES_BAD_ARG; +} + +static void +release_rnsf(ref_T* ref) +{ + struct rnsf* rnsf = NULL; + ASSERT(ref); + rnsf = CONTAINER_OF(ref, struct rnsf, ref); + if(rnsf->logger == &rnsf->logger__) logger_release(&rnsf->logger__); + darray_phase_fn_release(&rnsf->phases); + MEM_RM(rnsf->allocator, rnsf); +} + +/******************************************************************************* + * Exported functions + ******************************************************************************/ +res_T +rnsf_create + (const struct rnsf_create_args* args, + struct rnsf** out_rnsf) +{ + struct rnsf* rnsf = NULL; + struct mem_allocator* allocator = NULL; + res_T res = RES_OK; + + if(!out_rnsf) { res = RES_BAD_ARG; goto error; } + res = check_rnsf_create_args(args); + if(res != RES_OK) goto error; + + allocator = args->allocator ? args->allocator : &mem_default_allocator; + rnsf = MEM_CALLOC(allocator, 1, sizeof(*rnsf)); + if(!rnsf) { + if(args->verbose) { + #define ERR_STR "Could not allocate the device of the "\ + "Rad-Net Scattering Function library.\n" + if(args->logger) { + logger_print(args->logger, LOG_ERROR, ERR_STR); + } else { + fprintf(stderr, MSG_ERROR_PREFIX ERR_STR); + } + #undef ERR_STR + } + res = RES_MEM_ERR; + goto error; + } + + ref_init(&rnsf->ref); + rnsf->allocator = allocator; + rnsf->verbose = args->verbose; + darray_phase_fn_init(allocator, &rnsf->phases); + if(args->logger) { + rnsf->logger = args->logger; + } else { + setup_log_default(rnsf); + } + +exit: + if(out_rnsf) *out_rnsf = rnsf ; + return res; +error: + if(rnsf) { RNSF(ref_put(rnsf)); rnsf = NULL; } + goto exit; +} + +res_T +rnsf_ref_get(struct rnsf* rnsf) +{ + if(!rnsf) return RES_BAD_ARG; + ref_get(&rnsf->ref); + return RES_OK; +} + +res_T +rnsf_ref_put(struct rnsf* rnsf) +{ + if(!rnsf) return RES_BAD_ARG; + ref_put(&rnsf->ref, release_rnsf); + return RES_OK; +} diff --git a/src/rnsf_c.h b/src/rnsf_c.h @@ -0,0 +1,45 @@ +/* Copyright (C) 2022 GSMA - Université de Reims Champgne-Ardenne, CNRS + * Copyright (C) 2022 IPGP, Université Paris Cité, CNRS + * Copyright (C) 2022 LAPLACE - Université de Toulouse, CNRS, INPT, UPS + * Copyright (C) 2022 LATMOS/IPSL - UVSQ, Université Paris-Saclay, + * Sorbonne Université, CNRS + * Copyright (C) 2022 LESIA - Observatoire de Paris, Université PSL, + * Sorbonne Université, Université Paris Cité + * Copyright (C) 2022 LMD/IPSL - Sorbonne Université, Université PSL, + * Ecole Polytechnique, Institut Polytechnique de Paris, + * CNRS + * Copyright (C) 2022 |Meso|Star> (contact@meso-star.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef RNSF_C_H +#define RNSF_C_H + +#include "rnsf_phase_fn.h" + +#include <rsys/mem_allocator.h> +#include <rsys/logger.h> +#include <rsys/ref_count.h> + +struct rnsf { + struct darray_phase_fn phases; + + int verbose; /* Verbosity level */ + struct logger* logger; + struct logger logger__; + struct mem_allocator* allocator; + ref_T ref; +}; + +#endif /* RNSF_C_H */ diff --git a/src/rnsf_log.c b/src/rnsf_log.c @@ -0,0 +1,134 @@ +/* Copyright (C) 2022 GSMA - Université de Reims Champgne-Ardenne, CNRS + * Copyright (C) 2022 IPGP, Université Paris Cité, CNRS + * Copyright (C) 2022 LAPLACE - Université de Toulouse, CNRS, INPT, UPS + * Copyright (C) 2022 LATMOS/IPSL - UVSQ, Université Paris-Saclay, + * Sorbonne Université, CNRS + * Copyright (C) 2022 LESIA - Observatoire de Paris, Université PSL, + * Sorbonne Université, Université Paris Cité + * Copyright (C) 2022 LMD/IPSL - Sorbonne Université, Université PSL, + * Ecole Polytechnique, Institut Polytechnique de Paris, + * CNRS + * Copyright (C) 2022 |Meso|Star> (contact@meso-star.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#include "rnsf_c.h" +#include "rnsf_log.h" + +#include <rsys/cstr.h> +#include <rsys/logger.h> + +#include <stdarg.h> + +/******************************************************************************* + * Helper functions + ******************************************************************************/ +static INLINE void +log_msg + (const struct rnsf* rnsf, + const enum log_type stream, + const char* msg, + va_list vargs) +{ + ASSERT(rnsf && msg); + if(rnsf->verbose) { + res_T res; (void)res; + res = logger_vprint(rnsf->logger, stream, msg, vargs); + ASSERT(res == RES_OK); + } +} + +static void +print_info(const char* msg, void* ctx) +{ + (void)ctx; + fprintf(stderr, MSG_INFO_PREFIX"%s", msg); +} + +static void +print_err(const char* msg, void* ctx) +{ + (void)ctx; + fprintf(stderr, MSG_ERROR_PREFIX"%s", msg); +} + +static void +print_warn(const char* msg, void* ctx) +{ + (void)ctx; + fprintf(stderr, MSG_WARNING_PREFIX"%s", msg); +} + +/******************************************************************************* + * Local functions + ******************************************************************************/ +res_T +setup_log_default(struct rnsf* rnsf) +{ + res_T res = RES_OK; + ASSERT(rnsf); + + res = logger_init(rnsf->allocator, &rnsf->logger__); + if(res != RES_OK) { + if(rnsf->verbose) { + fprintf(stderr, + MSG_ERROR_PREFIX + "Could not setup the default logger -- %s.\n", + res_to_cstr(res)); + } + goto error; + } + logger_set_stream(&rnsf->logger__, LOG_OUTPUT, print_info, NULL); + logger_set_stream(&rnsf->logger__, LOG_ERROR, print_err, NULL); + logger_set_stream(&rnsf->logger__, LOG_WARNING, print_warn, NULL); + rnsf->logger = &rnsf->logger__; + +exit: + return res; +error: + goto exit; +} + +void +log_info(const struct rnsf* rnsf, const char* msg, ...) +{ + va_list vargs_list; + ASSERT(rnsf && msg); + + va_start(vargs_list, msg); + log_msg(rnsf, LOG_OUTPUT, msg, vargs_list); + va_end(vargs_list); +} + +void +log_err(const struct rnsf* rnsf, const char* msg, ...) +{ + va_list vargs_list; + ASSERT(rnsf && msg); + + va_start(vargs_list, msg); + log_msg(rnsf, LOG_ERROR, msg, vargs_list); + va_end(vargs_list); +} + +void +log_warn(const struct rnsf* rnsf, const char* msg, ...) +{ + va_list vargs_list; + ASSERT(rnsf && msg); + + va_start(vargs_list, msg); + log_msg(rnsf, LOG_WARNING, msg, vargs_list); + va_end(vargs_list); +} diff --git a/src/rnsf_log.h b/src/rnsf_log.h @@ -0,0 +1,78 @@ +/* Copyright (C) 2022 GSMA - Université de Reims Champgne-Ardenne, CNRS + * Copyright (C) 2022 IPGP, Université Paris Cité, CNRS + * Copyright (C) 2022 LAPLACE - Université de Toulouse, CNRS, INPT, UPS + * Copyright (C) 2022 LATMOS/IPSL - UVSQ, Université Paris-Saclay, + * Sorbonne Université, CNRS + * Copyright (C) 2022 LESIA - Observatoire de Paris, Université PSL, + * Sorbonne Université, Université Paris Cité + * Copyright (C) 2022 LMD/IPSL - Sorbonne Université, Université PSL, + * Ecole Polytechnique, Institut Polytechnique de Paris, + * CNRS + * Copyright (C) 2022 |Meso|Star> (contact@meso-star.com) + * + * This program is free software: you can redismshbute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is dismshbuted in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef RNSF_LOG_H +#define RNSF_LOG_H + +#include <rsys/rsys.h> + +#define MSG_INFO_PREFIX "Rad-Net Scatt Func:\x1b[1m\x1b[32minfo\x1b[0m: " +#define MSG_ERROR_PREFIX "Rad-Net Scatt Func:\x1b[1m\x1b[31merror\x1b[0m: " +#define MSG_WARNING_PREFIX "Rad-Net Scat Func:\x1b[1m\x1b[33mwarning\x1b[0m: " + +struct rnsf; +struct logger; + +extern LOCAL_SYM res_T +setup_log_default + (struct rnsf* rnsf); + +/* Conditionally log a message on the LOG_OUTPUT stream of the rnsf logger, + * with respect to its verbose flag */ +extern LOCAL_SYM void +log_info + (const struct rnsf* rnsf, + const char* msg, + ...) +#ifdef COMPILER_GCC + __attribute((format(printf, 2, 3))) +#endif +; + +/* Conditionally log a message on the LOG_ERROR stream of the rnsf logger, + * with respect to its verbose flag */ +extern LOCAL_SYM void +log_err + (const struct rnsf* rnsf, + const char* msg, + ...) +#ifdef COMPILER_GCC + __attribute((format(printf, 2, 3))) +#endif +; + +/* Conditionally log a message on the LOG_WARNING stream of the rnsf logger, + * with respect to its verbose flag */ +extern LOCAL_SYM void +log_warn + (const struct rnsf* rnsf, + const char* msg, + ...) +#ifdef COMPILER_GCC + __attribute((format(printf, 2, 3))) +#endif +; + +#endif /* RNSF_LOG_H */ diff --git a/src/rnsf_phase_fn.h b/src/rnsf_phase_fn.h @@ -0,0 +1,180 @@ +/* Copyright (C) 2022 GSMA - Université de Reims Champgne-Ardenne, CNRS + * Copyright (C) 2022 IPGP, Université Paris Cité, CNRS + * Copyright (C) 2022 LAPLACE - Université de Toulouse, CNRS, INPT, UPS + * Copyright (C) 2022 LATMOS/IPSL - UVSQ, Université Paris-Saclay, + * Sorbonne Université, CNRS + * Copyright (C) 2022 LESIA - Observatoire de Paris, Université PSL, + * Sorbonne Université, Université Paris Cité + * Copyright (C) 2022 LMD/IPSL - Sorbonne Université, Université PSL, + * Ecole Polytechnique, Institut Polytechnique de Paris, + * CNRS + * Copyright (C) 2022 |Meso|Star> (contact@meso-star.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef RNSF_PHASE_FN_H +#define RNSF_PHASE_FN_H + +#include "rnsf.h" +#include <rsys/dynamic_array.h> + +struct phase_fn_hg { + double g; /* Asymmetric parameter in [-1, 1] */ +}; + +struct discrete_item { + double theta; /* In radian */ + double value; +}; + +/* Generate the dynamic array of discrete items */ +#define DARRAY_NAME discrete_item +#define DARRAY_DATA struct discrete_item +#include <rsys/dynamic_array.h> + +struct phase_fn_discrete { + struct darray_discrete_item items; +}; + +static INLINE res_T +phase_fn_discrete_init + (struct mem_allocator* allocator, + struct phase_fn_discrete* phase) +{ + ASSERT(phase); + darray_discrete_item_init(allocator, &phase->items); + return RES_OK; +} + +static INLINE void +phase_fn_discrete_release(struct phase_fn_discrete* phase) +{ + ASSERT(phase); + darray_discrete_item_release(&phase->items); +} + +static INLINE res_T +phase_fn_discrete_copy + (struct phase_fn_discrete* dst, + const struct phase_fn_discrete* src) +{ + ASSERT(src && dst); + return darray_discrete_item_copy(&dst->items, &src->items); +} + +static INLINE res_T +phase_fn_discrete_copy_and_release + (struct phase_fn_discrete* dst, + struct phase_fn_discrete* src) +{ + ASSERT(src && dst); + return darray_discrete_item_copy_and_release(&dst->items, &src->items); +} + +struct rnsf_phase_fn { + double wlen[2]; /* In nanometers */ + enum rnsf_phase_fn_type type; + union { + struct phase_fn_hg hg; + struct phase_fn_discrete discrete; + } param; +}; + +static INLINE res_T +phase_fn_init + (struct mem_allocator* allocator, + struct rnsf_phase_fn* phase) +{ + ASSERT(phase); + (void)allocator; + phase->wlen[0] = 0; + phase->wlen[1] = 0; + phase->type = RNSF_PHASE_FN_NONE__; + return RES_OK; +} + +static INLINE void +phase_fn_release(struct rnsf_phase_fn* phase) +{ + ASSERT(phase); + switch(phase->type) { + case RNSF_PHASE_FN_HG: + case RNSF_PHASE_FN_NONE__: + /* Do nothing */ + break; + case RNSF_PHASE_FN_DISCRETE: + phase_fn_discrete_release(&phase->param.discrete); + break; + default: FATAL("Unreachable code.\n"); break; + } +} + +static INLINE res_T +phase_fn_copy + (struct rnsf_phase_fn* dst, + const struct rnsf_phase_fn* src) +{ + res_T res = RES_OK; + dst->wlen[0] = src->wlen[0]; + dst->wlen[1] = src->wlen[1]; + dst->type = src->type; + switch(src->type) { + case RNSF_PHASE_FN_HG: + dst->param.hg.g = src->param.hg.g; + break; + case RNSF_PHASE_FN_DISCRETE: + res = phase_fn_discrete_copy + (&dst->param.discrete, + &src->param.discrete); + break; + case RNSF_PHASE_FN_NONE__: /* Do nothing */ break; + default: FATAL("Unreachable code.\n"); break; + } + return res; +} + +static INLINE res_T +phase_fn_copy_and_release + (struct rnsf_phase_fn* dst, + struct rnsf_phase_fn* src) +{ + res_T res = RES_OK; + dst->wlen[0] = src->wlen[0]; + dst->wlen[1] = src->wlen[1]; + dst->type = src->type; + switch(src->type) { + case RNSF_PHASE_FN_HG: + dst->param.hg.g = src->param.hg.g; + break; + case RNSF_PHASE_FN_DISCRETE: + res = phase_fn_discrete_copy_and_release + (&dst->param.discrete, + &src->param.discrete); + break; + case RNSF_PHASE_FN_NONE__: /* Do nothing */ break; + default: FATAL("Unreachable code.\n"); break; + } + return res; +} + +/* Generate the dynamic array of phase functions */ +#define DARRAY_NAME phase_fn +#define DARRAY_DATA struct rnsf_phase_fn +#define DARRAY_FUNCTOR_INIT phase_fn_init +#define DARRAY_FUNCTOR_RELEASE phase_fn_release +#define DARRAY_FUNCTOR_COPY phase_fn_copy +#define DARRAY_FUNCTOR_COPY_AND_RELEASE phase_fn_copy_and_release +#include <rsys/dynamic_array.h> + +#endif /* RNSF_PHASE_FN_H */