void index_boolean_array(const boolean_array_t* source, const index_spec_t* source_spec, boolean_array_t* dest) { _index_t* idx_vec1; _index_t* idx_vec2; _index_t* idx_size; int j; int i; assert(base_array_ok(source)); assert(base_array_ok(dest)); assert(index_spec_ok(source_spec)); assert(index_spec_fit_base_array(source_spec,source)); for(i = 0, j = 0; i < source->ndims; ++i) { if((source_spec->index_type[i] == 'W') || (source_spec->index_type[i] == 'A')) { ++j; } } assert(j == dest->ndims); idx_vec1 = size_alloc(source->ndims); /*indices in the source array*/ idx_vec2 = size_alloc(dest->ndims); /* indices in the destination array*/ idx_size = size_alloc(source_spec->ndims); for(i = 0; i < source->ndims; ++i) { idx_vec1[i] = 0; } for(i = 0; i < source_spec->ndims; ++i) { if(source_spec->index[i]) { idx_size[i] = imax(source_spec->dim_size[i],1); } else { idx_size[i] = source->dim_size[i]; } } do { for(i = 0, j = 0; i < source->ndims; ++i) { if((source_spec->index_type[i] == 'W') || (source_spec->index_type[i] == 'A')) { idx_vec2[j] = idx_vec1[i]; j++; } } boolean_set(dest, calc_base_index(dest->ndims, idx_vec2, dest), boolean_get(*source, calc_base_index_spec(source->ndims, idx_vec1, source, source_spec))); } while(0 == next_index(source->ndims, idx_vec1, idx_size)); }
void indexed_assign_string_array(const string_array_t * source, string_array_t* dest, const index_spec_t* dest_spec) { _index_t* idx_vec1; _index_t* idx_vec2; _index_t* idx_size; int i,j; assert(base_array_ok(source)); assert(base_array_ok(dest)); assert(index_spec_ok(dest_spec)); assert(index_spec_fit_base_array(dest_spec, dest)); for(i = 0,j = 0; i < dest_spec->ndims; ++i) { if(dest_spec->dim_size[i] != 0) { ++j; } } assert(j == source->ndims); idx_vec1 = size_alloc(dest->ndims); idx_vec2 = size_alloc(source->ndims); idx_size = size_alloc(dest_spec->ndims); for(i = 0; i < dest_spec->ndims; ++i) { idx_vec1[i] = 0; if(dest_spec->index[i] != NULL) { idx_size[i] = imax(dest_spec->dim_size[i],1); } else { idx_size[i] = dest->dim_size[i]; } } do { for(i = 0, j = 0; i < dest_spec->ndims; ++i) { if(dest_spec->dim_size[i] != 0) { idx_vec2[j] = idx_vec1[i]; ++j; } } string_set(dest, calc_base_index_spec(dest->ndims, idx_vec1, dest, dest_spec), string_get(*source, calc_base_index(source->ndims, idx_vec2, source))); } while(0 == next_index(dest_spec->ndims, idx_vec1, idx_size)); }
/* Uses zero based indexing */ modelica_real *calc_real_index(int ndims, const _index_t *idx_vec, const real_array_t *arr) { return real_ptrget(arr, calc_base_index(ndims, idx_vec, arr)); }
/* Uses zero based indexing */ modelica_boolean *calc_boolean_index(int ndims, const _index_t *idx_vec, const boolean_array_t *arr) { return boolean_ptrget(arr, calc_base_index(ndims, idx_vec, arr)); }
/* Uses zero based indexing */ modelica_string *calc_string_index(int ndims, const _index_t *idx_vec, const string_array_t *arr) { return string_ptrget(arr, calc_base_index(ndims, idx_vec, arr)); }