]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.1.0/liblfds710/src/lfds710_hash_addonly/lfds710_hash_addonly_query.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds7.1.0 / liblfds710 / src / lfds710_hash_addonly / lfds710_hash_addonly_query.c
1 /***** includes *****/
2 #include "lfds710_hash_addonly_internal.h"
3
4 /***** private prototypes *****/
5 static void lfds710_hash_a_internal_validate( struct lfds710_hash_a_state *has,
6                                               struct lfds710_misc_validation_info *vi,
7                                               enum lfds710_misc_validity *lfds710_hash_a_validity );
8
9
10
11
12
13 /****************************************************************************/
14 void lfds710_hash_a_query( struct lfds710_hash_a_state *has,
15                            enum lfds710_hash_a_query query_type,
16                            void *query_input,
17                            void *query_output )
18 {
19   LFDS710_PAL_ASSERT( has != NULL );
20   // TRD : query_type can be any value in its range
21
22   LFDS710_MISC_BARRIER_LOAD;
23
24   switch( query_type )
25   {
26     case LFDS710_HASH_A_QUERY_GET_POTENTIALLY_INACCURATE_COUNT:
27     {
28       struct lfds710_hash_a_iterate
29         ai;
30
31       struct lfds710_hash_a_element
32         *hae;
33
34       LFDS710_PAL_ASSERT( query_input == NULL );
35       LFDS710_PAL_ASSERT( query_output != NULL );
36
37       *(lfds710_pal_uint_t *) query_output = 0;
38
39       lfds710_hash_a_iterate_init( has, &ai );
40
41       while( lfds710_hash_a_iterate(&ai, &hae) )
42         ( *(lfds710_pal_uint_t *) query_output )++;
43     }
44     break;
45
46     case LFDS710_HASH_A_QUERY_SINGLETHREADED_VALIDATE:
47       // TRD: query_input can be any value in its range
48       LFDS710_PAL_ASSERT( query_output != NULL );
49
50       lfds710_hash_a_internal_validate( has, (struct lfds710_misc_validation_info *) query_input, (enum lfds710_misc_validity *) query_output );
51     break;
52   }
53
54   return;
55 }
56
57
58
59
60
61 /****************************************************************************/
62 static void lfds710_hash_a_internal_validate( struct lfds710_hash_a_state *has,
63                                               struct lfds710_misc_validation_info *vi,
64                                               enum lfds710_misc_validity *lfds710_hash_a_validity )
65 {
66   lfds710_pal_uint_t
67     lfds710_hash_a_total_number_elements = 0,
68     lfds710_btree_au_total_number_elements = 0,
69     number_elements;
70
71   lfds710_pal_uint_t
72     loop;
73
74   LFDS710_PAL_ASSERT( has!= NULL );
75   // TRD : vi can be NULL
76   LFDS710_PAL_ASSERT( lfds710_hash_a_validity != NULL );
77
78   /* TRD : validate every btree_addonly_unbalanced in the addonly_hash
79            sum elements in each btree_addonly_unbalanced
80            check matches expected element counts (if vi is provided)
81   */
82
83   *lfds710_hash_a_validity = LFDS710_MISC_VALIDITY_VALID;
84
85   for( loop = 0 ; *lfds710_hash_a_validity == LFDS710_MISC_VALIDITY_VALID and loop < has->array_size ; loop++ )
86     lfds710_btree_au_query( has->baus_array+loop, LFDS710_BTREE_AU_QUERY_SINGLETHREADED_VALIDATE, NULL, (void *) lfds710_hash_a_validity );
87
88   if( *lfds710_hash_a_validity == LFDS710_MISC_VALIDITY_VALID )
89   {
90     for( loop = 0 ; loop < has->array_size ; loop++ )
91     {
92       lfds710_btree_au_query( has->baus_array+loop, LFDS710_BTREE_AU_QUERY_GET_POTENTIALLY_INACCURATE_COUNT, NULL, (void *) &number_elements );
93       lfds710_btree_au_total_number_elements += number_elements;
94     }
95
96     // TRD : first, check btree_addonly_unbalanced total vs the addonly_hash total
97     lfds710_hash_a_query( has, LFDS710_HASH_A_QUERY_GET_POTENTIALLY_INACCURATE_COUNT, NULL, &lfds710_hash_a_total_number_elements );
98
99     // TRD : the btree_addonly_unbalanceds are assumed to speak the truth
100     if( lfds710_hash_a_total_number_elements < lfds710_btree_au_total_number_elements )
101       *lfds710_hash_a_validity = LFDS710_MISC_VALIDITY_INVALID_ADDITIONAL_ELEMENTS;
102
103     if( lfds710_hash_a_total_number_elements > lfds710_btree_au_total_number_elements )
104       *lfds710_hash_a_validity = LFDS710_MISC_VALIDITY_INVALID_MISSING_ELEMENTS;
105
106     // TRD : second, if we're still valid and vi is provided, check the btree_addonly_unbalanced total against vi
107     if( *lfds710_hash_a_validity == LFDS710_MISC_VALIDITY_VALID and vi != NULL )
108     {
109       if( lfds710_btree_au_total_number_elements < vi->min_elements )
110         *lfds710_hash_a_validity = LFDS710_MISC_VALIDITY_INVALID_MISSING_ELEMENTS;
111
112       if( lfds710_btree_au_total_number_elements > vi->max_elements )
113         *lfds710_hash_a_validity = LFDS710_MISC_VALIDITY_INVALID_ADDITIONAL_ELEMENTS;
114     }
115   }
116
117   return;
118 }
119