summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/H5T.c77
-rw-r--r--src/H5Tprivate.h1
-rw-r--r--src/H5Tpublic.h1
-rw-r--r--test/dt_arith.c63
4 files changed, 142 insertions, 0 deletions
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();