2 #include "lfds710_hash_addonly_internal.h"
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 );
13 /****************************************************************************/
14 void lfds710_hash_a_query( struct lfds710_hash_a_state *has,
15 enum lfds710_hash_a_query query_type,
19 LFDS710_PAL_ASSERT( has != NULL );
20 // TRD : query_type can be any value in its range
22 LFDS710_MISC_BARRIER_LOAD;
26 case LFDS710_HASH_A_QUERY_GET_POTENTIALLY_INACCURATE_COUNT:
28 struct lfds710_hash_a_iterate
31 struct lfds710_hash_a_element
34 LFDS710_PAL_ASSERT( query_input == NULL );
35 LFDS710_PAL_ASSERT( query_output != NULL );
37 *(lfds710_pal_uint_t *) query_output = 0;
39 lfds710_hash_a_iterate_init( has, &ai );
41 while( lfds710_hash_a_iterate(&ai, &hae) )
42 ( *(lfds710_pal_uint_t *) query_output )++;
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 );
50 lfds710_hash_a_internal_validate( has, (struct lfds710_misc_validation_info *) query_input, (enum lfds710_misc_validity *) query_output );
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 )
67 lfds710_hash_a_total_number_elements = 0,
68 lfds710_btree_au_total_number_elements = 0,
74 LFDS710_PAL_ASSERT( has!= NULL );
75 // TRD : vi can be NULL
76 LFDS710_PAL_ASSERT( lfds710_hash_a_validity != NULL );
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)
83 *lfds710_hash_a_validity = LFDS710_MISC_VALIDITY_VALID;
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 );
88 if( *lfds710_hash_a_validity == LFDS710_MISC_VALIDITY_VALID )
90 for( loop = 0 ; loop < has->array_size ; loop++ )
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;
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 );
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;
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;
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 )
109 if( lfds710_btree_au_total_number_elements < vi->min_elements )
110 *lfds710_hash_a_validity = LFDS710_MISC_VALIDITY_INVALID_MISSING_ELEMENTS;
112 if( lfds710_btree_au_total_number_elements > vi->max_elements )
113 *lfds710_hash_a_validity = LFDS710_MISC_VALIDITY_INVALID_ADDITIONAL_ELEMENTS;