45 #include "RTOp_obj_free_free.h"
49 #define MY_MIN(a,b) a < b ? a : b
53 struct RTOp_ROp_get_sub_vector_rng_t {
58 static int get_op_type_num_entries(
67 assert( num_indexes );
75 static int obj_create(
77 , RTOp_ReductTarget* obj )
79 *obj = malloc(
sizeof(
struct RTOp_ROp_get_sub_vector_rng_t));
83 static int extract_op_state(
88 ,RTOp_value_type value_data[]
90 ,RTOp_index_type index_data[]
92 ,RTOp_char_type char_data[]
95 const struct RTOp_ROp_get_sub_vector_rng_t *rng = NULL;
97 assert( num_values == 0 );
98 assert( num_indexes == 2 );
99 assert( num_chars == 0 );
100 rng = (
const struct RTOp_ROp_get_sub_vector_rng_t*)obj_data;
101 index_data[0] = rng->l;
102 index_data[1] = rng->u;
106 static int load_op_state(
110 ,
const RTOp_value_type value_data[]
112 ,
const RTOp_index_type index_data[]
114 ,
const RTOp_char_type char_data[]
118 struct RTOp_ROp_get_sub_vector_rng_t *rng = NULL;
120 assert( num_values == 0 );
121 assert( num_indexes == 2 );
122 assert( num_chars == 0 );
123 if(*obj_data == NULL)
124 *obj_data = malloc(
sizeof(
struct RTOp_ROp_get_sub_vector_rng_t));
125 rng = (
struct RTOp_ROp_get_sub_vector_rng_t*)*obj_data;
126 rng->l = index_data[0];
127 rng->u = index_data[1];
133 get_op_type_num_entries
143 static int get_targ_type_num_entries(
145 ,
const void* obj_data
151 const struct RTOp_ROp_get_sub_vector_rng_t *rng = NULL;
153 assert( num_values );
154 assert( num_indexes );
156 rng = (
const struct RTOp_ROp_get_sub_vector_rng_t*)obj_data;
157 *num_values = rng->u - rng->l + 1;
163 static int targ_obj_create(
165 , RTOp_ReductTarget* targ_obj )
167 const struct RTOp_ROp_get_sub_vector_rng_t *rng = NULL;
170 RTOp_index_type sub_dim = 0;
173 rng = (
const struct RTOp_ROp_get_sub_vector_rng_t*)obj_data;
174 sub_dim = rng->u - rng->l + 1;
176 *targ_obj = malloc(mem_size);
182 ,(
const RTOp_value_type*)malloc(sub_dim*
sizeof(RTOp_value_type))
186 vtbl->
obj_reinit( vtbl, obj_data, *targ_obj );
190 static int targ_obj_reinit(
192 , RTOp_ReductTarget targ_obj )
194 const struct RTOp_ROp_get_sub_vector_rng_t *rng = NULL;
196 RTOp_index_type sub_dim = 0;
197 RTOp_value_type *values = NULL;
198 register RTOp_index_type k;
201 rng = (
const struct RTOp_ROp_get_sub_vector_rng_t*)obj_data;
202 sub_dim = rng->u - rng->l + 1;
205 assert( sub_dim == sub_vec_targ->sub_dim );
206 assert( sub_vec_targ->values );
208 values = (RTOp_value_type*)sub_vec_targ->values;
209 for( k = 0; k < sub_dim; ++k )
214 static int targ_obj_free(
216 , RTOp_ReductTarget* targ_obj )
218 const struct RTOp_ROp_get_sub_vector_rng_t *rng = NULL;
220 RTOp_index_type sub_dim = 0;
223 rng = (
const struct RTOp_ROp_get_sub_vector_rng_t*)obj_data;
224 sub_dim = rng->u - rng->l + 1;
227 assert( sub_dim == sub_vec_targ->sub_dim );
228 assert( sub_vec_targ->values );
230 if( (
void*)sub_vec_targ->values )
231 free( (
void*)sub_vec_targ->values );
232 free( (
void*)sub_vec_targ );
233 *targ_obj = RTOp_REDUCT_OBJ_NULL;
237 static int targ_extract_state(
239 ,
const void * obj_data
242 ,RTOp_value_type value_data[]
244 ,RTOp_index_type index_data[]
246 ,RTOp_char_type char_data[]
249 const struct RTOp_ROp_get_sub_vector_rng_t *rng = NULL;
251 RTOp_index_type sub_dim = 0;
252 register RTOp_index_type k;
255 rng = (
const struct RTOp_ROp_get_sub_vector_rng_t*)obj_data;
256 sub_dim = rng->u - rng->l + 1;
260 assert( sub_dim == sub_vec_targ->sub_dim );
261 assert( sub_vec_targ->values );
263 assert( num_values == sub_dim );
264 assert( num_indexes == 2 );
265 assert( num_chars == 0 );
266 for( k = 0; k < sub_dim; ++k )
267 value_data[k] = sub_vec_targ->values[k];
268 index_data[0] = rng->l;
269 index_data[1] = rng->u;
273 static int targ_load_state(
275 ,
const void* obj_data
277 ,
const RTOp_value_type value_data[]
279 ,
const RTOp_index_type index_data[]
281 ,
const RTOp_char_type char_data[]
285 const struct RTOp_ROp_get_sub_vector_rng_t *rng = NULL;
287 RTOp_index_type sub_dim = 0;
288 RTOp_value_type *values = NULL;
289 register RTOp_index_type k;
292 rng = (
const struct RTOp_ROp_get_sub_vector_rng_t*)obj_data;
293 sub_dim = rng->u - rng->l + 1;
297 assert( sub_dim == sub_vec_targ->sub_dim );
298 assert( sub_vec_targ->values );
300 assert( num_values == sub_dim );
301 assert( num_indexes == 2 );
302 assert( num_chars == 0 );
303 assert( index_data[0] == sub_vec_targ->global_offset + 1 );
304 assert( index_data[1] == sub_vec_targ->global_offset + sub_vec_targ->sub_dim );
305 values = (RTOp_value_type*)sub_vec_targ->values;
306 for( k = 0; k < sub_dim; ++k )
307 *values++ = value_data[k];
311 ,sub_vec_targ->values
319 get_targ_type_num_entries
329 static int RTOp_ROp_get_sub_vector_apply_op(
333 , RTOp_ReductTarget targ_obj )
335 const struct RTOp_ROp_get_sub_vector_rng_t *rng = NULL;
337 RTOp_index_type global_offset;
338 RTOp_index_type sub_dim;
339 const RTOp_value_type *v0_val;
341 RTOp_index_type i, i_l, i_u;
347 return RTOp_ERR_INVALID_NUM_VECS;
348 if( num_targ_vecs != 0 )
349 return RTOp_ERR_INVALID_NUM_TARG_VECS;
359 rng = (
const struct RTOp_ROp_get_sub_vector_rng_t*)obj_data;
364 assert( sub_vec_targ->global_offset + 1 == rng->l );
365 assert( sub_vec_targ->global_offset + sub_vec_targ->sub_dim == rng->u );
368 global_offset = vecs[0].global_offset;
369 sub_dim = vecs[0].sub_dim;
370 v0_val = vecs[0].values;
371 v0_val_s = vecs[0].values_stride;
381 if( rng->u < global_offset + 1 || global_offset + sub_dim < rng->l )
384 i_l = ( rng->l <= ( global_offset + 1 ) ? 1 : rng->l - global_offset );
385 i_u = ( rng->u >= ( global_offset + sub_dim ) ? sub_dim : rng->u - global_offset );
387 for( i = i_l; i <= i_u; ++i )
388 ((RTOp_value_type*)sub_vec_targ->values)[i-1+(global_offset-(rng->l-1))] = v0_val[(i-1)*v0_val_s];
394 static int reduce_reduct_objs(
396 , RTOp_ReductTarget in_reduct_obj, RTOp_ReductTarget inout_reduct_obj )
398 const struct RTOp_ROp_get_sub_vector_rng_t *rng = NULL;
400 *in_sub_vec_targ = NULL,
401 *inout_sub_vec_targ = NULL;
402 RTOp_index_type sub_dim = 0;
403 RTOp_value_type *inout_values = NULL;
404 register RTOp_index_type k;
407 rng = (
const struct RTOp_ROp_get_sub_vector_rng_t*)obj_data;
408 sub_dim = rng->u - rng->l + 1;
410 assert( in_reduct_obj );
412 assert( sub_dim == in_sub_vec_targ->sub_dim );
413 assert( in_sub_vec_targ->values );
415 assert( inout_reduct_obj );
417 assert( sub_dim == inout_sub_vec_targ->sub_dim );
418 assert( inout_sub_vec_targ->values );
420 inout_values = (RTOp_value_type*)inout_sub_vec_targ->values;
421 for( k = 0; k < sub_dim; ++k )
422 *inout_values++ += in_sub_vec_targ->values[k];
426 static void CALL_API external_reduct_op(
void* in_targ_array,
void* inout_targ_array
427 ,
int* len, RTOp_Datatype* datatype )
429 int num_values_off, num_indexes_off, num_chars_off
430 , values_off, l_off, u_off;
431 int num_values, num_indexes, num_chars;
432 const RTOp_value_type *in_values = NULL;
433 RTOp_value_type *inout_values = NULL;
434 register RTOp_index_type k;
437 num_indexes_off = num_values_off +
sizeof(RTOp_value_type);
438 num_chars_off = num_indexes_off +
sizeof(RTOp_value_type);
440 num_values = *(RTOp_value_type*)((
char*)in_targ_array + num_values_off);
441 num_indexes = *(RTOp_value_type*)((
char*)in_targ_array + num_indexes_off);
442 num_chars = *(RTOp_value_type*)((
char*)in_targ_array + num_chars_off);
444 assert( num_values > 0 );
445 assert( num_indexes == 2 );
446 assert( num_chars == 0 );
447 assert( num_values == *(RTOp_value_type*)((
char*)inout_targ_array + num_values_off) );
448 assert( num_indexes == *(RTOp_value_type*)((
char*)inout_targ_array + num_indexes_off) );
449 assert( num_chars == *(RTOp_value_type*)((
char*)inout_targ_array + num_chars_off) );
452 values_off = num_chars_off +
sizeof(RTOp_value_type);
453 l_off = values_off + num_values *
sizeof(RTOp_value_type);
454 u_off = l_off +
sizeof(RTOp_index_type);
456 assert( *(RTOp_index_type*)((
char*)in_targ_array + l_off)
457 == *(RTOp_index_type*)((
char*)inout_targ_array + l_off) );
458 assert( *(RTOp_index_type*)((
char*)in_targ_array + u_off)
459 == *(RTOp_index_type*)((
char*)inout_targ_array + u_off) );
462 in_values = (
const RTOp_value_type*)((
char*)in_targ_array + values_off);
463 inout_values = (RTOp_value_type*)((
char*)inout_targ_array + values_off);
464 for( k = 0; k < num_values; ++k )
465 *inout_values++ += *in_values++;
468 static int get_reduct_op(
470 , RTOp_reduct_op_func_ptr_t* reduct_op_func_ptr )
472 *reduct_op_func_ptr = external_reduct_op;
482 ,
"RTOp_ROp_get_sub_vector"
484 ,RTOp_ROp_get_sub_vector_apply_op
489 int RTOp_ROp_get_sub_vector_construct(
490 RTOp_index_type l, RTOp_index_type u,
struct RTOp_RTOp* op )
492 struct RTOp_ROp_get_sub_vector_rng_t *rng = NULL;
493 op->vtbl = &RTOp_ROp_get_sub_vector_vtbl;
494 op->vtbl->obj_data_vtbl->
obj_create(NULL,NULL,&op->obj_data);
495 rng = (
struct RTOp_ROp_get_sub_vector_rng_t*)op->obj_data;
501 int RTOp_ROp_get_sub_vector_set_range(
502 RTOp_index_type l, RTOp_index_type u,
struct RTOp_RTOp* op )
504 struct RTOp_ROp_get_sub_vector_rng_t *rng = NULL;
506 assert( op->obj_data );
507 rng = (
struct RTOp_ROp_get_sub_vector_rng_t*)op->obj_data;
513 int RTOp_ROp_get_sub_vector_destroy(
struct RTOp_RTOp* op )
517 assert( op->obj_data );
519 op->vtbl->obj_data_vtbl->
obj_free(NULL,NULL,&op->obj_data);
525 RTOp_ReductTarget targ_obj
int(* obj_create)(const struct RTOp_obj_type_vtbl_t *vtbl, const void *instance_data, void **obj)
struct RTOp_SubVector RTOp_ROp_get_sub_vector_val(RTOp_ReductTarget reduct_obj)
void RTOp_sub_vector(RTOp_index_type global_offset, RTOp_index_type sub_dim, const RTOp_value_type values[], ptrdiff_t values_stride, struct RTOp_SubVector *sub_vec)
int(* obj_free)(const struct RTOp_obj_type_vtbl_t *vtbl, const void *instance_data, void **obj)
int(* obj_reinit)(const struct RTOp_obj_type_vtbl_t *vtbl, const void *instance_data, void *obj)