from libc.stdint cimport uint64_t
from cymem.cymem cimport Pool


ctypedef uint64_t key_t


cdef struct Cell:
    key_t key
    void* value


cdef struct Result:
    int found
    void* value


cdef struct MapStruct:
    Cell* cells
    void* value_for_empty_key
    void* value_for_del_key
    key_t length
    key_t filled
    bint is_empty_key_set
    bint is_del_key_set


cdef void* map_bulk_get(const MapStruct* map_, const key_t* keys, void** values,
                        int n) nogil


cdef Result map_get_unless_missing(const MapStruct* map_, const key_t key) nogil

cdef void* map_get(const MapStruct* map_, const key_t key) nogil

cdef void map_set(Pool mem, MapStruct* map_, key_t key, void* value) except *

cdef void map_init(Pool mem, MapStruct* pmap, size_t length) except *

cdef bint map_iter(const MapStruct* map_, int* i, key_t* key, void** value) nogil

cdef void* map_clear(MapStruct* map_, const key_t key) nogil


cdef class PreshMap:
    cdef MapStruct* c_map
    cdef Pool mem

    cdef inline void* get(self, key_t key) nogil
    cdef void set(self, key_t key, void* value) except *


cdef class PreshMapArray:
    cdef Pool mem
    cdef MapStruct* maps
    cdef size_t length

    cdef inline void* get(self, size_t i, key_t key) nogil
    cdef void set(self, size_t i, key_t key, void* value) except *