From 7ef46b524b3c9dd56a7e0a106d5f4a4fd999acaa Mon Sep 17 00:00:00 2001 From: Raymond Lu Date: Tue, 6 Sep 2005 13:39:46 -0500 Subject: [svn-r11355] Purpose: A new API function and its test. Description: Put in a new API funciton, H5Tis_hard. It checks whether the conversion function from a native type to another native type is a compiler (hard) conversion. Also checked a test in test/dt_arith.c. Platforms tested: h5committest and fuss. --- src/H5T.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/H5Tprivate.h | 1 + src/H5Tpublic.h | 1 + test/dt_arith.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 142 insertions(+) diff --git a/src/H5T.c b/src/H5T.c index edf9989..a372a27 100644 --- a/src/H5T.c +++ b/src/H5T.c @@ -2660,6 +2660,46 @@ done: /*------------------------------------------------------------------------- + * Function: H5Tis_hard + * + * Purpose: Finds out whether the library's conversion function from + * type src_id to type dst_id is a hard conversion. A hard + * conversion uses compiler's casting; a soft conversion uses + * the library's own conversion function. + * + * Return: TRUE: hard conversion. + * FALSE: soft conversion. + * FAIL: failed. + * + * Programmer: Raymond Lu + * Friday, Sept 2, 2005 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +htri_t +H5Tis_hard(hid_t src_id, hid_t dst_id) +{ + htri_t ret_value; + H5T_t *src = NULL, *dst = NULL; + + FUNC_ENTER_API(H5Tis_hard, FAIL); + + /* Check args */ + if (NULL == (src = H5I_object_verify(src_id,H5I_DATATYPE)) || + NULL == (dst = H5I_object_verify(dst_id,H5I_DATATYPE))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); + + /* Find it */ + if((ret_value=H5T_is_hard(src, dst))<0) + HGOTO_ERROR(H5E_DATATYPE, H5E_NOTFOUND, FAIL, "conversion function not found"); + +done: + FUNC_LEAVE_API(ret_value); +} + +/*------------------------------------------------------------------------- * Function: H5Tconvert * * Purpose: Convert NELMTS elements from type SRC_ID to type DST_ID. The @@ -4565,6 +4605,43 @@ H5T_path_bkg(const H5T_path_t *p) /*------------------------------------------------------------------------- + * Function: H5T_is_hard + * + * Purpose: Private function for H5Tis_hard. Finds out whether the + * library's conversion function from type SRC to type DST + * is a hard conversion. + * + * Return: TRUE: hard conversion. + * FALSE: soft conversion. + * FAIL: function failed. + * + * Programmer: Raymond Lu + * Friday, Sept 2, 2005 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +htri_t +H5T_is_hard(H5T_t *src, H5T_t *dst) +{ + htri_t ret_value; + H5T_path_t *path = NULL; + + FUNC_ENTER_NOAPI(H5T_is_hard, FAIL); + + /* Find it */ + if (NULL==(path=H5T_path_find(src, dst, NULL, NULL, H5AC_ind_dxpl_id))) + HGOTO_ERROR(H5E_DATATYPE, H5E_NOTFOUND, FAIL, "conversion function not found"); + + ret_value = (htri_t)path->is_hard; + +done: + FUNC_LEAVE_NOAPI(ret_value); +} + + +/*------------------------------------------------------------------------- * Function: H5T_convert * * Purpose: Call a conversion function to convert from source to diff --git a/src/H5Tprivate.h b/src/H5Tprivate.h index d55e3d3..a93ca84 100644 --- a/src/H5Tprivate.h +++ b/src/H5Tprivate.h @@ -75,6 +75,7 @@ H5_DLL H5T_class_t H5T_get_class(const H5T_t *dt, htri_t internal); H5_DLL htri_t H5T_detect_class (const H5T_t *dt, H5T_class_t cls); H5_DLL size_t H5T_get_size(const H5T_t *dt); H5_DLL int H5T_cmp(const H5T_t *dt1, const H5T_t *dt2, hbool_t superset); +H5_DLL htri_t H5T_is_hard(H5T_t *src, H5T_t *dst); H5_DLL herr_t H5T_debug(const H5T_t *dt, FILE * stream); H5_DLL H5G_entry_t *H5T_entof(H5T_t *dt); H5_DLL htri_t H5T_is_immutable(const H5T_t *dt); diff --git a/src/H5Tpublic.h b/src/H5Tpublic.h index 6eeb21b..be35e5e 100644 --- a/src/H5Tpublic.h +++ b/src/H5Tpublic.h @@ -576,6 +576,7 @@ H5_DLL herr_t H5Tregister(H5T_pers_t pers, const char *name, hid_t src_id, H5_DLL herr_t H5Tunregister(H5T_pers_t pers, const char *name, hid_t src_id, hid_t dst_id, H5T_conv_t func); H5_DLL H5T_conv_t H5Tfind(hid_t src_id, hid_t dst_id, H5T_cdata_t **pcdata); +H5_DLL htri_t H5Tis_hard(hid_t src_id, hid_t dst_id); H5_DLL herr_t H5Tconvert(hid_t src_id, hid_t dst_id, size_t nelmts, void *buf, void *background, hid_t plist_id); diff --git a/test/dt_arith.c b/test/dt_arith.c index 0944524..abdba99 100644 --- a/test/dt_arith.c +++ b/test/dt_arith.c @@ -579,6 +579,66 @@ generates_sigfpe(void) /*------------------------------------------------------------------------- + * Function: test_hard_query + * + * Purpose: Tests H5Tis_hard() for querying whether a conversion is + * a hard one. + * + * Return: Success: 0 + * + * Failure: number of errors + * + * Programmer: Raymond Lu + * Friday, Sept 2, 2005 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +static int +test_hard_query(void) +{ + htri_t ret; + + TESTING("query functions of hard conversion"); + + /* Verify the conversion from int to float is a hard conversion. */ + if((ret = H5Tis_hard(H5T_NATIVE_INT, H5T_NATIVE_FLOAT))!=TRUE) { + H5_FAILED(); + printf("Can't query conversion function\n"); + goto error; + } + + /* Unregister the hard conversion from int to float. Verify the conversion + * is a soft conversion. */ + H5Tunregister(H5T_PERS_HARD, NULL, H5T_NATIVE_INT, H5T_NATIVE_FLOAT, NULL); + if((ret = H5Tis_hard(H5T_NATIVE_INT, H5T_NATIVE_FLOAT))!=FALSE) { + H5_FAILED(); + printf("Can't query conversion function\n"); + goto error; + } + + /* Register the hard conversion from int to float. Verify the conversion + * is a hard conversion. */ + H5Tregister(H5T_PERS_HARD, "int_flt", H5T_NATIVE_INT, H5T_NATIVE_FLOAT, H5T_conv_int_float); + if((ret = H5Tis_hard(H5T_NATIVE_INT, H5T_NATIVE_FLOAT))!=TRUE) { + H5_FAILED(); + printf("Can't query conversion function\n"); + goto error; + } + + PASSED(); + reset_hdf5(); + + return 0; + + error: + reset_hdf5(); + return 1; +} + + +/*------------------------------------------------------------------------- * Function: test_derived_flt * * Purpose: Tests user-define and query functions of floating-point types. @@ -4769,6 +4829,9 @@ main(void) /* Do the tests */ + /* Test H5Tis_hard() for querying hard conversion. */ + nerrors += test_hard_query(); + /* Test user-define, query functions and software conversion * for user-defined floating-point types */ nerrors += test_derived_flt(); -- cgit v0.12