2 Copyright (C) 2012 Modelon AB
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the BSD style license.
7 This program is distributed in the hope that it will be useful,
8 but WITHOUT ANY WARRANTY; without even the implied warranty of
9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 FMILIB_License.txt file for more details.
12 You should have received a copy of the FMILIB_License.txt file
13 along with this program. If not, contact Modelon AB <http://www.modelon.com>.
17 #include "fmi1_import_impl.h"
18 #include "fmi1_import_variable_list_impl.h"
20 fmi1_import_variable_list_t* fmi1_import_alloc_variable_list(fmi1_import_t* fmu, size_t size) {
21 jm_callbacks* cb = fmu->callbacks;
22 fmi1_import_variable_list_t* vl = (fmi1_import_variable_list_t*)cb->malloc(sizeof(fmi1_import_variable_list_t));
26 if(jm_vector_init(jm_voidp)(&vl->variables,size,cb) < size) {
27 fmi1_import_free_variable_list(vl);
33 void fmi1_import_free_variable_list(fmi1_import_variable_list_t* vl) {
36 cb = vl->variables.callbacks;
38 jm_vector_free_data(jm_voidp)(&vl->variables);
42 /* Get number of variables in a list */
43 size_t fmi1_import_get_variable_list_size(fmi1_import_variable_list_t* vl) {
45 return jm_vector_get_size(jm_voidp)(&vl->variables);
51 fmi1_import_variable_list_t* fmi1_import_clone_variable_list(fmi1_import_variable_list_t* vl) {
52 fmi1_import_variable_list_t* copy;
54 copy = fmi1_import_alloc_variable_list(vl->fmu, fmi1_import_get_variable_list_size(vl));
56 jm_vector_copy(jm_voidp)(©->variables, &vl->variables);
60 fmi1_import_variable_list_t* fmi1_import_join_var_list(fmi1_import_variable_list_t* a, fmi1_import_variable_list_t* b) {
61 size_t asize = fmi1_import_get_variable_list_size(a);
62 size_t bsize = fmi1_import_get_variable_list_size(b);
63 size_t joinSize = asize + bsize;
64 fmi1_import_variable_list_t* list = fmi1_import_alloc_variable_list(a->fmu,joinSize);
69 jm_vector_copy(jm_voidp)(&list->variables,&a->variables);
71 jm_vector_resize(jm_voidp)(&list->variables,joinSize);
72 memcpy((void*)jm_vector_get_itemp(jm_voidp)(&list->variables,asize), (void*)jm_vector_get_itemp(jm_voidp)(&b->variables,0), sizeof(jm_voidp)*bsize);
77 fmi1_import_variable_list_t* fmi1_import_create_var_list(fmi1_import_t* fmu,fmi1_import_variable_t* v) {
78 fmi1_import_variable_list_t* list = fmi1_import_alloc_variable_list(fmu,1);
82 jm_vector_set_item(jm_voidp)(&list->variables,0,v);
86 fmi1_import_variable_list_t* fmi1_import_append_to_var_list(fmi1_import_variable_list_t* list, fmi1_import_variable_t* v) {
87 fmi1_import_variable_list_t* out = fmi1_import_alloc_variable_list(list->fmu, fmi1_import_get_variable_list_size(list)+1);
89 jm_vector_copy(jm_voidp)(&out->variables,&list->variables);
90 jm_vector_push_back(jm_voidp)(&out->variables, v);
94 fmi1_import_variable_list_t* fmi1_import_prepend_to_var_list(fmi1_import_variable_list_t* list, fmi1_import_variable_t* v) {
95 size_t lsize = fmi1_import_get_variable_list_size(list);
96 fmi1_import_variable_list_t* out = fmi1_import_alloc_variable_list(list->fmu, lsize+1);
98 jm_vector_set_item(jm_voidp)(&out->variables,0,v);
99 memcpy((void*)jm_vector_get_itemp(jm_voidp)(&out->variables,1), (void*)jm_vector_get_itemp(jm_voidp)(&list->variables,0), sizeof(jm_voidp)*lsize);
103 jm_status_enu_t fmi1_import_var_list_push_back(fmi1_import_variable_list_t* list, fmi1_import_variable_t* v) {
104 if(!jm_vector_push_back(jm_voidp)(&list->variables, v)) return jm_status_error;
105 return jm_status_success;
108 /* Get a pointer to the list of the value references for all the variables */
109 const fmi1_value_reference_t* fmi1_import_get_value_referece_list(fmi1_import_variable_list_t* vl) {
111 jm_callbacks* cb = vl->fmu->callbacks;
112 size_t nv = fmi1_import_get_variable_list_size(vl);
113 unsigned i = (unsigned)nv;
115 vl->vr = (fmi1_value_reference_t*)cb->malloc(nv * sizeof(fmi1_value_reference_t));
117 for(i = 0; i < nv; i++) {
118 vl->vr[i] = fmi1_xml_get_variable_vr(fmi1_import_get_variable(vl, i));
126 /* Get a single variable from the list*/
127 fmi1_import_variable_t* fmi1_import_get_variable(fmi1_import_variable_list_t* vl, unsigned int index) {
128 if(index >= fmi1_import_get_variable_list_size(vl))
131 return (fmi1_import_variable_t*)jm_vector_get_item(jm_voidp)(&vl->variables, index);
134 /* Operations on variable lists. Every operation creates a new list. */
135 /* Select sub-lists */
136 fmi1_import_variable_list_t* fmi1_import_get_sublist(fmi1_import_variable_list_t* vl, unsigned int fromIndex, unsigned int toIndex) {
137 fmi1_import_variable_list_t* out;
139 if(fromIndex > toIndex) return 0;
140 if(toIndex >= fmi1_import_get_variable_list_size(vl)) return 0;
141 size = toIndex - fromIndex + 1;
142 out = fmi1_import_alloc_variable_list(vl->fmu, size);
144 for(i=0; i < size; i++) {
145 jm_vector_set_item(jm_voidp)(&out->variables, i, jm_vector_get_item(jm_voidp)(&vl->variables, fromIndex+i));
150 /* fmi1_import_filter_variables calls the provided 'filter' function on every variable in the list.
151 It returns a sub-list list with the variables for which filter returned non-zero value. */
152 fmi1_import_variable_list_t* fmi1_import_filter_variables(fmi1_import_variable_list_t* vl, fmi1_import_variable_filter_function_ft filter, void* context) {
155 fmi1_import_variable_list_t* out;
156 nv = fmi1_import_get_variable_list_size(vl);
158 if(i != nv) return 0; /* this is not really possible */
159 out = fmi1_import_alloc_variable_list(vl->fmu, 0);
160 if(!out) return 0; /* out of memory */
161 for(i=0; i < nv;i++) {
162 fmi1_import_variable_t* variable = fmi1_import_get_variable(vl, i);
163 if(filter(variable, context))
164 if(!jm_vector_push_back(jm_voidp)(&out->variables, variable))
168 fmi1_import_free_variable_list(out);