diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 2003-02-24 20:25:13 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 2003-02-24 20:25:13 (GMT) |
commit | 474a1434bd0b5a84c4cd5a485dd1bc7f47ca334f (patch) | |
tree | ebc424570bbeacb0ff20034de80a8976a616d060 /test | |
parent | f239b2e7f330c8095297fd16993ad3851e7e5232 (diff) | |
download | hdf5-474a1434bd0b5a84c4cd5a485dd1bc7f47ca334f.zip hdf5-474a1434bd0b5a84c4cd5a485dd1bc7f47ca334f.tar.gz hdf5-474a1434bd0b5a84c4cd5a485dd1bc7f47ca334f.tar.bz2 |
[svn-r6436] Purpose:
New internal feature
Description:
Add internal API for building and working with heaps (H5HP). This will be
used for the LRU algorithm in the new metadata cache code.
Platforms tested:
Tested h5committest {arabica (fortran), eirene (fortran, C++)
modi4 (parallel, fortran)}
FreeBSD 4.7 (sleipnir)
Diffstat (limited to 'test')
-rw-r--r-- | test/Dependencies | 13 | ||||
-rw-r--r-- | test/Makefile.in | 30 | ||||
-rw-r--r-- | test/testhdf5.c | 1 | ||||
-rw-r--r-- | test/theap.c | 1057 |
4 files changed, 1090 insertions, 11 deletions
diff --git a/test/Dependencies b/test/Dependencies index bf71e7b..d214d45 100644 --- a/test/Dependencies +++ b/test/Dependencies @@ -1541,6 +1541,19 @@ ttbbt.lo: \ $(top_srcdir)/src/H5Epublic.h \ $(top_srcdir)/src/H5Ipublic.h \ $(top_srcdir)/src/H5TBprivate.h +theap.lo: \ + $(srcdir)/theap.c \ + $(srcdir)/testhdf5.h \ + $(top_srcdir)/src/H5private.h \ + $(top_srcdir)/src/H5public.h \ + $(top_builddir)/src/H5pubconf.h \ + $(top_srcdir)/src/H5api_adpt.h \ + $(top_srcdir)/src/H5MPprivate.h \ + $(top_srcdir)/src/H5FSprivate.h \ + $(top_srcdir)/src/H5Eprivate.h \ + $(top_srcdir)/src/H5Epublic.h \ + $(top_srcdir)/src/H5Ipublic.h \ + $(top_srcdir)/src/H5HPprivate.h ttst.lo: \ $(srcdir)/ttst.c \ $(srcdir)/testhdf5.h \ diff --git a/test/Makefile.in b/test/Makefile.in index 699a099..9ef6006 100644 --- a/test/Makefile.in +++ b/test/Makefile.in @@ -1,10 +1,18 @@ -## HDF5 Library Test Makefile(.in) ## -## Copyright (C) 1997, 2002 -## National Center for Supercomputing Applications. -## All rights reserved. +## Copyright by the Board of Trustees of the University of Illinois. +## All rights reserved. +## +## This file is part of HDF5. The full HDF5 copyright notice, including +## terms governing use, modification, and redistribution, is contained in +## the files COPYING and Copyright.html. COPYING can be found at the root +## of the source code distribution tree; Copyright.html can be found at the +## root level of an installed copy of the electronic HDF5 document set and +## is linked from the top-level documents page. It can also be found at +## http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have +## access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. +## +## HDF5 Library Test Makefile(.in) ## -## top_srcdir=@top_srcdir@ top_builddir=.. srcdir=@srcdir@ @@ -65,8 +73,8 @@ TEST_SRC=big.c bittests.c cmpd_dset.c dsets.c dtypes.c extend.c \ external.c fillval.c flush1.c flush2.c gheap.c h5test.c hyperslab.c \ istore.c lheap.c links.c mount.c mtime.c ohdr.c stab.c tarray.c \ tattr.c tconfig.c testhdf5.c testmeta.c tfile.c tgenprop.c th5s.c \ - titerate.c tmeta.c trefer.c trefstr.c tselect.c ttime.c ttbbt.c \ - ttst.c tvltypes.c tvlstr.c tmisc.c unlink.c enum.c ttsafe.c \ + theap.c titerate.c tmeta.c trefer.c trefstr.c tselect.c ttime.c \ + ttbbt.c ttst.c tvltypes.c tvlstr.c tmisc.c unlink.c enum.c ttsafe.c \ ttsafe_dcreate.c ttsafe_error.c ttsafe_cancel.c ttsafe_acreate.c \ gass_write.c gass_read.c gass_append.c srb_read.c srb_write.c \ srb_append.c stream_test.c set_extent.c getname.c file_handle.c \ @@ -90,11 +98,11 @@ timings _timings: $(TIMINGS) ## How to build the tests... They all depend on the test and hdf5 libraries. $(TEST_PROGS): $(LIB) $(LIBHDF5) -TESTHDF5_OBJ=testhdf5.lo tarray.lo tattr.lo tconfig.lo tfile.lo tgenprop.lo \ - th5s.lo titerate.lo tmeta.lo ttime.lo trefer.lo trefstr.lo tselect.lo \ - ttbbt.lo ttst.lo tvltypes.lo tvlstr.lo tmisc.lo +TESTHDF5_OBJ=testhdf5.lo tarray.lo tattr.lo tconfig.lo tfile.lo tgenprop.lo \ + th5s.lo theap.lo titerate.lo tmeta.lo ttime.lo trefer.lo trefstr.lo \ + tselect.lo ttbbt.lo ttst.lo tvltypes.lo tvlstr.lo tmisc.lo -TTS_OBJ=ttsafe.lo ttsafe_dcreate.lo ttsafe_error.lo ttsafe_cancel.lo \ +TTS_OBJ=ttsafe.lo ttsafe_dcreate.lo ttsafe_error.lo ttsafe_cancel.lo \ ttsafe_acreate.lo testhdf5: $(TESTHDF5_OBJ) diff --git a/test/testhdf5.c b/test/testhdf5.c index 08d718a..b3c29a7 100644 --- a/test/testhdf5.c +++ b/test/testhdf5.c @@ -158,6 +158,7 @@ main(int argc, char *argv[]) InitTest("metadata", test_metadata, cleanup_metadata, "Encode/decode metadata code"); InitTest("tbbt", test_tbbt, NULL, "Threaded, Balanced, Binary Trees"); InitTest("tst", test_tst, NULL, "Ternary Search Trees"); + InitTest("heap", test_heap, NULL, "Memory Heaps"); InitTest("refstr", test_refstr, NULL, "Reference Counted Strings"); InitTest("file", test_file, cleanup_file, "Low-Level File I/O"); InitTest("h5s", test_h5s, cleanup_h5s, "Dataspaces"); diff --git a/test/theap.c b/test/theap.c new file mode 100644 index 0000000..b02055e --- /dev/null +++ b/test/theap.c @@ -0,0 +1,1057 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + Test HDF Heap routines. + + REMARKS + + DESIGN + + BUGS/LIMITATIONS + + EXPORTED ROUTINES + + AUTHOR + Quincey Koziol + + MODIFICATION HISTORY + 2/18/03 - Started coding + */ + +#include <time.h> +#include <stdlib.h> + +#include "testhdf5.h" +#include "H5HPprivate.h" + +/* The number of elements in testing arrays */ +#define NUM_ELEMS 1000 + +/* Objects for testing in heaps */ +typedef struct test_obj { + H5HP_info_t heap_info; /* Information required for heap. _MUST_ be first */ + int val; /* Actual information for object */ +} test_obj; + +/* Array of random element values */ +static test_obj rand_num[NUM_ELEMS]; + +/* Array of random elements values, sorted in increasing order */ +static test_obj inc_sort_num[NUM_ELEMS]; + +/* Array of random elements values, sorted in decreasing order */ +static test_obj dec_sort_num[NUM_ELEMS]; + +static int tst_dec_sort(const void *_i1, const void *_i2) +{ + const test_obj *i1=(const test_obj *)_i1; + const test_obj *i2=(const test_obj *)_i2; + + if(i1->val<i2->val) + return(1); + else if(i1->val>i2->val) + return(-1); + return(0); +} + +static int tst_inc_sort(const void *_i1, const void *_i2) +{ + const test_obj *i1=(const test_obj *)_i1; + const test_obj *i2=(const test_obj *)_i2; + + if(i1->val<i2->val) + return(-1); + else if(i1->val>i2->val) + return(1); + return(0); +} + +/**************************************************************** +** +** test_heap_init(): Test H5HP (heap) code. +** Initialize data for Heap testing +** +****************************************************************/ +static void +test_heap_init(void) +{ + time_t curr_time; /* Current time, for seeding random number generator */ + size_t u; /* Local index variables */ + + /* Create randomized set of numbers */ + curr_time=time(NULL); + HDsrandom((unsigned long)curr_time); + for(u=0; u<NUM_ELEMS; u++) + /* Generate random numbers from -1000 to 1000 */ + rand_num[u].val=(HDrandom()%2001)-1001; + + /* Sort random numbers into increasing order */ + HDmemcpy(inc_sort_num,rand_num,sizeof(test_obj)*NUM_ELEMS); + HDqsort(inc_sort_num,NUM_ELEMS,sizeof(test_obj),tst_inc_sort); + + /* Sort random numbers into decreasing order */ + HDmemcpy(dec_sort_num,rand_num,sizeof(test_obj)*NUM_ELEMS); + HDqsort(dec_sort_num,NUM_ELEMS,sizeof(test_obj),tst_dec_sort); +} /* end test_tst_init() */ + +/**************************************************************** +** +** test_heap_create(): Test basic H5HP (heap) code. +** Tests creating and closing heaps. +** +****************************************************************/ +static void +test_heap_create(void) +{ + H5HP_t *heap; /* Heap created */ + herr_t ret; /* Generic return value */ + + /* Output message about test being performed */ + MESSAGE(6, ("Testing Creating & Closing Heaps\n")); + + /* Try creating a maximum Heap */ + heap=H5HP_create(H5HP_MAX_HEAP); + CHECK(heap, NULL, "H5HP_create"); + + /* Try closing the heap */ + ret=H5HP_close(heap); + CHECK(ret, FAIL, "H5HP_close"); + + /* Try creating a minimum Heap */ + heap=H5HP_create(H5HP_MIN_HEAP); + CHECK(heap, NULL, "H5HP_create"); + + /* Try closing the heap */ + ret=H5HP_close(heap); + CHECK(ret, FAIL, "H5HP_close"); + +} /* end test_heap_create() */ + +/**************************************************************** +** +** test_heap_insert_min(): Test H5HP (heap) code. +** Tests basic inserting objects into minimum heaps. +** +****************************************************************/ +static void +test_heap_insert_min(void) +{ + H5HP_t *heap; /* Heap created */ + ssize_t num; /* Number of elements in heap */ + int val; /* Value of object on heap */ + test_obj obj1, obj2, obj3; /* Test objects to insert */ + herr_t ret; /* Generic return value */ + + /* Output message about test being performed */ + MESSAGE(7, ("Testing Inserting Into Minimum Heaps\n")); + + /* Create a Heap */ + heap=H5HP_create(H5HP_MIN_HEAP); + CHECK(heap, NULL, "H5HP_create"); + + /* Check that the heap has no elements */ + num=H5HP_count(heap); + VERIFY(num, 0, "H5HP_count"); + + /* Insert an object into the heap */ + obj1.val=100; + ret=H5HP_insert(heap,10,&obj1); + CHECK(ret, FAIL, "H5HP_insert"); + + /* Check that the heap has one element */ + num=H5HP_count(heap); + VERIFY(num, 1, "H5HP_count"); + + /* Check the minimum value on the heap */ + ret=H5HP_top(heap, &val); + CHECK(ret, FAIL, "H5HP_top"); + VERIFY(val, 10, "H5HP_top"); + + /* Insert another object into the heap, with value less than top element */ + obj2.val=50; + ret=H5HP_insert(heap,5,&obj2); + CHECK(ret, FAIL, "H5HP_insert"); + + /* Check that the heap has two elements */ + num=H5HP_count(heap); + VERIFY(num, 2, "H5HP_count"); + + /* Check the minimum value on the heap */ + ret=H5HP_top(heap, &val); + CHECK(ret, FAIL, "H5HP_top"); + VERIFY(val, 5, "H5HP_top"); + + /* Insert third object into the heap, with value greater than top element */ + obj3.val=200; + ret=H5HP_insert(heap,20,&obj3); + CHECK(ret, FAIL, "H5HP_insert"); + + /* Check that the heap has three elements */ + num=H5HP_count(heap); + VERIFY(num, 3, "H5HP_count"); + + /* Check the minimum value on the heap */ + ret=H5HP_top(heap, &val); + CHECK(ret, FAIL, "H5HP_top"); + VERIFY(val, 5, "H5HP_top"); + + /* Close the heap */ + ret=H5HP_close(heap); + CHECK(ret, FAIL, "H5HP_close"); + +} /* end test_heap_insert_min() */ + +/**************************************************************** +** +** test_heap_insert(): Test H5HP (heap) code. +** Tests basic inserting objects into maximum heaps. +** +****************************************************************/ +static void +test_heap_insert_max(void) +{ + H5HP_t *heap; /* Heap created */ + ssize_t num; /* Number of elements in heap */ + int val; /* Value of object on heap */ + test_obj obj1, obj2, obj3; /* Test objects to insert */ + herr_t ret; /* Generic return value */ + + /* Output message about test being performed */ + MESSAGE(7, ("Testing Inserting Into Maximum Heaps\n")); + + /* Create a Heap */ + heap=H5HP_create(H5HP_MAX_HEAP); + CHECK(heap, NULL, "H5HP_create"); + + /* Check that the heap has no elements */ + num=H5HP_count(heap); + VERIFY(num, 0, "H5HP_count"); + + /* Insert an object into the heap */ + obj1.val=100; + ret=H5HP_insert(heap,10,&obj1); + CHECK(ret, FAIL, "H5HP_insert"); + + /* Check that the heap has one element */ + num=H5HP_count(heap); + VERIFY(num, 1, "H5HP_count"); + + /* Check the maximum value on the heap */ + ret=H5HP_top(heap, &val); + CHECK(ret, FAIL, "H5HP_top"); + VERIFY(val, 10, "H5HP_top"); + + /* Insert another object into the heap, with value less than top element */ + obj2.val=50; + ret=H5HP_insert(heap,5,&obj2); + CHECK(ret, FAIL, "H5HP_insert"); + + /* Check that the heap has two elements */ + num=H5HP_count(heap); + VERIFY(num, 2, "H5HP_count"); + + /* Check the maximum value on the heap */ + ret=H5HP_top(heap, &val); + CHECK(ret, FAIL, "H5HP_top"); + VERIFY(val, 10, "H5HP_top"); + + /* Insert third object into the heap, with value greater than top element */ + obj3.val=200; + ret=H5HP_insert(heap,20,&obj3); + CHECK(ret, FAIL, "H5HP_insert"); + + /* Check that the heap has three elements */ + num=H5HP_count(heap); + VERIFY(num, 3, "H5HP_count"); + + /* Check the maximum value on the heap */ + ret=H5HP_top(heap, &val); + CHECK(ret, FAIL, "H5HP_top"); + VERIFY(val, 20, "H5HP_top"); + + /* Close the heap */ + ret=H5HP_close(heap); + CHECK(ret, FAIL, "H5HP_close"); + +} /* end test_heap_insert_max() */ + +/**************************************************************** +** +** test_heap_insert(): Test H5HP (heap) code. +** Tests basic inserting objects into heaps. +** +****************************************************************/ +static void +test_heap_insert(void) +{ + /* Output message about test being performed */ + MESSAGE(6, ("Testing Inserting Into Heaps\n")); + + /* Test insertions into minimum & maximum heaps */ + test_heap_insert_max(); + test_heap_insert_min(); +} /* end test_heap_insert() */ + +/**************************************************************** +** +** test_heap_insert_many_core (): Tests H5HP (heap) code. +** "Core" routine called by test_heap_insert_many() routine. +** +****************************************************************/ +static void test_heap_insert_many_core(H5HP_type_t heap_type, test_obj *arr, size_t nelem, int top_val) +{ + H5HP_t *heap; /* Heap created */ + ssize_t num; /* Number of elements in heap */ + int val; /* Value of object on heap */ + size_t u; /* Local index variable */ + herr_t ret; /* Generic return value */ + + /* Create a Heap */ + heap=H5HP_create(heap_type); + CHECK(heap, NULL, "H5HP_create"); + + /* Check that the heap has no elements */ + num=H5HP_count(heap); + VERIFY(num, 0, "H5HP_count"); + + /* Insert the array elements into the heap */ + for(u=0; u<nelem; u++) { + ret=H5HP_insert(heap,arr[u].val,&arr[u]); + CHECK(ret, FAIL, "H5HP_insert"); + } /* end for */ + + /* Check that the heap has correct number of elements */ + num=H5HP_count(heap); + CHECK(num, FAIL, "H5HP_count"); + VERIFY((size_t)num, nelem, "H5HP_count"); + + /* Check the maximum value on the heap */ + ret=H5HP_top(heap, &val); + CHECK(ret, FAIL, "H5HP_top"); + VERIFY(val, top_val, "H5HP_top"); + + /* Close the heap */ + ret=H5HP_close(heap); + CHECK(ret, FAIL, "H5HP_close"); +} /* end test_heap_insert_many_core() */ + +/**************************************************************** +** +** test_heap_insert_many (): Test H5HP (heap) code. +** Tests inserting many objects into heaps. +** +****************************************************************/ +static void +test_heap_insert_many(void) +{ + /* Output message about test being performed */ + MESSAGE(6, ("Testing Inserting Many Objects Into Heaps\n")); + + /* Test creating a heap from random elements */ + test_heap_insert_many_core(H5HP_MAX_HEAP, rand_num,NUM_ELEMS,dec_sort_num[0].val); + + /* Test creating a heap from elements in increasing order */ + test_heap_insert_many_core(H5HP_MAX_HEAP, inc_sort_num,NUM_ELEMS,dec_sort_num[0].val); + + /* Test creating a heap from elements in decreasing order */ + test_heap_insert_many_core(H5HP_MAX_HEAP, dec_sort_num,NUM_ELEMS,dec_sort_num[0].val); + + /* Test creating a heap from random elements */ + test_heap_insert_many_core(H5HP_MIN_HEAP, rand_num,NUM_ELEMS,inc_sort_num[0].val); + + /* Test creating a heap from elements in increasing order */ + test_heap_insert_many_core(H5HP_MIN_HEAP, inc_sort_num,NUM_ELEMS,inc_sort_num[0].val); + + /* Test creating a heap from elements in decreasing order */ + test_heap_insert_many_core(H5HP_MIN_HEAP, dec_sort_num,NUM_ELEMS,inc_sort_num[0].val); + +} /* end test_heap_insert_many() */ + +/**************************************************************** +** +** test_heap_remove_min(): Test H5HP (heap) code. +** Tests basic removal of objects from minimum heaps. +** +****************************************************************/ +static void +test_heap_remove_min(void) +{ + H5HP_t *heap; /* Heap created */ + ssize_t num; /* Number of elements in heap */ + int val; /* Value of object on heap */ + void *ptr; /* Pointer for object on heap */ + test_obj obj1, obj2, obj3; /* Test objects to insert */ + herr_t ret; /* Generic return value */ + + /* Output message about test being performed */ + MESSAGE(7, ("Testing Removing From Minimum Heaps\n")); + + /* Create a Heap */ + heap=H5HP_create(H5HP_MIN_HEAP); + CHECK(heap, NULL, "H5HP_create"); + + /* Check that the heap has no elements */ + num=H5HP_count(heap); + VERIFY(num, 0, "H5HP_count"); + + /* Try removing an object from an empty heap */ + ret=H5HP_remove(heap,&val,&ptr); + VERIFY(ret, FAIL, "H5HP_remove"); + + /* Insert an object into the heap */ + obj1.val=100; + ret=H5HP_insert(heap,10,&obj1); + CHECK(ret, FAIL, "H5HP_insert"); + + /* Insert another object into the heap, with value less than top element */ + obj2.val=50; + ret=H5HP_insert(heap,5,&obj2); + CHECK(ret, FAIL, "H5HP_insert"); + + /* Insert third object into the heap, with value greater than top element */ + obj3.val=200; + ret=H5HP_insert(heap,20,&obj3); + CHECK(ret, FAIL, "H5HP_insert"); + + /* Remove first maximum value from heap */ + ret=H5HP_remove(heap,&val,&ptr); + CHECK(ret, FAIL, "H5HP_remove"); + VERIFY(val, 5, "H5HP_remove"); + VERIFY(ptr, &obj2, "H5HP_remove"); + + /* Remove second maximum value from heap */ + ret=H5HP_remove(heap,&val,&ptr); + CHECK(ret, FAIL, "H5HP_remove"); + VERIFY(val, 10, "H5HP_remove"); + VERIFY(ptr, &obj1, "H5HP_remove"); + + /* Remove third maximum value from heap */ + ret=H5HP_remove(heap,&val,&ptr); + CHECK(ret, FAIL, "H5HP_remove"); + VERIFY(val, 20, "H5HP_remove"); + VERIFY(ptr, &obj3, "H5HP_remove"); + + /* Try removing an object from an empty heap */ + ret=H5HP_remove(heap,&val,&ptr); + VERIFY(ret, FAIL, "H5HP_remove"); + + /* Close the heap */ + ret=H5HP_close(heap); + CHECK(ret, FAIL, "H5HP_close"); + +} /* end test_heap_remove_min() */ + +/**************************************************************** +** +** test_heap_remove_max(): Test H5HP (heap) code. +** Tests basic removal of objects from maximum heaps. +** +****************************************************************/ +static void +test_heap_remove_max(void) +{ + H5HP_t *heap; /* Heap created */ + ssize_t num; /* Number of elements in heap */ + int val; /* Value of object on heap */ + void *ptr; /* Pointer for object on heap */ + test_obj obj1, obj2, obj3; /* Test objects to insert */ + herr_t ret; /* Generic return value */ + + /* Output message about test being performed */ + MESSAGE(7, ("Testing Removing From Maximum Heaps\n")); + + /* Create a Heap */ + heap=H5HP_create(H5HP_MAX_HEAP); + CHECK(heap, NULL, "H5HP_create"); + + /* Check that the heap has no elements */ + num=H5HP_count(heap); + VERIFY(num, 0, "H5HP_count"); + + /* Try removing an object from an empty heap */ + ret=H5HP_remove(heap,&val,&ptr); + VERIFY(ret, FAIL, "H5HP_remove"); + + /* Insert an object into the heap */ + obj1.val=100; + ret=H5HP_insert(heap,10,&obj1); + CHECK(ret, FAIL, "H5HP_insert"); + + /* Insert another object into the heap, with value less than top element */ + obj2.val=50; + ret=H5HP_insert(heap,5,&obj2); + CHECK(ret, FAIL, "H5HP_insert"); + + /* Insert third object into the heap, with value greater than top element */ + obj3.val=200; + ret=H5HP_insert(heap,20,&obj3); + CHECK(ret, FAIL, "H5HP_insert"); + + /* Remove first maximum value from heap */ + ret=H5HP_remove(heap,&val,&ptr); + CHECK(ret, FAIL, "H5HP_remove"); + VERIFY(val, 20, "H5HP_remove"); + VERIFY(ptr, &obj3, "H5HP_remove"); + + /* Remove second maximum value from heap */ + ret=H5HP_remove(heap,&val,&ptr); + CHECK(ret, FAIL, "H5HP_remove"); + VERIFY(val, 10, "H5HP_remove"); + VERIFY(ptr, &obj1, "H5HP_remove"); + + /* Remove third maximum value from heap */ + ret=H5HP_remove(heap,&val,&ptr); + CHECK(ret, FAIL, "H5HP_remove"); + VERIFY(val, 5, "H5HP_remove"); + VERIFY(ptr, &obj2, "H5HP_remove"); + + /* Try removing an object from an empty heap */ + ret=H5HP_remove(heap,&val,&ptr); + VERIFY(ret, FAIL, "H5HP_remove"); + + /* Close the heap */ + ret=H5HP_close(heap); + CHECK(ret, FAIL, "H5HP_close"); + +} /* end test_heap_remove_max() */ + +/**************************************************************** +** +** test_heap_remove(): Test H5HP (heap) code. +** Tests basic removal of objects from minimum & maximum heaps. +** +****************************************************************/ +static void +test_heap_remove(void) +{ + /* Output message about test being performed */ + MESSAGE(6, ("Testing Removing From Heaps\n")); + + /* Test removals from minimum & maximum heaps */ + test_heap_remove_max(); + test_heap_remove_min(); +} /* end test_heap_remove() */ + +/**************************************************************** +** +** test_heap_remove_many_core (): Tests H5HP (heap) code. +** "Core" routine called by test_heap_remove_many() routine. +** +****************************************************************/ +static void test_heap_remove_many_core(H5HP_type_t heap_type, test_obj *arr, size_t nelem) +{ + H5HP_t *heap; /* Heap created */ + ssize_t num; /* Number of elements in heap */ + int last_val; /* Last value from the heap */ + int val; /* Value of object on heap */ + test_obj *ptr; /* Pointer for object on heap */ + size_t u; /* Local index variable */ + herr_t ret; /* Generic return value */ + + /* Create a Heap */ + heap=H5HP_create(heap_type); + CHECK(heap, NULL, "H5HP_create"); + + /* Check that the heap has no elements */ + num=H5HP_count(heap); + VERIFY(num, 0, "H5HP_count"); + + /* Insert the array elements into the heap */ + for(u=0; u<nelem; u++) { + ret=H5HP_insert(heap,arr[u].val,&arr[u]); + CHECK(ret, FAIL, "H5HP_insert"); + } /* end for */ + + /* Check that the heap has correct number of elements */ + num=H5HP_count(heap); + CHECK(num, FAIL, "H5HP_count"); + VERIFY((size_t)num, nelem, "H5HP_count"); + + /* Set an appropriate starting value for the "last" value from heap */ + if(heap_type==H5HP_MAX_HEAP) + last_val=INT_MAX; + else + last_val=INT_MIN; + + /* Remove the objects from the heap */ + for(u=0; u<nelem; u++) { + ret=H5HP_remove(heap,&val,(void **)&ptr); + CHECK(ret, FAIL, "H5HP_remove"); + VERIFY(val, ptr->val, "H5HP_remove"); + + /* Check that the value is correct, based on the heap type */ + if(heap_type==H5HP_MAX_HEAP) { + if(val>last_val) { + num_errs++; + printf("Error on line %d: incorrect value from heap=%d, last_val=%d\n",__LINE__,val,last_val); + } /* end if */ + } /* end if */ + else { + if(val<last_val) { + num_errs++; + printf("Error on line %d: incorrect value from heap=%d, last_val=%d\n",__LINE__,val,last_val); + } /* end if */ + } /* end else */ + + /* Update last value */ + last_val=val; + } /* end for */ + + /* Check that the heap has no elements */ + num=H5HP_count(heap); + VERIFY(num, 0, "H5HP_count"); + +/* Insert & remove again, to check that completely empty heaps can be added again */ + + /* Set an appropriate starting value for the "last" value from heap */ + if(heap_type==H5HP_MAX_HEAP) + last_val=INT_MAX; + else + last_val=INT_MIN; + + /* Insert the array elements into the heap */ + for(u=0; u<nelem; u++) { + ret=H5HP_insert(heap,arr[u].val,&arr[u]); + CHECK(ret, FAIL, "H5HP_insert"); + } /* end for */ + + /* Check that the heap has correct number of elements */ + num=H5HP_count(heap); + CHECK(num, FAIL, "H5HP_count"); + VERIFY((size_t)num, nelem, "H5HP_count"); + + /* Remove the objects from the heap */ + for(u=0; u<nelem; u++) { + ret=H5HP_remove(heap,&val,(void **)&ptr); + CHECK(ret, FAIL, "H5HP_remove"); + VERIFY(val, ptr->val, "H5HP_remove"); + + /* Check that the value is correct, based on the heap type */ + if(heap_type==H5HP_MAX_HEAP) { + if(val>last_val) { + num_errs++; + printf("Error on line %d: incorrect value from heap=%d, last_val=%d\n",__LINE__,val,last_val); + } /* end if */ + } /* end if */ + else { + if(val<last_val) { + num_errs++; + printf("Error on line %d: incorrect value from heap=%d, last_val=%d\n",__LINE__,val,last_val); + } /* end if */ + } /* end else */ + + /* Update last value */ + last_val=val; + } /* end for */ + + /* Check that the heap has no elements */ + num=H5HP_count(heap); + VERIFY(num, 0, "H5HP_count"); + + /* Close the heap */ + ret=H5HP_close(heap); + CHECK(ret, FAIL, "H5HP_close"); +} /* end test_heap_remove_many_core() */ + +/**************************************************************** +** +** test_heap_remove_many (): Test H5HP (heap) code. +** Tests removing many objects into heaps. +** +****************************************************************/ +static void +test_heap_remove_many(void) +{ + /* Output message about test being performed */ + MESSAGE(6, ("Testing Removing Many Objects From Heaps\n")); + + /* Test removing objects from maximum heap with random elements */ + test_heap_remove_many_core(H5HP_MAX_HEAP, rand_num,NUM_ELEMS); + + /* Test removing objects from maximum heap with elements already sorted in increasing order */ + test_heap_remove_many_core(H5HP_MAX_HEAP, inc_sort_num,NUM_ELEMS); + + /* Test removing objects from maximum heap with elements already sorted in decreasing order */ + test_heap_remove_many_core(H5HP_MAX_HEAP, dec_sort_num,NUM_ELEMS); + + /* Test removing objects from minimum heap with random elements */ + test_heap_remove_many_core(H5HP_MIN_HEAP, rand_num,NUM_ELEMS); + + /* Test removing objects from minimum heap with elements already sorted in increasing order */ + test_heap_remove_many_core(H5HP_MIN_HEAP, inc_sort_num,NUM_ELEMS); + + /* Test removing objects from minimum heap with elements already sorted in decreasing order */ + test_heap_remove_many_core(H5HP_MIN_HEAP, dec_sort_num,NUM_ELEMS); + +} /* end test_heap_remove_many() */ + +/**************************************************************** +** +** test_heap_change_min (): Test H5HP (heap) code. +** Tests changing the priority of an object in a minimum heap +** +****************************************************************/ +static void +test_heap_change_min(void) +{ + H5HP_t *heap; /* Heap created */ + ssize_t num; /* Number of elements in heap */ + int val; /* Value of object on heap */ + test_obj obj1, obj2, obj3; /* Test objects to insert */ + herr_t ret; /* Generic return value */ + + /* Output message about test being performed */ + MESSAGE(7, ("Testing Changing Priority of Objects in Minimum Heaps\n")); + + /* Create a Heap */ + heap=H5HP_create(H5HP_MIN_HEAP); + CHECK(heap, NULL, "H5HP_create"); + + /* Check that the heap has no elements */ + num=H5HP_count(heap); + VERIFY(num, 0, "H5HP_count"); + + /* Insert an object into the heap */ + obj1.val=100; + ret=H5HP_insert(heap,10,&obj1); + CHECK(ret, FAIL, "H5HP_insert"); + + /* Insert another object into the heap, with value less than top element */ + obj2.val=50; + ret=H5HP_insert(heap,5,&obj2); + CHECK(ret, FAIL, "H5HP_insert"); + + /* Insert third object into the heap, with value greater than top element */ + obj3.val=200; + ret=H5HP_insert(heap,20,&obj3); + CHECK(ret, FAIL, "H5HP_insert"); + + /* Change priority of first object on heap in way which shouldn't affect heap order */ + ret=H5HP_change(heap,11,&obj1); + CHECK(ret, FAIL, "H5HP_change"); + + /* Check the minimum value on the heap */ + ret=H5HP_top(heap, &val); + CHECK(ret, FAIL, "H5HP_top"); + VERIFY(val, 5, "H5HP_top"); + + /* Change priority of first object on heap to be the top object on the heap */ + ret=H5HP_change(heap,3,&obj1); + CHECK(ret, FAIL, "H5HP_change"); + + /* Check the maximum value on the heap */ + ret=H5HP_top(heap, &val); + CHECK(ret, FAIL, "H5HP_top"); + VERIFY(val, 3, "H5HP_top"); + + /* Change priority of first object on heap to not be the top object on the heap */ + ret=H5HP_change(heap,10,&obj1); + CHECK(ret, FAIL, "H5HP_change"); + + /* Check the maximum value on the heap */ + ret=H5HP_top(heap, &val); + CHECK(ret, FAIL, "H5HP_top"); + VERIFY(val, 5, "H5HP_top"); + + /* Close the heap */ + ret=H5HP_close(heap); + CHECK(ret, FAIL, "H5HP_close"); + +} /* end test_heap_change_min() */ + +/**************************************************************** +** +** test_heap_change_max (): Test H5HP (heap) code. +** Tests changing the priority of an object in a maximumheap +** +****************************************************************/ +static void +test_heap_change_max(void) +{ + H5HP_t *heap; /* Heap created */ + ssize_t num; /* Number of elements in heap */ + int val; /* Value of object on heap */ + test_obj obj1, obj2, obj3; /* Test objects to insert */ + herr_t ret; /* Generic return value */ + + /* Output message about test being performed */ + MESSAGE(7, ("Testing Changing Priority of Objects in Maximum Heaps\n")); + + /* Create a Heap */ + heap=H5HP_create(H5HP_MAX_HEAP); + CHECK(heap, NULL, "H5HP_create"); + + /* Check that the heap has no elements */ + num=H5HP_count(heap); + VERIFY(num, 0, "H5HP_count"); + + /* Insert an object into the heap */ + obj1.val=100; + ret=H5HP_insert(heap,10,&obj1); + CHECK(ret, FAIL, "H5HP_insert"); + + /* Insert another object into the heap, with value less than top element */ + obj2.val=50; + ret=H5HP_insert(heap,5,&obj2); + CHECK(ret, FAIL, "H5HP_insert"); + + /* Insert third object into the heap, with value greater than top element */ + obj3.val=200; + ret=H5HP_insert(heap,20,&obj3); + CHECK(ret, FAIL, "H5HP_insert"); + + /* Change priority of first object on heap in way which shouldn't affect heap order */ + ret=H5HP_change(heap,11,&obj1); + CHECK(ret, FAIL, "H5HP_change"); + + /* Check the maximum value on the heap */ + ret=H5HP_top(heap, &val); + CHECK(ret, FAIL, "H5HP_top"); + VERIFY(val, 20, "H5HP_top"); + + /* Change priority of first object on heap to be the top object on the heap */ + ret=H5HP_change(heap,21,&obj1); + CHECK(ret, FAIL, "H5HP_change"); + + /* Check the maximum value on the heap */ + ret=H5HP_top(heap, &val); + CHECK(ret, FAIL, "H5HP_top"); + VERIFY(val, 21, "H5HP_top"); + + /* Change priority of first object on heap to not be the top object on the heap */ + ret=H5HP_change(heap,10,&obj1); + CHECK(ret, FAIL, "H5HP_change"); + + /* Check the maximum value on the heap */ + ret=H5HP_top(heap, &val); + CHECK(ret, FAIL, "H5HP_top"); + VERIFY(val, 20, "H5HP_top"); + + /* Close the heap */ + ret=H5HP_close(heap); + CHECK(ret, FAIL, "H5HP_close"); + +} /* end test_heap_change() */ + +/**************************************************************** +** +** test_heap_change (): Test H5HP (heap) code. +** Tests changing the priority of an object in maximum & minimum heaps +** +****************************************************************/ +static void +test_heap_change(void) +{ + /* Output message about test being performed */ + MESSAGE(6, ("Testing Changing Priority of Objects in Heaps\n")); + + /* Test removals from minimum & maximum heaps */ + test_heap_change_max(); + test_heap_change_min(); +} /* end test_heap_change() */ + +/**************************************************************** +** +** test_heap_incdec_min (): Test H5HP (heap) code. +** Tests incrementing & decrementing priority of objects on +** a minimum heap. +** +****************************************************************/ +static void +test_heap_incdec_min(void) +{ + H5HP_t *heap; /* Heap created */ + ssize_t num; /* Number of elements in heap */ + int val; /* Value of object on heap */ + test_obj obj1, obj2, obj3; /* Test objects to insert */ + herr_t ret; /* Generic return value */ + + /* Output message about test being performed */ + MESSAGE(7, ("Testing Incrementing & Decrementing Priority of Objects in Minimum Heaps\n")); + + /* Create a Heap */ + heap=H5HP_create(H5HP_MIN_HEAP); + CHECK(heap, NULL, "H5HP_create"); + + /* Check that the heap has no elements */ + num=H5HP_count(heap); + VERIFY(num, 0, "H5HP_count"); + + /* Insert an object into the heap */ + obj1.val=100; + ret=H5HP_insert(heap,6,&obj1); + CHECK(ret, FAIL, "H5HP_insert"); + + /* Insert another object into the heap, with value less than top element */ + obj2.val=50; + ret=H5HP_insert(heap,5,&obj2); + CHECK(ret, FAIL, "H5HP_insert"); + + /* Insert third object into the heap, with value greater than top element */ + obj3.val=200; + ret=H5HP_insert(heap,20,&obj3); + CHECK(ret, FAIL, "H5HP_insert"); + + /* Decrement object one's priority by two to put it on top of the heap */ + ret=H5HP_decr(heap, 2, &obj1); + CHECK(ret, FAIL, "H5HP_change"); + + /* Check the minimum value on the heap */ + ret=H5HP_top(heap, &val); + CHECK(ret, FAIL, "H5HP_top"); + VERIFY(val, 4, "H5HP_top"); + + /* Decrement object two's priority by two to put it back on top of the heap */ + ret=H5HP_decr(heap, 2, &obj2); + CHECK(ret, FAIL, "H5HP_change"); + + /* Check the minimum value on the heap */ + ret=H5HP_top(heap, &val); + CHECK(ret, FAIL, "H5HP_top"); + VERIFY(val, 3, "H5HP_top"); + + /* Increment object two's priority by two to return object one to the top */ + ret=H5HP_incr(heap,2,&obj2); + CHECK(ret, FAIL, "H5HP_change"); + + /* Check the minimum value on the heap */ + ret=H5HP_top(heap, &val); + CHECK(ret, FAIL, "H5HP_top"); + VERIFY(val, 4, "H5HP_top"); + + /* Close the heap */ + ret=H5HP_close(heap); + CHECK(ret, FAIL, "H5HP_close"); + +} /* end test_heap_incdec_min() */ + +/**************************************************************** +** +** test_heap_incdec_max (): Test H5HP (heap) code. +** Tests incrementing & decrementing priority of objects on +** a maximum heap. +** +****************************************************************/ +static void +test_heap_incdec_max(void) +{ + H5HP_t *heap; /* Heap created */ + ssize_t num; /* Number of elements in heap */ + int val; /* Value of object on heap */ + test_obj obj1, obj2, obj3; /* Test objects to insert */ + herr_t ret; /* Generic return value */ + + /* Output message about test being performed */ + MESSAGE(7, ("Testing Incrementing & Decrementing Priority of Objects in Maximum Heaps\n")); + + /* Create a Heap */ + heap=H5HP_create(H5HP_MAX_HEAP); + CHECK(heap, NULL, "H5HP_create"); + + /* Check that the heap has no elements */ + num=H5HP_count(heap); + VERIFY(num, 0, "H5HP_count"); + + /* Insert an object into the heap */ + obj1.val=100; + ret=H5HP_insert(heap,19,&obj1); + CHECK(ret, FAIL, "H5HP_insert"); + + /* Insert another object into the heap, with value less than top element */ + obj2.val=50; + ret=H5HP_insert(heap,5,&obj2); + CHECK(ret, FAIL, "H5HP_insert"); + + /* Insert third object into the heap, with value greater than top element */ + obj3.val=200; + ret=H5HP_insert(heap,20,&obj3); + CHECK(ret, FAIL, "H5HP_insert"); + + /* Increment object one's priority by two to put it on top of the heap */ + ret=H5HP_incr(heap, 2, &obj1); + CHECK(ret, FAIL, "H5HP_change"); + + /* Check the maximum value on the heap */ + ret=H5HP_top(heap, &val); + CHECK(ret, FAIL, "H5HP_top"); + VERIFY(val, 21, "H5HP_top"); + + /* Increment object three's priority by two to put it back on top of the heap */ + ret=H5HP_incr(heap, 2, &obj3); + CHECK(ret, FAIL, "H5HP_change"); + + /* Check the maximum value on the heap */ + ret=H5HP_top(heap, &val); + CHECK(ret, FAIL, "H5HP_top"); + VERIFY(val, 22, "H5HP_top"); + + /* Decrement object three's priority by two to return object one to the top */ + ret=H5HP_decr(heap,2,&obj3); + CHECK(ret, FAIL, "H5HP_change"); + + /* Check the maximum value on the heap */ + ret=H5HP_top(heap, &val); + CHECK(ret, FAIL, "H5HP_top"); + VERIFY(val, 21, "H5HP_top"); + + /* Close the heap */ + ret=H5HP_close(heap); + CHECK(ret, FAIL, "H5HP_close"); + +} /* end test_heap_incdec_max() */ + +/**************************************************************** +** +** test_heap_incdec (): Test H5HP (heap) code. +** Tests incrementing & decrementing priority of objects on +** maximum & minimum heaps. +** +****************************************************************/ +static void +test_heap_incdec(void) +{ + /* Output message about test being performed */ + MESSAGE(6, ("Testing Incrementing & Decrementing Priority of Objects in Heaps\n")); + + /* Test increments & decrements in minimum & maximum heaps */ + test_heap_incdec_max(); + test_heap_incdec_min(); +} /* end test_heap_incdec() */ + +/**************************************************************** +** +** test_heap(): Main H5HP testing routine. +** +****************************************************************/ +void +test_heap(void) +{ + /* Output message about test being performed */ + MESSAGE(5, ("Testing Heaps\n")); + + /* Initialize Heap testing data */ + test_heap_init(); + + /* Actual Heap tests */ + test_heap_create(); /* Test Heap creation */ + test_heap_insert(); /* Test basic Heap insertion */ + test_heap_insert_many(); /* Test Heap insertion of many items */ + test_heap_remove(); /* Test basic Heap removal */ + test_heap_remove_many(); /* Test Heap removal of many items */ + test_heap_change(); /* Test changing priority of objects on Heap */ + test_heap_incdec(); /* Test incrementing & decrementing priority of objects on Heap */ + +} /* end test_heap() */ + |