summaryrefslogtreecommitdiffstats
path: root/test/theap.c
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>2003-02-24 20:25:13 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>2003-02-24 20:25:13 (GMT)
commit474a1434bd0b5a84c4cd5a485dd1bc7f47ca334f (patch)
treeebc424570bbeacb0ff20034de80a8976a616d060 /test/theap.c
parentf239b2e7f330c8095297fd16993ad3851e7e5232 (diff)
downloadhdf5-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/theap.c')
-rw-r--r--test/theap.c1057
1 files changed, 1057 insertions, 0 deletions
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() */
+