]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.0.0/liblfds700/src/lfds700_hash_addonly/lfds700_hash_addonly_insert.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds7.0.0 / liblfds700 / src / lfds700_hash_addonly / lfds700_hash_addonly_insert.c
1 /***** includes *****/
2 #include "lfds700_hash_addonly_internal.h"
3
4
5
6
7
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 )
13 {
14   enum lfds700_hash_a_insert_result
15     apr = LFDS700_HASH_A_PUT_RESULT_SUCCESS;
16
17   enum lfds700_btree_au_insert_result
18     alr;
19
20   lfds700_pal_uint_t
21     hash = 0;
22
23   struct lfds700_btree_au_element
24     *existing_baue;
25
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 );
31
32   // TRD : alignment checks
33   LFDS700_PAL_ASSERT( (lfds700_pal_uint_t) &hae->baue % LFDS700_PAL_ALIGN_SINGLE_POINTER == 0 );
34
35   has->key_hash_function( hae->key, &hash );
36
37   LFDS700_BTREE_AU_SET_KEY_IN_ELEMENT( hae->baue, hae->key );
38   LFDS700_BTREE_AU_SET_VALUE_IN_ELEMENT( hae->baue, hae );
39
40   alr = lfds700_btree_au_insert( has->baus_array + (hash % has->array_size), &hae->baue, &existing_baue, ps );
41
42   switch( alr )
43   {
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 );
47
48       apr = LFDS700_HASH_A_PUT_RESULT_FAILURE_EXISTING_KEY;
49     break;
50
51     case LFDS700_BTREE_AU_INSERT_RESULT_SUCCESS_OVERWRITE:
52       apr = LFDS700_HASH_A_PUT_RESULT_SUCCESS_OVERWRITE;
53     break;
54
55     case LFDS700_BTREE_AU_INSERT_RESULT_SUCCESS:
56       apr = LFDS700_HASH_A_PUT_RESULT_SUCCESS;
57     break;
58   }
59
60   return( apr );
61 }
62