summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/H5I.c80
-rw-r--r--src/H5Ipublic.h3
-rw-r--r--test/tid.c46
3 files changed, 102 insertions, 27 deletions
diff --git a/src/H5I.c b/src/H5I.c
index 35d276e..a1d224a 100644
--- a/src/H5I.c
+++ b/src/H5I.c
@@ -373,41 +373,95 @@ H5I_type_t H5I_register_type(H5I_type_t type_id, size_t hash_size, unsigned rese
FUNC_LEAVE_NOAPI(ret_value);
}
+/*-------------------------------------------------------------------------
+ * Function: H5Itype_exists
+ *
+ * Purpose: Query function to inform the user if a given type is
+ * currently registered with the library.
+ *
+ * Return: Success: 1 if the type is registered, 0 if it is not
+ *
+ * Failure: Negative
+ *
+ * Programmer: James Laird
+ * Nathaniel Furrer
+ * Tuesday, June 29, 2004
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t H5Itype_exists(H5I_type_t type)
+{
+ htri_t ret_value = TRUE; /* Return value */
+
+ FUNC_ENTER_API(H5Itype_exists, FAIL);
+
+ if (type<=H5I_BADID || type>=H5I_next_type)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "invalid type number");
+
+ if (H5I_id_type_list_g[type] == NULL)
+ ret_value = FALSE;
+
+done:
+ FUNC_LEAVE_API(ret_value);
+}
+
/*-------------------------------------------------------------------------
* Function: H5Inmembers
*
* Purpose: Returns the number of members in a type. Public interface to
- * H5I_nmembers.
+ * H5I_nmembers. The public interface throws an error if the
+ * supplied type does not exist. This is different than the
+ * private interface, which will just return 0.
*
- * Return: Success: Number of members; zero if the type is empty
- * or has been deleted.
+ * Return: Success: Zero
*
* Failure: Negative
*
* Programmer: James Laird
- * Nathaniel Furrer
+ * Nathaniel Furrer
* Friday, April 23, 2004
*
* Modifications:
+ * June 29, 2004
+ * Nat Furrer and James Laird
+ * Changed function signature to return the number of members
+ * by reference.
*
*-------------------------------------------------------------------------
*/
-int H5Inmembers(H5I_type_t type)
+herr_t H5Inmembers(H5I_type_t type, int *num_members)
{
- int ret_value; /* Return value */
+ int ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(H5Inmembers, FAIL);
- if( H5I_IS_LIB_TYPE( type ) )
- {
- HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, FAIL, "cannot call public function on library type");
- }
+ if( H5I_IS_LIB_TYPE( type ) )
+ {
+ HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, FAIL, "cannot call public function on library type");
+ }
- ret_value = H5I_nmembers(type);
+ /* Validate parameters. This needs to be done here, instead of letting
+ * the private interface handle it, because the public interface throws
+ * an error when the supplied type does not exist.
+ */
+ if (type<=H5I_BADID || type>=H5I_next_type)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "invalid type number");
+ if (NULL==H5I_id_type_list_g[type])
+ HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "supplied type does not exist");
- done:
- FUNC_LEAVE_API(ret_value);
+ if (num_members)
+ {
+ *num_members = H5I_nmembers(type);
+
+ if (*num_members < 0)
+ ret_value = FAIL;
+ }
+
+done:
+ FUNC_LEAVE_API(ret_value);
}
diff --git a/src/H5Ipublic.h b/src/H5Ipublic.h
index c8787c9..67357bb 100644
--- a/src/H5Ipublic.h
+++ b/src/H5Ipublic.h
@@ -93,7 +93,8 @@ H5_DLL int H5Iinc_type_ref(H5I_type_t type);
H5_DLL int H5Idec_type_ref(H5I_type_t type);
H5_DLL int H5Iget_type_ref(H5I_type_t type);
H5_DLL void *H5Isearch(H5I_type_t type, H5I_search_func_t func, void *key);
-H5_DLL int H5Inmembers(H5I_type_t type);
+H5_DLL herr_t H5Inmembers(H5I_type_t type, int *num_members);
+H5_DLL htri_t H5Itype_exists(H5I_type_t type);
#ifdef __cplusplus
diff --git a/test/tid.c b/test/tid.c
index 2ad8481..ed34955 100644
--- a/test/tid.c
+++ b/test/tid.c
@@ -17,7 +17,7 @@ int id_test()
hid_t testID;
ssize_t testSize = -1;
herr_t err;
- int num_ref;
+ int num_ref, num_members;
testObj = malloc(7 * sizeof(int));
@@ -106,9 +106,15 @@ int id_test()
VERIFY(err, 0, "H5Idestroy_type");
if( err != 0)
goto out;
- VERIFY(H5Inmembers(myType), 0, "H5Inmembers");
- if(H5Inmembers(myType) != 0)
+ VERIFY(H5Itype_exists(myType), 0, "H5Itype_exists");
+ if(H5Itype_exists(myType) != 0)
+ goto out;
+
+ H5E_BEGIN_TRY
+ VERIFY(H5Inmembers(myType, NULL), -1, "H5Inmembers");
+ if(H5Inmembers(myType, NULL) != -1)
goto out;
+ H5E_END_TRY
/* Register another type and another object in that type */
myType = H5Iregister_type(64, 0, (H5I_free_t) free );
@@ -123,8 +129,12 @@ int id_test()
CHECK(arrayID, H5I_INVALID_HID, "H5Iregister");
if(arrayID == H5I_INVALID_HID)
goto out;
- VERIFY(H5Inmembers(myType), 1, "H5Inmembers");
- if(H5Inmembers(myType) != 1)
+ err = H5Inmembers(myType, &num_members);
+ CHECK(err, -1, "H5Inmembers");
+ if (err < 0)
+ goto out;
+ VERIFY(num_members, 1, "H5Inmembers");
+ if(num_members != 1)
goto out;
/* Increment references to type and ensure that dec_type_ref
@@ -137,8 +147,12 @@ int id_test()
VERIFY(num_ref, 1, "H5Idec_type_ref");
if(num_ref != 1)
goto out;
- VERIFY(H5Inmembers(myType), 1, "H5Inmembers");
- if(H5Inmembers(myType) != 1)
+ err = H5Inmembers(myType, &num_members);
+ CHECK(err, -1, "H5Inmembers");
+ if (err < 0)
+ goto out;
+ VERIFY(num_members, 1, "H5Inmembers");
+ if(num_members != 1)
goto out;
/* This call to dec_type_ref should destroy the type */
@@ -146,9 +160,15 @@ int id_test()
VERIFY(num_ref, 0, "H5Idec_type_ref");
if(num_ref != 0)
goto out;
- VERIFY(H5Inmembers(myType), 0, "H5Inmembers");
- if(H5Inmembers(myType) != 0)
+ VERIFY(H5Itype_exists(myType), 0, "H5Itype_exists");
+ if (H5Itype_exists(myType) != 0)
+ goto out;
+
+ H5E_BEGIN_TRY
+ err = H5Inmembers(myType, &num_members);
+ if(err >= 0)
goto out;
+ H5E_END_TRY
return 0;
@@ -195,11 +215,11 @@ int id_predefined_test()
goto out;
H5E_BEGIN_TRY
- testInt = H5Inmembers(H5I_ERROR_STACK);
+ testErr = H5Inmembers(H5I_ERROR_STACK, &testInt);
H5E_END_TRY
- VERIFY(testInt, -1, "H5Inmembers");
- if(testInt != -1)
+ VERIFY(testErr, -1, "H5Inmembers");
+ if(testErr != -1)
goto out;
H5E_BEGIN_TRY
@@ -341,4 +361,4 @@ void test_ids()
id_test();
id_predefined_test();
test_id_type_list();
-} \ No newline at end of file
+}