]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.1.0/liblfds710/src/lfds710_hash_addonly/lfds710_hash_addonly_insert.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds7.1.0 / liblfds710 / src / lfds710_hash_addonly / lfds710_hash_addonly_insert.c
1 /***** includes *****/
2 #include "lfds710_hash_addonly_internal.h"
3
4
5
6
7
8 /****************************************************************************/
9 enum lfds710_hash_a_insert_result lfds710_hash_a_insert( struct lfds710_hash_a_state *has,
10                                                          struct lfds710_hash_a_element *hae,
11                                                          struct lfds710_hash_a_element **existing_hae )
12 {
13   enum lfds710_hash_a_insert_result
14     apr = LFDS710_HASH_A_PUT_RESULT_SUCCESS;
15
16   enum lfds710_btree_au_insert_result
17     alr;
18
19   lfds710_pal_uint_t
20     hash = 0;
21
22   struct lfds710_btree_au_element
23     *existing_baue;
24
25   LFDS710_PAL_ASSERT( has != NULL );
26   LFDS710_PAL_ASSERT( hae != NULL );
27   LFDS710_PAL_ASSERT( (lfds710_pal_uint_t) &hae->value % LFDS710_PAL_ALIGN_SINGLE_POINTER == 0 );
28   // TRD : existing_hae can be NULL
29
30   // TRD : alignment checks
31   LFDS710_PAL_ASSERT( (lfds710_pal_uint_t) &hae->baue % LFDS710_PAL_ALIGN_SINGLE_POINTER == 0 );
32
33   has->key_hash_function( hae->key, &hash );
34
35   LFDS710_BTREE_AU_SET_KEY_IN_ELEMENT( hae->baue, hae->key );
36   LFDS710_BTREE_AU_SET_VALUE_IN_ELEMENT( hae->baue, hae );
37
38   alr = lfds710_btree_au_insert( has->baus_array + (hash % has->array_size), &hae->baue, &existing_baue );
39
40   switch( alr )
41   {
42     case LFDS710_BTREE_AU_INSERT_RESULT_FAILURE_EXISTING_KEY:
43       if( existing_hae != NULL )
44         *existing_hae = LFDS710_BTREE_AU_GET_VALUE_FROM_ELEMENT( *existing_baue );
45
46       apr = LFDS710_HASH_A_PUT_RESULT_FAILURE_EXISTING_KEY;
47     break;
48
49     case LFDS710_BTREE_AU_INSERT_RESULT_SUCCESS_OVERWRITE:
50       apr = LFDS710_HASH_A_PUT_RESULT_SUCCESS_OVERWRITE;
51     break;
52
53     case LFDS710_BTREE_AU_INSERT_RESULT_SUCCESS:
54       apr = LFDS710_HASH_A_PUT_RESULT_SUCCESS;
55     break;
56   }
57
58   return apr;
59 }
60