quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

hash.h (3743B)


      1 #ifndef HEADER_CURL_HASH_H
      2 #define HEADER_CURL_HASH_H
      3 /***************************************************************************
      4  *                                  _   _ ____  _
      5  *  Project                     ___| | | |  _ \| |
      6  *                             / __| | | | |_) | |
      7  *                            | (__| |_| |  _ <| |___
      8  *                             \___|\___/|_| \_\_____|
      9  *
     10  * Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
     11  *
     12  * This software is licensed as described in the file COPYING, which
     13  * you should have received as part of this distribution. The terms
     14  * are also available at https://curl.se/docs/copyright.html.
     15  *
     16  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
     17  * copies of the Software, and permit persons to whom the Software is
     18  * furnished to do so, under the terms of the COPYING file.
     19  *
     20  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
     21  * KIND, either express or implied.
     22  *
     23  * SPDX-License-Identifier: curl
     24  *
     25  ***************************************************************************/
     26 
     27 #include "curl_setup.h"
     28 
     29 #include <stddef.h>
     30 
     31 #include "llist.h"
     32 
     33 /* Hash function prototype */
     34 typedef size_t (*hash_function) (void *key,
     35                                  size_t key_length,
     36                                  size_t slots_num);
     37 
     38 /*
     39    Comparator function prototype. Compares two keys.
     40 */
     41 typedef size_t (*comp_function) (void *key1,
     42                                  size_t key1_len,
     43                                  void *key2,
     44                                  size_t key2_len);
     45 
     46 typedef void (*Curl_hash_dtor)(void *);
     47 
     48 typedef void (*Curl_hash_elem_dtor)(void *key, size_t key_len, void *p);
     49 
     50 struct Curl_hash_element {
     51   struct Curl_hash_element *next;
     52   void   *ptr;
     53   Curl_hash_elem_dtor dtor;
     54   size_t key_len;
     55   char   key[1]; /* allocated memory following the struct */
     56 };
     57 
     58 struct Curl_hash {
     59   struct Curl_hash_element **table;
     60 
     61   /* Hash function to be used for this hash table */
     62   hash_function hash_func;
     63   /* Comparator function to compare keys */
     64   comp_function comp_func;
     65   /* General element construct, unless element itself carries one */
     66   Curl_hash_dtor   dtor;
     67   size_t slots;
     68   size_t size;
     69 #ifdef DEBUGBUILD
     70   int init;
     71 #endif
     72 };
     73 
     74 struct Curl_hash_iterator {
     75   struct Curl_hash *hash;
     76   size_t slot_index;
     77   struct Curl_hash_element *current;
     78 #ifdef DEBUGBUILD
     79   int init;
     80 #endif
     81 };
     82 
     83 void Curl_hash_init(struct Curl_hash *h,
     84                     size_t slots,
     85                     hash_function hfunc,
     86                     comp_function comparator,
     87                     Curl_hash_dtor dtor);
     88 
     89 void *Curl_hash_add(struct Curl_hash *h, void *key, size_t key_len, void *p);
     90 void *Curl_hash_add2(struct Curl_hash *h, void *key, size_t key_len, void *p,
     91                      Curl_hash_elem_dtor dtor);
     92 int Curl_hash_delete(struct Curl_hash *h, void *key, size_t key_len);
     93 void *Curl_hash_pick(struct Curl_hash *, void *key, size_t key_len);
     94 
     95 void Curl_hash_destroy(struct Curl_hash *h);
     96 size_t Curl_hash_count(struct Curl_hash *h);
     97 void Curl_hash_clean(struct Curl_hash *h);
     98 void Curl_hash_clean_with_criterium(struct Curl_hash *h, void *user,
     99                                     int (*comp)(void *, void *));
    100 size_t Curl_hash_str(void *key, size_t key_length, size_t slots_num);
    101 size_t curlx_str_key_compare(void *k1, size_t key1_len, void *k2,
    102                              size_t key2_len);
    103 void Curl_hash_start_iterate(struct Curl_hash *hash,
    104                              struct Curl_hash_iterator *iter);
    105 struct Curl_hash_element *
    106 Curl_hash_next_element(struct Curl_hash_iterator *iter);
    107 
    108 void Curl_hash_print(struct Curl_hash *h,
    109                      void (*func)(void *));
    110 
    111 #endif /* HEADER_CURL_HASH_H */