]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.0.0/liblfds700/src/lfds700_hash_addonly/lfds700_hash_addonly_iterate.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds7.0.0 / liblfds700 / src / lfds700_hash_addonly / lfds700_hash_addonly_iterate.c
1 /***** includes *****/
2 #include "lfds700_hash_addonly_internal.h"
3
4
5
6
7
8 /****************************************************************************/
9 void lfds700_hash_a_iterate_init( struct lfds700_hash_a_state *has, struct lfds700_hash_a_iterate *hai )
10 {
11   LFDS700_PAL_ASSERT( has != NULL );
12   LFDS700_PAL_ASSERT( hai != NULL );
13
14   hai->baus = has->baus_array;
15   hai->baus_end = has->baus_array + has->array_size;
16   hai->baue = NULL;
17
18   return;
19 }
20
21
22
23
24
25 /****************************************************************************/
26 int lfds700_hash_a_iterate( struct lfds700_hash_a_iterate *hai, struct lfds700_hash_a_element **hae )
27 {
28   enum lfds700_misc_flag
29     finished_flag = LFDS700_MISC_FLAG_LOWERED;
30
31   int
32     rv = 0;
33
34   LFDS700_PAL_ASSERT( hai != NULL );
35   LFDS700_PAL_ASSERT( hae != NULL );
36
37   while( finished_flag == LFDS700_MISC_FLAG_LOWERED )
38   {
39     lfds700_btree_au_get_by_absolute_position_and_then_by_relative_position( hai->baus, &hai->baue, LFDS700_BTREE_AU_ABSOLUTE_POSITION_SMALLEST_IN_TREE, LFDS700_BTREE_AU_RELATIVE_POSITION_NEXT_LARGER_ELEMENT_IN_ENTIRE_TREE );
40
41     if( hai->baue != NULL )
42     {
43       *hae = LFDS700_BTREE_AU_GET_VALUE_FROM_ELEMENT( *hai->baue );
44       finished_flag = LFDS700_MISC_FLAG_RAISED;
45       rv = 1;
46     }
47
48     if( hai->baue == NULL )
49       if( ++hai->baus == hai->baus_end )
50       {
51         *hae = NULL;
52         finished_flag = LFDS700_MISC_FLAG_RAISED;
53       }
54   }
55
56   return( rv );
57 }
58