mrumtl

Describe materials that vary spectrally
git clone git://git.meso-star.fr/mrumtl.git
Log | Files | Refs | README | LICENSE

commit 4ab084c8678074ec4c532ebc4c3e8fcd7de2e783
parent 49413c5d9703d1573ed52b9d5c8fb676e95fb3f2
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Thu,  7 Jul 2022 11:45:09 +0200

Upd mrumtl_create function profile

Diffstat:
Msrc/mrumtl.c | 34+++++++++++++++++++---------------
Msrc/mrumtl.h | 23+++++++++++++++--------
Msrc/test_mrumtl.c | 23++++++++++++++++-------
Msrc/test_mrumtl_band.c | 4+++-
Msrc/test_mrumtl_wlen.c | 4+++-
5 files changed, 56 insertions(+), 32 deletions(-)

diff --git a/src/mrumtl.c b/src/mrumtl.c @@ -91,6 +91,13 @@ struct mrumtl { /******************************************************************************* * Helper functions ******************************************************************************/ +static INLINE res_T +check_mrumtl_create_args(const struct mrumtl_create_args* args) +{ + /* Nothing to check. Only return RES_BAD_ARG if args is NULL */ + return args ? RES_OK : RES_BAD_ARG; +} + static void print_info(const char* msg, void* ctx) { @@ -826,27 +833,24 @@ release_mrumtl(ref_T* ref) ******************************************************************************/ res_T mrumtl_create - (struct logger* logger, /* NULL <=> use default logger */ - struct mem_allocator* mem_allocator, - const int verbose, /* Verbosity level */ + (const struct mrumtl_create_args* args, struct mrumtl** out_mrumtl) { struct mrumtl* mrumtl = NULL; struct mem_allocator* allocator = NULL; res_T res = RES_OK; - if(!out_mrumtl) { - res = RES_BAD_ARG; - goto error; - } + if(!out_mrumtl) { res = RES_BAD_ARG; goto error; } + res = check_mrumtl_create_args(args); + if(res != RES_OK) goto error; - allocator = mem_allocator ? mem_allocator : &mem_default_allocator; + allocator = args->allocator ? args->allocator : &mem_default_allocator; mrumtl = MEM_CALLOC(allocator, 1, sizeof(*mrumtl)); if(!mrumtl) { - if(verbose) { + if(args->verbose) { #define ERR_STR "Could not allocate the MRUMTL handler.\n" - if(logger) { - logger_print(logger, LOG_ERROR, ERR_STR); + if(args->logger) { + logger_print(args->logger, LOG_ERROR, ERR_STR); } else { fprintf(stderr, MSG_ERROR_PREFIX ERR_STR); } @@ -857,18 +861,18 @@ mrumtl_create } ref_init(&mrumtl->ref); mrumtl->allocator = allocator; - mrumtl->verbose = verbose; + mrumtl->verbose = args->verbose; darray_brdf_band_init(mrumtl->allocator, &mrumtl->brdf_bands); darray_brdf_wlen_init(mrumtl->allocator, &mrumtl->brdf_wlens); mrumtl->brdf_list_type = BRDF_LIST_NONE__; str_init(mrumtl->allocator, &mrumtl->name); - if(logger) { - mrumtl->logger = logger; + if(args->logger) { + mrumtl->logger = args->logger; } else { res = setup_default_logger(mrumtl->allocator, &mrumtl->logger__); if(res != RES_OK) { - if(verbose) { + if(args->verbose) { fprintf(stderr, MSG_ERROR_PREFIX "Could not setup the MRUMTL logger.\n"); } diff --git a/src/mrumtl.h b/src/mrumtl.h @@ -27,8 +27,8 @@ #define MRUMTL_API extern IMPORT_SYM #endif -/* Helper macro that asserts if the invocation of the htcp function `Func' - * returns an error. One should use this macro on htcp function calls for +/* Helper macro that asserts if the invocation of the mrumtl function `Func' + * returns an error. One should use this macro on mrumtl function calls for * which no explicit error checking is performed */ #ifndef NDEBUG #define MRUMTL(Func) ASSERT(mrumtl_ ## Func == RES_OK) @@ -36,15 +36,24 @@ #define MRUMTL(Func) mrumtl_ ## Func #endif +/* Forward declaration of external data types */ +struct logger; +struct mem_allocator; + enum mrumtl_brdf_type { MRUMTL_BRDF_LAMBERTIAN, MRUMTL_BRDF_SPECULAR, MRUMTL_BRDF_NONE__ }; -/* Forward declaration of external data types */ -struct logger; -struct mem_allocator; +struct mrumtl_create_args { + struct logger* logger; /* NULL <=> use default logger */ + struct mem_allocator* allocator; /* NULL <=> use default allocator */ + int verbose; /* Verbosity level */ +}; +#define MRUMTL_CREATE_ARGS_DEFAULT__ {NULL, NULL, 0} +static const struct mrumtl_create_args MRUMTL_CREATE_ARGS_DEFAULT = + MRUMTL_CREATE_ARGS_DEFAULT__; /* Forward declaration of opaque data types */ struct mrumtl; @@ -57,9 +66,7 @@ BEGIN_DECLS ******************************************************************************/ MRUMTL_API res_T mrumtl_create - (struct logger* logger, /* NULL <=> use default logger */ - struct mem_allocator* allocator, /* NULL <=> use default allocator */ - const int verbose, /* Verbosity level */ + (const struct mrumtl_create_args* args, struct mrumtl** mrumtl); MRUMTL_API res_T diff --git a/src/test_mrumtl.c b/src/test_mrumtl.c @@ -27,7 +27,9 @@ log_stream(const char* msg, void* ctx) int main(int argc, char** argv) { + struct mem_allocator allocator; struct logger logger; + struct mrumtl_create_args args = MRUMTL_CREATE_ARGS_DEFAULT; struct mrumtl* mrumtl; FILE* fp; (void)argc, (void)argv; @@ -41,9 +43,11 @@ main(int argc, char** argv) fprintf(fp, "0.2 lambertian 0.2\n"); fprintf(fp, "3 lambertian 0.314\n"); fprintf(fp, "4 specular 0.01\n"); + rewind(fp); - CHK(mrumtl_create(NULL, NULL, 0, NULL) == RES_BAD_ARG); - CHK(mrumtl_create(NULL, NULL, 0, &mrumtl) == RES_OK); + CHK(mrumtl_create(NULL, &mrumtl) == RES_BAD_ARG); + CHK(mrumtl_create(&args, NULL) == RES_BAD_ARG); + CHK(mrumtl_create(&args, &mrumtl) == RES_OK); CHK(mrumtl_ref_get(NULL) == RES_BAD_ARG); CHK(mrumtl_ref_get(mrumtl) == RES_OK); @@ -51,7 +55,10 @@ main(int argc, char** argv) CHK(mrumtl_ref_put(mrumtl) == RES_OK); CHK(mrumtl_ref_put(mrumtl) == RES_OK); - CHK(mrumtl_create(NULL, &mem_default_allocator, 1, &mrumtl) == RES_OK); + CHK(mem_init_proxy_allocator(&allocator, &mem_default_allocator) == RES_OK); + args.allocator = &allocator; + args.verbose = 1; + CHK(mrumtl_create(&args, &mrumtl) == RES_OK); CHK(mrumtl_ref_put(mrumtl) == RES_OK); CHK(logger_init(&mem_default_allocator, &logger) == RES_OK); @@ -59,21 +66,23 @@ main(int argc, char** argv) logger_set_stream(&logger, LOG_ERROR, log_stream, NULL); logger_set_stream(&logger, LOG_WARNING, log_stream, NULL); - CHK(mrumtl_create(&logger, &mem_default_allocator, 0, &mrumtl) == RES_OK); + args.logger = &logger; + args.verbose = 0; + CHK(mrumtl_create(&args, &mrumtl) == RES_OK); CHK(mrumtl_load(NULL, "my_mat.mrumtl") == RES_BAD_ARG); CHK(mrumtl_load(mrumtl, NULL) == RES_BAD_ARG); CHK(mrumtl_load(mrumtl, "undefined_file") == RES_IO_ERR); CHK(mrumtl_load(mrumtl, "my_mat.mrumtl") == RES_OK); CHK(mrumtl_ref_put(mrumtl) == RES_OK); - rewind(fp); - CHK(mrumtl_create(NULL, &mem_default_allocator, 1, &mrumtl) == RES_OK); + args.allocator = NULL; + CHK(mrumtl_create(&args, &mrumtl) == RES_OK); CHK(mrumtl_load_stream(NULL, fp, NULL) == RES_BAD_ARG); CHK(mrumtl_load_stream(mrumtl, NULL, NULL) == RES_BAD_ARG); CHK(mrumtl_load_stream(mrumtl, fp, NULL) == RES_OK); - CHK(mrumtl_ref_put(mrumtl) == RES_OK); + mem_shutdown_proxy_allocator(&allocator); fclose(fp); logger_release(&logger); CHK(mem_allocated_size() == 0); diff --git a/src/test_mrumtl_band.c b/src/test_mrumtl_band.c @@ -318,10 +318,12 @@ check_fetch(struct mrumtl* mrumtl) int main(int argc, char** argv) { + struct mrumtl_create_args args = MRUMTL_CREATE_ARGS_DEFAULT; struct mrumtl* mrumtl = NULL; (void)argc, (void)argv; - CHK(mrumtl_create(NULL, NULL, 1, &mrumtl) == RES_OK); + args.verbose = 1; + CHK(mrumtl_create(&args, &mrumtl) == RES_OK); check_load(mrumtl); check_fetch(mrumtl); diff --git a/src/test_mrumtl_wlen.c b/src/test_mrumtl_wlen.c @@ -248,10 +248,12 @@ check_fetch(struct mrumtl* mrumtl) int main(int argc, char** argv) { + struct mrumtl_create_args args = MRUMTL_CREATE_ARGS_DEFAULT; struct mrumtl* mrumtl = NULL; (void)argc, (void)argv; - CHK(mrumtl_create(NULL, NULL, 1, &mrumtl) == RES_OK); + args.verbose = 1; + CHK(mrumtl_create(&args, &mrumtl) == RES_OK); check_load(mrumtl); check_fetch(mrumtl);