solstice

Compute collected power and efficiencies of a solar plant
git clone git://git.meso-star.com/solstice.git
Log | Files | Refs | README | LICENSE

commit b37b226deae42166df3e611f7ce791763a076346
parent aa873c3330a3282a67008c9d13b57c78b4558b5e
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Tue, 22 Nov 2016 11:53:28 +0100

Add and test the iterator on parsed materials

Diffstat:
Msrc/parser/solstice_parser.c | 18++++++++++++++++++
Msrc/parser/solstice_parser.h | 51+++++++++++++++++++++++++++++++++++++++++++++++++--
Msrc/parser/test_solstice_parser2.c | 18++++++++++++++++++
3 files changed, 85 insertions(+), 2 deletions(-)

diff --git a/src/parser/solstice_parser.c b/src/parser/solstice_parser.c @@ -3011,3 +3011,21 @@ solstice_parser_entity_iterator_end htable_str2sols_end(&parser->str2entities, &it->it__); } +void +solstice_parser_material_iterator_begin + (struct solstice_parser* parser, struct solstice_material_iterator* it) +{ + ASSERT(parser && it); + it->mtls__ = darray_material_cdata_get(&parser->mtls); + it->imtl__ = 0; +} + +void +solstice_parser_material_iterator_end + (struct solstice_parser* parser, struct solstice_material_iterator* it) +{ + ASSERT(parser && it); + it->mtls__ = darray_material_cdata_get(&parser->mtls); + it->imtl__ = darray_material_size_get(&parser->mtls); +} + diff --git a/src/parser/solstice_parser.h b/src/parser/solstice_parser.h @@ -26,6 +26,12 @@ struct solstice_entity_iterator { struct htable_str2sols_iterator it__; /* Internal data */ }; +struct solstice_material_iterator { + /* Internal data */ + const struct solstice_material* mtls__; + size_t imtl__; +}; + /******************************************************************************* * Solstice parser API. ******************************************************************************/ @@ -143,6 +149,9 @@ extern LOCAL_SYM const struct solstice_sun* solstice_parser_get_sun (const struct solstice_parser* parser); +/******************************************************************************* + * Entity interator + ******************************************************************************/ extern LOCAL_SYM void solstice_parser_entity_iterator_begin (struct solstice_parser* parser, @@ -162,8 +171,8 @@ solstice_entity_iterator_next(struct solstice_entity_iterator* it) static FINLINE int solstice_entity_iterator_eq - (struct solstice_entity_iterator* a, - struct solstice_entity_iterator* b) + (const struct solstice_entity_iterator* a, + const struct solstice_entity_iterator* b) { ASSERT(a && b); return htable_str2sols_iterator_eq(&a->it__, &b->it__); @@ -176,5 +185,43 @@ solstice_entity_iterator_get(struct solstice_entity_iterator* it) return *htable_str2sols_iterator_data_get(&it->it__); } +/******************************************************************************* + * Material iterator + ******************************************************************************/ +extern LOCAL_SYM void +solstice_parser_material_iterator_begin + (struct solstice_parser* parser, + struct solstice_material_iterator* it); + +extern LOCAL_SYM void +solstice_parser_material_iterator_end + (struct solstice_parser* parser, + struct solstice_material_iterator* it); + +static FINLINE void +solstice_material_iterator_next(struct solstice_material_iterator* it) +{ + ASSERT(it); + ++it->imtl__; +} + +static FINLINE int +solstice_material_iterator_eq + (const struct solstice_material_iterator* a, + const struct solstice_material_iterator* b) +{ + ASSERT(a && b); + return a->mtls__ == b->mtls__ && a->imtl__ == b->imtl__; +} + +static FINLINE struct solstice_material_id +solstice_material_iterator_get(struct solstice_material_iterator* it) +{ + struct solstice_material_id id; + ASSERT(it); + id.i = it->imtl__; + return id; +} + #endif /* SOLSTICE_PARSER_H */ diff --git a/src/parser/test_solstice_parser2.c b/src/parser/test_solstice_parser2.c @@ -23,9 +23,11 @@ main(int argc, char** argv) struct mem_allocator allocator; struct solstice_parser* parser; struct solstice_entity_iterator it, end; + struct solstice_material_iterator mtl_it, mtl_it_end; struct solstice_entity_id entity_id; struct solstice_object_id obj_id; struct solstice_geometry_id geom_id; + const struct solstice_material* mtls[2] = { NULL, NULL }; const struct solstice_entity* entity, *entity1a, *entity1b, *entity2, *entity3; const struct solstice_geometry* geom; const struct solstice_object* obj; @@ -36,6 +38,7 @@ main(int argc, char** argv) const struct solstice_material_mirror* mirror; const struct solstice_shape_sphere* sphere; const struct solstice_sun* sun; + size_t nmtls = 0; double tmp[3]; FILE* stream; @@ -74,6 +77,19 @@ main(int argc, char** argv) CHECK(solstice_parser_setup(parser, NULL, stream), RES_OK); CHECK(solstice_parser_load(parser), RES_OK); + solstice_parser_material_iterator_begin(parser, &mtl_it); + solstice_parser_material_iterator_end(parser, &mtl_it_end); + nmtls = 0; + while(!solstice_material_iterator_eq(&mtl_it, &mtl_it_end)) { + struct solstice_material_id mtl_id; + CHECK(nmtls < 2, 1); + mtl_id = solstice_material_iterator_get(&mtl_it); + solstice_material_iterator_next(&mtl_it); + mtls[nmtls] = solstice_parser_get_material(parser, mtl_id); + ++nmtls; + } + CHECK(nmtls == 2, 1); + solstice_parser_entity_iterator_begin(parser, &it); solstice_parser_entity_iterator_end(parser, &end); CHECK(solstice_entity_iterator_eq(&it, &end), 0); @@ -102,6 +118,7 @@ main(int argc, char** argv) mtl2 = solstice_parser_get_material_double_sided(parser, obj->mtl2); CHECK(mtl2->front.i, mtl2->back.i); mtl = solstice_parser_get_material(parser, mtl2->front); + CHECK(mtl == mtls[0] || mtl == mtls[1], 1); CHECK(mtl->type, SOLSTICE_MATERIAL_MATTE); matte = solstice_parser_get_material_matte(parser, mtl->data.matte); CHECK(matte->reflectivity, 1); @@ -126,6 +143,7 @@ main(int argc, char** argv) mtl2 = solstice_parser_get_material_double_sided(parser, obj->mtl2); CHECK(mtl2->front.i, mtl2->back.i); mtl = solstice_parser_get_material(parser, mtl2->front); + CHECK(mtl == mtls[0] || mtl == mtls[1], 1); CHECK(mtl->type, SOLSTICE_MATERIAL_MIRROR); mirror = solstice_parser_get_material_mirror(parser, mtl->data.mirror); CHECK(mirror->reflectivity, 0.9);