Skip to content

Commit

Permalink
Array type conversions
Browse files Browse the repository at this point in the history
  • Loading branch information
anderflash committed Oct 2, 2015
1 parent 05d1a86 commit 1d9d976
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 29 deletions.
15 changes: 14 additions & 1 deletion include/grafeo/array.h
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,13 @@ Array* array_sub(Array* array, Range* ranges);
* @return
*/
Array* array_from_data(void* data, uint16_t dim, uint32_t* size, DataType type);

/**
* @brief array_as_type
* @param array
* @param type
* @return
*/
Array* array_as_type(Array* array, DataType type);
/*-----------------------------------
* ARRAY OPERATIONS FUNCTIONS
*-----------------------------------*/
Expand Down Expand Up @@ -407,6 +413,13 @@ void array_set_element(Array* array, uint32_t* indices, double value);
* @return
*/
long double array_get_long_double_1D(Array* array1, uint64_t i);
/**
* @brief array_set_element_1D
* @param array
* @param i
* @param value
*/
void array_set_element_1D(Array* array, uint64_t i, double value);
/*-----------------------------------
* ARRAY REDUCTION FUNCTIONS
*-----------------------------------*/
Expand Down
33 changes: 22 additions & 11 deletions src/array.c
Original file line number Diff line number Diff line change
Expand Up @@ -307,19 +307,22 @@ array_set_element(Array* array, uint32_t* indices, double value){
uint8_t i;
for(i = 0; i < array->dim; i++)
x += indices[i] * array->step[i];
array_set_element_1D(array, x, value);
}

void array_set_element_1D(Array* array, uint64_t i, double value){
switch(array->type){
case GRAFEO_UINT8: array->data_uint8[x] = (uint8_t)value; break;
case GRAFEO_UINT16: array->data_uint16[x] = (uint16_t)value; break;
case GRAFEO_UINT32: array->data_uint32[x] = (uint32_t)value; break;
case GRAFEO_UINT64: array->data_uint64[x] = (uint64_t)value; break;
case GRAFEO_INT8: array->data_int8[x] = (int8_t)value; break;
case GRAFEO_INT16: array->data_int16[x] = (int16_t)value; break;
case GRAFEO_INT32: array->data_int32[x] = (int32_t)value; break;
case GRAFEO_INT64: array->data_int64[x] = (int64_t)value; break;
case GRAFEO_FLOAT: array->data_float[x] = (float)value; break;
case GRAFEO_DOUBLE: array->data_double[x] = (double)value; break;
case GRAFEO_UINT8: array->data_uint8[i] = (uint8_t)value; break;
case GRAFEO_UINT16: array->data_uint16[i] = (uint16_t)value; break;
case GRAFEO_UINT32: array->data_uint32[i] = (uint32_t)value; break;
case GRAFEO_UINT64: array->data_uint64[i] = (uint64_t)value; break;
case GRAFEO_INT8: array->data_int8[i] = (int8_t)value; break;
case GRAFEO_INT16: array->data_int16[i] = (int16_t)value; break;
case GRAFEO_INT32: array->data_int32[i] = (int32_t)value; break;
case GRAFEO_INT64: array->data_int64[i] = (int64_t)value; break;
case GRAFEO_FLOAT: array->data_float[i] = (float)value; break;
case GRAFEO_DOUBLE: array->data_double[i] = (double)value; break;
}

}

long double array_get_long_double_1D(Array* array1, uint64_t i){
Expand Down Expand Up @@ -383,6 +386,14 @@ array_from_data(void* data, uint16_t dim, uint32_t* size, DataType type){
array->data = data;
return array;
}
Array*
array_as_type(Array* array, DataType type){
Array* array2 = array_new_with_size_type(array->dim, array->size, type);
uint64_t i;
for(i = 0; i < array->num_elements; i++)
array_set_element_1D(array2, i, array_get_long_double_1D(array,i));
return array2;
}

Array*
array_reduce_min(Array* array, int16_t* axes, uint16_t size){
Expand Down
58 changes: 41 additions & 17 deletions tests/test_array.c
Original file line number Diff line number Diff line change
Expand Up @@ -803,28 +803,52 @@ static void test_array_get_long_double(void** state){
array_free(array);
}

static void test_array_conversion(void** state){
(void) state;
uint8_t data[8] = {1,2,3,4,5,6,7,8};
uint32_t size = 8;
uint64_t i;
Array* array = array_from_data(data,1,&size,GRAFEO_UINT8);

// To UINT16
Array* array2 = array_as_type(array, GRAFEO_UINT16);
assert_non_null(array2);
assert_int_equal(array2->type, GRAFEO_UINT16);
for(i = 0; i < array2->num_elements; i++){
assert_int_equal(array_get_long_double_1D(array2,i),data[i]);
}
// To FLOAT
Array* array3 = array_as_type(array, GRAFEO_FLOAT);
assert_non_null(array3);
assert_int_equal(array3->type, GRAFEO_FLOAT);
for(i = 0; i < array2->num_elements; i++){
assert_int_equal(array_get_long_double_1D(array3,i),data[i]);
}
}

int main(int argc, char** argv){
(void)argc;
(void)argv;
const struct CMUnitTest tests[]={
// cmocka_unit_test(test_array_new),
// cmocka_unit_test(test_array_new_1D),
// cmocka_unit_test(test_array_new_2D),
// cmocka_unit_test(test_array_new_3D),
// cmocka_unit_test(test_array_new_4D),
// cmocka_unit_test(test_array_new_1D_type),
// cmocka_unit_test(test_array_new_2D_type),
// cmocka_unit_test(test_array_new_3D_type),
// cmocka_unit_test(test_array_new_4D_type),
// cmocka_unit_test(test_array_from_data),
// cmocka_unit_test(test_array_zeros),
// cmocka_unit_test(test_array_ones),
// cmocka_unit_test(test_array_sub),
// cmocka_unit_test(test_array_reduce),
// cmocka_unit_test(test_array_ops),
// cmocka_unit_test(test_array_indices_manip),
// cmocka_unit_test(test_array_get_long_double),
cmocka_unit_test(test_array_new),
cmocka_unit_test(test_array_new_1D),
cmocka_unit_test(test_array_new_2D),
cmocka_unit_test(test_array_new_3D),
cmocka_unit_test(test_array_new_4D),
cmocka_unit_test(test_array_new_1D_type),
cmocka_unit_test(test_array_new_2D_type),
cmocka_unit_test(test_array_new_3D_type),
cmocka_unit_test(test_array_new_4D_type),
cmocka_unit_test(test_array_from_data),
cmocka_unit_test(test_array_zeros),
cmocka_unit_test(test_array_ones),
cmocka_unit_test(test_array_sub),
cmocka_unit_test(test_array_reduce),
cmocka_unit_test(test_array_ops),
cmocka_unit_test(test_array_indices_manip),
cmocka_unit_test(test_array_get_long_double),
cmocka_unit_test(test_array_io_csv),
cmocka_unit_test(test_array_conversion),
};
return cmocka_run_group_tests(tests,NULL,NULL);
}

0 comments on commit 1d9d976

Please sign in to comment.