1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
from cpython.object cimport PyObject
from numpy cimport (
    complex64_t,
    complex128_t,
    float32_t,
    float64_t,
    int8_t,
    int16_t,
    int32_t,
    int64_t,
    uint8_t,
    uint16_t,
    uint32_t,
    uint64_t,
)
 
 
cdef extern from "khash_python.h":
    const int KHASH_TRACE_DOMAIN
 
    ctypedef uint32_t khuint_t
    ctypedef khuint_t khiter_t
 
    ctypedef struct khcomplex128_t:
        double real
        double imag
 
    bint are_equivalent_khcomplex128_t \
        "kh_complex_hash_equal" (khcomplex128_t a, khcomplex128_t b) nogil
 
    ctypedef struct khcomplex64_t:
        float real
        float imag
 
    bint are_equivalent_khcomplex64_t \
        "kh_complex_hash_equal" (khcomplex64_t a, khcomplex64_t b) nogil
 
    bint are_equivalent_float64_t \
        "kh_floats_hash_equal" (float64_t a, float64_t b) nogil
 
    bint are_equivalent_float32_t \
        "kh_floats_hash_equal" (float32_t a, float32_t b) nogil
 
    uint32_t kh_python_hash_func(object key)
    bint kh_python_hash_equal(object a, object b)
 
    ctypedef struct kh_pymap_t:
        khuint_t n_buckets, size, n_occupied, upper_bound
        uint32_t *flags
        PyObject **keys
        size_t *vals
 
    kh_pymap_t* kh_init_pymap()
    void kh_destroy_pymap(kh_pymap_t*)
    void kh_clear_pymap(kh_pymap_t*)
    khuint_t kh_get_pymap(kh_pymap_t*, PyObject*)
    void kh_resize_pymap(kh_pymap_t*, khuint_t)
    khuint_t kh_put_pymap(kh_pymap_t*, PyObject*, int*)
    void kh_del_pymap(kh_pymap_t*, khuint_t)
 
    bint kh_exist_pymap(kh_pymap_t*, khiter_t)
 
    ctypedef struct kh_pyset_t:
        khuint_t n_buckets, size, n_occupied, upper_bound
        uint32_t *flags
        PyObject **keys
        size_t *vals
 
    kh_pyset_t* kh_init_pyset()
    void kh_destroy_pyset(kh_pyset_t*)
    void kh_clear_pyset(kh_pyset_t*)
    khuint_t kh_get_pyset(kh_pyset_t*, PyObject*)
    void kh_resize_pyset(kh_pyset_t*, khuint_t)
    khuint_t kh_put_pyset(kh_pyset_t*, PyObject*, int*)
    void kh_del_pyset(kh_pyset_t*, khuint_t)
 
    bint kh_exist_pyset(kh_pyset_t*, khiter_t)
 
    ctypedef char* kh_cstr_t
 
    ctypedef struct kh_str_t:
        khuint_t n_buckets, size, n_occupied, upper_bound
        uint32_t *flags
        kh_cstr_t *keys
        size_t *vals
 
    kh_str_t* kh_init_str() nogil
    void kh_destroy_str(kh_str_t*) nogil
    void kh_clear_str(kh_str_t*) nogil
    khuint_t kh_get_str(kh_str_t*, kh_cstr_t) nogil
    void kh_resize_str(kh_str_t*, khuint_t) nogil
    khuint_t kh_put_str(kh_str_t*, kh_cstr_t, int*) nogil
    void kh_del_str(kh_str_t*, khuint_t) nogil
 
    bint kh_exist_str(kh_str_t*, khiter_t) nogil
 
    ctypedef struct kh_str_starts_t:
        kh_str_t *table
        int starts[256]
 
    kh_str_starts_t* kh_init_str_starts() nogil
    khuint_t kh_put_str_starts_item(kh_str_starts_t* table, char* key,
                                    int* ret) nogil
    khuint_t kh_get_str_starts_item(kh_str_starts_t* table, char* key) nogil
    void kh_destroy_str_starts(kh_str_starts_t*) nogil
    void kh_resize_str_starts(kh_str_starts_t*, khuint_t) nogil
 
    # sweep factorize
 
    ctypedef struct kh_strbox_t:
        khuint_t n_buckets, size, n_occupied, upper_bound
        uint32_t *flags
        kh_cstr_t *keys
        PyObject **vals
 
    kh_strbox_t* kh_init_strbox() nogil
    void kh_destroy_strbox(kh_strbox_t*) nogil
    void kh_clear_strbox(kh_strbox_t*) nogil
    khuint_t kh_get_strbox(kh_strbox_t*, kh_cstr_t) nogil
    void kh_resize_strbox(kh_strbox_t*, khuint_t) nogil
    khuint_t kh_put_strbox(kh_strbox_t*, kh_cstr_t, int*) nogil
    void kh_del_strbox(kh_strbox_t*, khuint_t) nogil
 
    bint kh_exist_strbox(kh_strbox_t*, khiter_t) nogil
 
    khuint_t kh_needed_n_buckets(khuint_t element_n) nogil
 
 
include "khash_for_primitive_helper.pxi"