Changeset: ef1a4e606abd for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ef1a4e606abd Modified Files: sql/backends/monet5/UDF/udf_impl.h Branch: Feb2013 Log Message:
UDF: factor-out inner loop of fuse() into separate function on arrays diffs (64 lines): diff --git a/sql/backends/monet5/UDF/udf_impl.h b/sql/backends/monet5/UDF/udf_impl.h --- a/sql/backends/monet5/UDF/udf_impl.h +++ b/sql/backends/monet5/UDF/udf_impl.h @@ -71,7 +71,29 @@ UF(UDFfuse_,UI,UO,) ( UO *ret , const UI * accessing value arrays directly. */ -/* type-specific core algorithm */ +/* type-specific core algorithm on arrays */ +static char * +UF(UDFarrayfuse_,UI,UO,) ( UO *res, const UI *one, const UI *two, BUN n ) +{ + BUN i; + int shift = sizeof(UI) * 8; + + /* assert calling sanity */ + assert(res != NULL && one != NULL && two != NULL); + + /* iterate over all values/tuples and do the work */ + for (i = 0; i < n; i++) + if (one[i] == UN(UI) || two[i] == UN(UI)) + /* NULL/nil in => NULL/nil out */ + res[i] = UN(UO); + else + /* do the work; watch out for sign bits */ + res[i] = ((UO) (UU) one[i] << shift) | (UU) two[i]; + + return MAL_SUCCEED; +} + +/* type-specific core algorithm on BATs */ static char * UF(UDFBATfuse_,UI,UO,) ( const BAT *bres, const BAT *bone, const BAT *btwo, BUN n, bit *two_tail_sorted_unsigned, @@ -79,8 +101,7 @@ UF(UDFBATfuse_,UI,UO,) ( const BAT *bre { UI *one = NULL, *two = NULL; UO *res = NULL; - BUN i; - int shift = sizeof(UI) * 8; + str msg = NULL; /* assert calling sanity */ assert(bres != NULL && bone != NULL && btwo != NULL); @@ -93,14 +114,11 @@ UF(UDFBATfuse_,UI,UO,) ( const BAT *bre one = (UI*) Tloc(bone, BUNfirst(bone)); two = (UI*) Tloc(btwo, BUNfirst(btwo)); res = (UO*) Tloc(bres, BUNfirst(bres)); - /* iterate over all values/tuples and do the work */ - for (i = 0; i < n; i++) - if (one[i] == UN(UI) || two[i] == UN(UI)) - /* NULL/nil in => NULL/nil out */ - res[i] = UN(UO); - else - /* do the work; watch out for sign bits */ - res[i] = ((UO) (UU) one[i] << shift) | (UU) two[i]; + + /* call core function on arrays */ + msg = UF(UDFarrayfuse_,UI,UO,) ( res, one, two , n ); + if (msg != MAL_SUCCEED) + return msg; *two_tail_sorted_unsigned = BATtordered(btwo) && (two[0] >= 0 || two[n-1] < 0); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list