From f86b69ffb34986de7e4b277fc4975fb89f5e0a1a Mon Sep 17 00:00:00 2001 From: Leon Arber Date: Thu, 14 Oct 2004 14:55:29 -0500 Subject: [svn-r9422] Purpose: Description: Code optimization and refactoring. Added support for llong, ullong, and ldouble Solution: Significantly cut down on the amount of code required to do the transform, while making the operations more efficient. Platforms tested: sol + eirene --- src/H5Ztrans.c | 1907 ++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 1379 insertions(+), 528 deletions(-) diff --git a/src/H5Ztrans.c b/src/H5Ztrans.c index c15b0de..70eeeb8 100644 --- a/src/H5Ztrans.c +++ b/src/H5Ztrans.c @@ -23,6 +23,7 @@ #include "H5Iprivate.h" /* IDs */ #include "H5MMprivate.h" /* Memory management */ #include "H5Zpkg.h" /* Data filters */ +#include "H5Vprivate.h" /* H5V_array_fill */ /* Token types */ @@ -756,61 +757,93 @@ H5Z_xform_eval(H5Z_data_xform_t *data_xform_prop, void* array, size_t array_size /* If it's a trivial data transform, perform it */ if( tree->type == H5Z_XFORM_INTEGER || tree->type == H5Z_XFORM_FLOAT) { - if( array_type == H5T_NATIVE_INT) + if(array_type == H5T_NATIVE_CHAR) { - for(i=0; itype == H5Z_XFORM_INTEGER) ? tree->value.int_val : tree->value.float_val; + char tree_val = (tree->type == H5Z_XFORM_INTEGER) ? tree->value.int_val : tree->value.float_val; + + H5V_array_fill(array, &tree_val, sizeof(char), array_size); + } + else if(array_type == H5T_NATIVE_UCHAR) + { + unsigned char tree_val = (tree->type == H5Z_XFORM_INTEGER) ? tree->value.int_val : tree->value.float_val; + + H5V_array_fill(array, &tree_val, sizeof(unsigned char), array_size); } - else if(array_type == H5T_NATIVE_FLOAT) + else if(array_type == H5T_NATIVE_SCHAR) { - for(i=0; itype == H5Z_XFORM_INTEGER) ? tree->value.int_val : tree->value.float_val; + signed char tree_val = (tree->type == H5Z_XFORM_INTEGER) ? tree->value.int_val : tree->value.float_val; + + H5V_array_fill(array, &tree_val, sizeof(signed char), array_size); } - else if(array_type == H5T_NATIVE_CHAR) + + else if(array_type == H5T_NATIVE_SHORT) { - for(i=0; itype == H5Z_XFORM_INTEGER) ? tree->value.int_val : tree->value.float_val; + short tree_val = (tree->type == H5Z_XFORM_INTEGER) ? tree->value.int_val : tree->value.float_val; + + H5V_array_fill(array, &tree_val, sizeof(short), array_size); } - else if(array_type == H5T_NATIVE_DOUBLE) + else if(array_type == H5T_NATIVE_USHORT) { - for(i=0; itype == H5Z_XFORM_INTEGER) ? tree->value.int_val : tree->value.float_val; + unsigned short tree_val = (tree->type == H5Z_XFORM_INTEGER) ? tree->value.int_val : tree->value.float_val; + + H5V_array_fill(array, &tree_val, sizeof(unsigned short), array_size); } - else if(array_type == H5T_NATIVE_SHORT) + + else if( array_type == H5T_NATIVE_INT) { - for(i=0; itype == H5Z_XFORM_INTEGER) ? tree->value.int_val : tree->value.float_val; + int tree_val = (tree->type == H5Z_XFORM_INTEGER) ? tree->value.int_val : tree->value.float_val; + + H5V_array_fill(array, &tree_val, sizeof(int), array_size); } - else if(array_type == H5T_NATIVE_LONG) + else if(array_type == H5T_NATIVE_UINT) { - for(i=0; itype == H5Z_XFORM_INTEGER) ? tree->value.int_val : tree->value.float_val; + unsigned int tree_val = (tree->type == H5Z_XFORM_INTEGER) ? tree->value.int_val : tree->value.float_val; + + H5V_array_fill(array, &tree_val, sizeof(unsigned int), array_size); } - else if(array_type == H5T_NATIVE_UCHAR) + else if(array_type == H5T_NATIVE_LONG) { - for(i=0; itype == H5Z_XFORM_INTEGER) ? tree->value.int_val : tree->value.float_val; + long tree_val = (tree->type == H5Z_XFORM_INTEGER) ? tree->value.int_val : tree->value.float_val; + + H5V_array_fill(array, &tree_val, sizeof(long), array_size); } - else if(array_type == H5T_NATIVE_SCHAR) + else if(array_type == H5T_NATIVE_ULONG) + { + unsigned long tree_val = (tree->type == H5Z_XFORM_INTEGER) ? tree->value.int_val : tree->value.float_val; + + H5V_array_fill(array, &tree_val, sizeof(unsigned long), array_size); + } + else if(array_type == H5T_NATIVE_LLONG) { - for(i=0; itype == H5Z_XFORM_INTEGER) ? tree->value.int_val : tree->value.float_val; + long_long tree_val = (tree->type == H5Z_XFORM_INTEGER) ? tree->value.int_val : tree->value.float_val; + + H5V_array_fill(array, &tree_val, sizeof(long_long), array_size); } - else if(array_type == H5T_NATIVE_USHORT) + else if(array_type == H5T_NATIVE_ULLONG) { - for(i=0; itype == H5Z_XFORM_INTEGER) ? tree->value.int_val : tree->value.float_val; + unsigned long_long tree_val = (tree->type == H5Z_XFORM_INTEGER) ? tree->value.int_val : tree->value.float_val; + + H5V_array_fill(array, &tree_val, sizeof(unsigned long_long), array_size); } - else if(array_type == H5T_NATIVE_UINT) + else if(array_type == H5T_NATIVE_FLOAT) { - for(i=0; itype == H5Z_XFORM_INTEGER) ? tree->value.int_val : tree->value.float_val; + float tree_val = (tree->type == H5Z_XFORM_INTEGER) ? tree->value.int_val : tree->value.float_val; + + H5V_array_fill(array, &tree_val, sizeof(float), array_size); + } + else if(array_type == H5T_NATIVE_DOUBLE) + { + double tree_val = (tree->type == H5Z_XFORM_INTEGER) ? tree->value.int_val : tree->value.float_val; + + H5V_array_fill(array, &tree_val, sizeof(double), array_size); } - else if(array_type == H5T_NATIVE_ULONG) + else if(array_type == H5T_NATIVE_LDOUBLE) { - for(i=0; itype == H5Z_XFORM_INTEGER) ? tree->value.int_val : tree->value.float_val; + long double tree_val = (tree->type == H5Z_XFORM_INTEGER) ? tree->value.int_val : tree->value.float_val; + + H5V_array_fill(array, &tree_val, sizeof(long double), array_size); } + } /* Otherwise, do the full data transform */ else @@ -923,180 +956,392 @@ H5Z_xform_eval_full(H5Z_node *tree, const size_t array_size, const hid_t array_ switch (tree->type) { case H5Z_XFORM_PLUS: - if( (resl.type == H5Z_XFORM_SYMBOL) && (resr.type != H5Z_XFORM_SYMBOL)) + if( ((resl.type == H5Z_XFORM_SYMBOL) && (resr.type != H5Z_XFORM_SYMBOL)) || ((resr.type == H5Z_XFORM_SYMBOL) && (resl.type != H5Z_XFORM_SYMBOL))) { - if(array_type == H5T_NATIVE_INT) - { - for(i=0; ilchild = NULL; tree->rchild = NULL; } - else if((tree->lchild->type == H5Z_XFORM_FLOAT) && (tree->rchild->type == H5Z_XFORM_FLOAT)) - { - tree->type = H5Z_XFORM_FLOAT; - tree->value.float_val = tree->lchild->value.float_val / tree->rchild->value.float_val; - H5MM_xfree(tree->lchild); - H5MM_xfree(tree->rchild); - tree->lchild = NULL; - tree->rchild = NULL; - } - else if( (tree->lchild->type == H5Z_XFORM_FLOAT) && (tree->rchild->type==H5Z_XFORM_INTEGER)) - { - tree->type = H5Z_XFORM_FLOAT; - tree->value.float_val = tree->lchild->value.float_val / tree->rchild->value.int_val; - H5MM_xfree(tree->lchild); - H5MM_xfree(tree->rchild); - tree->lchild = NULL; - tree->rchild = NULL; - } - else if( (tree->lchild->type == H5Z_XFORM_INTEGER) && (tree->rchild->type == H5Z_XFORM_FLOAT)) - { - tree->type = H5Z_XFORM_FLOAT; - tree->value.float_val = tree->lchild->value.int_val / tree->rchild->value.float_val; + else if( ( (tree->lchild->type == H5Z_XFORM_FLOAT) || (tree->lchild->type == H5Z_XFORM_INTEGER)) && ( (tree->rchild->type == H5Z_XFORM_FLOAT) || (tree->rchild->type == H5Z_XFORM_INTEGER))) + { + tree->type = H5Z_XFORM_FLOAT; + tree->value.float_val = ((tree->lchild->type == H5Z_XFORM_FLOAT) ? tree->lchild->value.float_val : tree->lchild->value.int_val) / + ((tree->rchild->type == H5Z_XFORM_FLOAT) ? tree->rchild->value.float_val : tree->rchild->value.int_val); H5MM_xfree(tree->lchild); H5MM_xfree(tree->rchild); tree->lchild = NULL; tree->rchild = NULL; } - } else if(tree->type == H5Z_XFORM_MULT) { @@ -1983,34 +2887,16 @@ static void H5Z_do_op(H5Z_node* tree) tree->lchild = NULL; tree->rchild = NULL; } - else if((tree->lchild->type == H5Z_XFORM_FLOAT) && (tree->rchild->type == H5Z_XFORM_FLOAT)) - { - tree->type = H5Z_XFORM_FLOAT; - tree->value.float_val = tree->lchild->value.float_val * tree->rchild->value.float_val; - H5MM_xfree(tree->lchild); - H5MM_xfree(tree->rchild); - tree->lchild = NULL; - tree->rchild = NULL; - } - else if( (tree->lchild->type == H5Z_XFORM_FLOAT) && (tree->rchild->type==H5Z_XFORM_INTEGER)) - { - tree->type = H5Z_XFORM_FLOAT; - tree->value.float_val = tree->lchild->value.float_val * tree->rchild->value.int_val; - H5MM_xfree(tree->lchild); - H5MM_xfree(tree->rchild); - tree->lchild = NULL; - tree->rchild = NULL; - } - else if( (tree->lchild->type == H5Z_XFORM_INTEGER) && (tree->rchild->type == H5Z_XFORM_FLOAT)) - { - tree->type = H5Z_XFORM_FLOAT; - tree->value.float_val = tree->lchild->value.int_val * tree->rchild->value.float_val; + else if( ( (tree->lchild->type == H5Z_XFORM_FLOAT) || (tree->lchild->type == H5Z_XFORM_INTEGER)) && ( (tree->rchild->type == H5Z_XFORM_FLOAT) || (tree->rchild->type == H5Z_XFORM_INTEGER))) + { + tree->type = H5Z_XFORM_FLOAT; + tree->value.float_val = ((tree->lchild->type == H5Z_XFORM_FLOAT) ? tree->lchild->value.float_val : tree->lchild->value.int_val) * + ((tree->rchild->type == H5Z_XFORM_FLOAT) ? tree->rchild->value.float_val : tree->rchild->value.int_val); H5MM_xfree(tree->lchild); H5MM_xfree(tree->rchild); tree->lchild = NULL; tree->rchild = NULL; } - } else if(tree->type == H5Z_XFORM_PLUS) { @@ -2025,34 +2911,16 @@ static void H5Z_do_op(H5Z_node* tree) tree->lchild = NULL; tree->rchild = NULL; } - else if((tree->lchild->type == H5Z_XFORM_FLOAT) && (tree->rchild->type == H5Z_XFORM_FLOAT)) - { - tree->type = H5Z_XFORM_FLOAT; - tree->value.float_val = tree->lchild->value.float_val + tree->rchild->value.float_val; - H5MM_xfree(tree->lchild); - H5MM_xfree(tree->rchild); - tree->lchild = NULL; - tree->rchild = NULL; - } - else if( (tree->lchild->type == H5Z_XFORM_FLOAT) && (tree->rchild->type==H5Z_XFORM_INTEGER)) - { - tree->type = H5Z_XFORM_FLOAT; - tree->value.float_val = tree->lchild->value.float_val + tree->rchild->value.int_val; - H5MM_xfree(tree->lchild); - H5MM_xfree(tree->rchild); - tree->lchild = NULL; - tree->rchild = NULL; - } - else if( (tree->lchild->type == H5Z_XFORM_INTEGER) && (tree->rchild->type == H5Z_XFORM_FLOAT)) - { - tree->type = H5Z_XFORM_FLOAT; - tree->value.float_val = tree->lchild->value.int_val + tree->rchild->value.float_val; + else if( ( (tree->lchild->type == H5Z_XFORM_FLOAT) || (tree->lchild->type == H5Z_XFORM_INTEGER)) && ( (tree->rchild->type == H5Z_XFORM_FLOAT) || (tree->rchild->type == H5Z_XFORM_INTEGER))) + { + tree->type = H5Z_XFORM_FLOAT; + tree->value.float_val = ((tree->lchild->type == H5Z_XFORM_FLOAT) ? tree->lchild->value.float_val : tree->lchild->value.int_val) + + ((tree->rchild->type == H5Z_XFORM_FLOAT) ? tree->rchild->value.float_val : tree->rchild->value.int_val); H5MM_xfree(tree->lchild); H5MM_xfree(tree->rchild); tree->lchild = NULL; tree->rchild = NULL; } - } else if(tree->type == H5Z_XFORM_MINUS) { @@ -2067,28 +2935,11 @@ static void H5Z_do_op(H5Z_node* tree) tree->lchild = NULL; tree->rchild = NULL; } - else if((tree->lchild->type == H5Z_XFORM_FLOAT) && (tree->rchild->type == H5Z_XFORM_FLOAT)) - { - tree->type = H5Z_XFORM_FLOAT; - tree->value.float_val = tree->lchild->value.float_val - tree->rchild->value.float_val; - H5MM_xfree(tree->lchild); - H5MM_xfree(tree->rchild); - tree->lchild = NULL; - tree->rchild = NULL; - } - else if( (tree->lchild->type == H5Z_XFORM_FLOAT) && (tree->rchild->type==H5Z_XFORM_INTEGER)) - { - tree->type = H5Z_XFORM_FLOAT; - tree->value.float_val = tree->lchild->value.float_val - tree->rchild->value.int_val; - H5MM_xfree(tree->lchild); - H5MM_xfree(tree->rchild); - tree->lchild = NULL; - tree->rchild = NULL; - } - else if( (tree->lchild->type == H5Z_XFORM_INTEGER) && (tree->rchild->type == H5Z_XFORM_FLOAT)) - { - tree->type = H5Z_XFORM_FLOAT; - tree->value.float_val = tree->lchild->value.int_val - tree->rchild->value.float_val; + else if( ( (tree->lchild->type == H5Z_XFORM_FLOAT) || (tree->lchild->type == H5Z_XFORM_INTEGER)) && ( (tree->rchild->type == H5Z_XFORM_FLOAT) || (tree->rchild->type == H5Z_XFORM_INTEGER))) + { + tree->type = H5Z_XFORM_FLOAT; + tree->value.float_val = ((tree->lchild->type == H5Z_XFORM_FLOAT) ? tree->lchild->value.float_val : tree->lchild->value.int_val) - + ((tree->rchild->type == H5Z_XFORM_FLOAT) ? tree->rchild->value.float_val : tree->rchild->value.int_val); H5MM_xfree(tree->lchild); H5MM_xfree(tree->rchild); tree->lchild = NULL; -- cgit v0.12