2 #include "lfds700_hash_addonly_internal.h"
8 /****************************************************************************/
9 enum lfds700_hash_a_insert_result lfds700_hash_a_insert( struct lfds700_hash_a_state *has,
10 struct lfds700_hash_a_element *hae,
11 struct lfds700_hash_a_element **existing_hae,
12 struct lfds700_misc_prng_state *ps )
14 enum lfds700_hash_a_insert_result
15 apr = LFDS700_HASH_A_PUT_RESULT_SUCCESS;
17 enum lfds700_btree_au_insert_result
23 struct lfds700_btree_au_element
26 LFDS700_PAL_ASSERT( has != NULL );
27 LFDS700_PAL_ASSERT( hae != NULL );
28 LFDS700_PAL_ASSERT( (lfds700_pal_uint_t) &hae->value % LFDS700_PAL_ATOMIC_ISOLATION_IN_BYTES == 0 );
29 // TRD : existing_hae can be NULL
30 LFDS700_PAL_ASSERT( ps != NULL );
32 // TRD : alignment checks
33 LFDS700_PAL_ASSERT( (lfds700_pal_uint_t) &hae->baue % LFDS700_PAL_ALIGN_SINGLE_POINTER == 0 );
35 has->key_hash_function( hae->key, &hash );
37 LFDS700_BTREE_AU_SET_KEY_IN_ELEMENT( hae->baue, hae->key );
38 LFDS700_BTREE_AU_SET_VALUE_IN_ELEMENT( hae->baue, hae );
40 alr = lfds700_btree_au_insert( has->baus_array + (hash % has->array_size), &hae->baue, &existing_baue, ps );
44 case LFDS700_BTREE_AU_INSERT_RESULT_FAILURE_EXISTING_KEY:
45 if( existing_hae != NULL )
46 *existing_hae = LFDS700_BTREE_AU_GET_VALUE_FROM_ELEMENT( *existing_baue );
48 apr = LFDS700_HASH_A_PUT_RESULT_FAILURE_EXISTING_KEY;
51 case LFDS700_BTREE_AU_INSERT_RESULT_SUCCESS_OVERWRITE:
52 apr = LFDS700_HASH_A_PUT_RESULT_SUCCESS_OVERWRITE;
55 case LFDS700_BTREE_AU_INSERT_RESULT_SUCCESS:
56 apr = LFDS700_HASH_A_PUT_RESULT_SUCCESS;