]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.1.0/liblfds710/src/lfds710_hash_addonly/lfds710_hash_addonly_iterate.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds7.1.0 / liblfds710 / src / lfds710_hash_addonly / lfds710_hash_addonly_iterate.c
1 /***** includes *****/
2 #include "lfds710_hash_addonly_internal.h"
3
4
5
6
7
8 /****************************************************************************/
9 void lfds710_hash_a_iterate_init( struct lfds710_hash_a_state *has,
10                                   struct lfds710_hash_a_iterate *hai )
11 {
12   LFDS710_PAL_ASSERT( has != NULL );
13   LFDS710_PAL_ASSERT( hai != NULL );
14
15   hai->baus = has->baus_array;
16   hai->baus_end = has->baus_array + has->array_size;
17   hai->baue = NULL;
18
19   return;
20 }
21
22
23
24
25
26 /****************************************************************************/
27 int lfds710_hash_a_iterate( struct lfds710_hash_a_iterate *hai,
28                             struct lfds710_hash_a_element **hae )
29 {
30   enum lfds710_misc_flag
31     finished_flag = LFDS710_MISC_FLAG_LOWERED;
32
33   int
34     rv = 0;
35
36   LFDS710_PAL_ASSERT( hai != NULL );
37   LFDS710_PAL_ASSERT( hae != NULL );
38
39   while( finished_flag == LFDS710_MISC_FLAG_LOWERED )
40   {
41     lfds710_btree_au_get_by_absolute_position_and_then_by_relative_position( hai->baus, &hai->baue, LFDS710_BTREE_AU_ABSOLUTE_POSITION_SMALLEST_IN_TREE, LFDS710_BTREE_AU_RELATIVE_POSITION_NEXT_LARGER_ELEMENT_IN_ENTIRE_TREE );
42
43     if( hai->baue != NULL )
44     {
45       *hae = LFDS710_BTREE_AU_GET_VALUE_FROM_ELEMENT( *hai->baue );
46       finished_flag = LFDS710_MISC_FLAG_RAISED;
47       rv = 1;
48     }
49
50     if( hai->baue == NULL )
51       if( ++hai->baus == hai->baus_end )
52       {
53         *hae = NULL;
54         finished_flag = LFDS710_MISC_FLAG_RAISED;
55       }
56   }
57
58   return rv;
59 }
60