diff options
author | Raymond Lu <songyulu@hdfgroup.org> | 2004-10-01 19:42:21 (GMT) |
---|---|---|
committer | Raymond Lu <songyulu@hdfgroup.org> | 2004-10-01 19:42:21 (GMT) |
commit | 8231b5f0c94aa6680ad8c8b980e1352f1d50f626 (patch) | |
tree | 4bed76ea2b9b3f17e00ce4991e10b66aa16bf21d | |
parent | 08be85a294f76b57d338fdd46c9224039b0e05f3 (diff) | |
download | hdf5-8231b5f0c94aa6680ad8c8b980e1352f1d50f626.zip hdf5-8231b5f0c94aa6680ad8c8b980e1352f1d50f626.tar.gz hdf5-8231b5f0c94aa6680ad8c8b980e1352f1d50f626.tar.bz2 |
[svn-r9351]
Purpose: enhanced feature
Description: enable size adjustment for compound datatype. The size
can be increased and decreased(as long as the members are not cut).
Solution: mainly check if any member is being cut when decreasing the
size. Others are simply taking out the assertion against 0 size.
Platforms tested: h5committest and fuss.
Misc. update: RELEASE.txt
-rw-r--r-- | release_docs/RELEASE.txt | 4 | ||||
-rw-r--r-- | src/H5T.c | 36 | ||||
-rw-r--r-- | src/H5Tcompound.c | 3 | ||||
-rw-r--r-- | src/H5Tpkg.h | 1 | ||||
-rw-r--r-- | test/dtypes.c | 72 |
5 files changed, 107 insertions, 9 deletions
diff --git a/release_docs/RELEASE.txt b/release_docs/RELEASE.txt index 4c11f62..af1637f 100644 --- a/release_docs/RELEASE.txt +++ b/release_docs/RELEASE.txt @@ -39,6 +39,10 @@ New Features Library: -------- + - Compound datatype has been enhanced with a new feature of size + adjustment. The size can be increased and decreased(without + cutting the last member). No API change is involved. SLU - + 2004/10/1 Parallel Library: ----------------- @@ -1356,8 +1356,8 @@ H5Tcreate(H5T_class_t type, size_t size) FUNC_ENTER_API(H5Tcreate, FAIL); H5TRACE2("i","Ttz",type,size); - /* check args */ - if (size == 0) + /* check args. We start to support size adjustment for compound type. */ + if (size == 0 && type != H5T_COMPOUND) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid size"); /* create the type */ @@ -2629,8 +2629,6 @@ H5T_create(H5T_class_t type, size_t size) FUNC_ENTER_NOAPI(H5T_create, NULL); - assert(size != 0); - switch (type) { case H5T_INTEGER: case H5T_FLOAT: @@ -3378,7 +3376,6 @@ H5T_set_size(H5T_t *dt, size_t size) assert(size!=0); assert(H5T_REFERENCE!=dt->shared->type); assert(!(H5T_ENUM==dt->shared->type && 0==dt->shared->u.enumer.nmembs)); - assert(!(H5T_COMPOUND==dt->shared->type && 0==dt->shared->u.compnd.nmembs)); if (dt->shared->parent) { if (H5T_set_size(dt->shared->parent, size)<0) @@ -3415,8 +3412,33 @@ H5T_set_size(H5T_t *dt, size_t size) break; case H5T_COMPOUND: - if(size<dt->shared->size) - HGOTO_ERROR(H5E_DATATYPE, H5E_BADVALUE, FAIL, "can't shrink compound datatype"); + /* If decreasing size, check the last member isn't being cut. */ + if(size<dt->shared->size) { + int num_membs; + unsigned i, max_index=0; + H5T_t *memb_type; + size_t memb_offset, max_offset=0; + size_t max_size; + + if((num_membs = H5T_get_nmembers(dt))<0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to get number of members"); + + for(i=0; i<num_membs; i++) { + memb_offset = H5T_get_member_offset(dt, i); + if(memb_offset > max_offset) { + max_offset = memb_offset; + max_index = i; + } + } + + if((memb_type = H5T_get_member_type(dt, max_index))==NULL) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to get type of member"); + + max_size = H5T_get_size(memb_type); + + if(size<(max_offset+max_size)) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "size shrinking will cut off last member "); + } break; case H5T_STRING: diff --git a/src/H5Tcompound.c b/src/H5Tcompound.c index f50676f..f9c0035 100644 --- a/src/H5Tcompound.c +++ b/src/H5Tcompound.c @@ -38,7 +38,6 @@ static herr_t H5T_init_compound_interface(void); #define H5T_COMPND_INC 64 /*typical max numb of members per struct */ /* Static local functions */ -static size_t H5T_get_member_offset(H5T_t *dt, int membno); static herr_t H5T_pack(H5T_t *dt); @@ -128,7 +127,7 @@ done: * *------------------------------------------------------------------------- */ -static size_t +size_t H5T_get_member_offset(H5T_t *dt, int membno) { size_t ret_value; diff --git a/src/H5Tpkg.h b/src/H5Tpkg.h index bc2841f..e29b873 100644 --- a/src/H5Tpkg.h +++ b/src/H5Tpkg.h @@ -877,5 +877,6 @@ H5_DLL H5T_t * H5T_array_create(H5T_t *base, int ndims, /* Compound functions */ H5_DLL htri_t H5T_is_packed(H5T_t *dt); +H5_DLL size_t H5T_get_member_offset(H5T_t *dt, int membno); #endif diff --git a/test/dtypes.c b/test/dtypes.c index 00001f3..83e41ad 100644 --- a/test/dtypes.c +++ b/test/dtypes.c @@ -2034,6 +2034,77 @@ test_compound_11(void) /*------------------------------------------------------------------------- + * Function: test_compound_12 + * + * Purpose: Tests size adjustment of compound data types. Start with + * no member and 0 size, increase the size as inserting + * members. + * + * Return: Success: 0 + * + * Failure: number of errors + * + * Programmer: Raymond Lu + * Wednesday, September 29, 2004 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +static int +test_compound_12(void) +{ + complex_t tmp; + hid_t complex_id; + size_t size = 0; + size_t offset, new_size; + herr_t ret; + + TESTING("adjust size of compound data types"); + + /* Create the empty compound type */ + if ((complex_id = H5Tcreate(H5T_COMPOUND, 0))<0) goto error; + + /* Add a couple fields and adjust the size */ + offset = size; + if((size+=H5Tget_size(H5T_NATIVE_DOUBLE))<0) goto error; + if (H5Tset_size(complex_id, size)<0) goto error; + if (H5Tinsert(complex_id, "real", offset, + H5T_NATIVE_DOUBLE)<0) goto error; + + offset = size; + if((size+=H5Tget_size(H5T_NATIVE_DOUBLE))<0) goto error; + if (H5Tset_size(complex_id, size)<0) goto error; + if (H5Tinsert(complex_id, "imaginary", offset, + H5T_NATIVE_DOUBLE)<0) goto error; + + /* Increase and decrease the size. */ + if((size+=H5Tget_size(H5T_NATIVE_DOUBLE))<0) goto error; + if (H5Tset_size(complex_id, size)<0) goto error; + + if((size-=H5Tget_size(H5T_NATIVE_DOUBLE))<0) goto error; + if (H5Tset_size(complex_id, size)<0) goto error; + + /* Verify the size */ + if((new_size=H5Tget_size(complex_id))<0) goto error; + if(new_size!=size) goto error; + + /* Tries to cut last member. Supposed to fail. */ + size--; + H5E_BEGIN_TRY { + H5Tset_size(complex_id, size); + } H5E_END_TRY; + + if (H5Tclose (complex_id)<0) goto error; + PASSED(); + return 0; + + error: + return 1; +} + + +/*------------------------------------------------------------------------- * Function: test_query * * Purpose: Tests query functions of compound and enumeration types. @@ -5216,6 +5287,7 @@ main(void) nerrors += test_compound_9(); nerrors += test_compound_10(); nerrors += test_compound_11(); + nerrors += test_compound_12(); nerrors += test_conv_int (); nerrors += test_conv_enum_1(); nerrors += test_conv_enum_2(); |