Browse Source

Stuck because of opaque structures.

Stefano Cossu 5 years ago
parent
commit
4dfa237567

+ 2 - 4
MANIFEST.in

@@ -5,10 +5,8 @@ include ext/lmdb/libraries/liblmdb/mdb.c
 include ext/lmdb/libraries/liblmdb/lmdb.h
 include ext/lmdb/libraries/liblmdb/midl.c
 include ext/lmdb/libraries/liblmdb/midl.h
-include ext/collections-c/src/hashset.c
-include ext/collections-c/src/hashtable.c
-include ext/collections-c/src/include/hashset.h
-include ext/collections-c/src/include/hashtable.h
+include ext/collections-c/src/*.c
+include ext/collections-c/src/include/*.h
 include ext/tpl/src/tpl.c
 include ext/tpl/src/tpl.h
 include ext/spookyhash/src/*.c

+ 82 - 51
lakesuperior/cy_include/collections.pxd

@@ -1,6 +1,25 @@
 from libc.stdint cimport uint32_t
 
-cdef extern from "hashset.h":
+ctypedef void* (*mem_alloc_ft)(size_t size)
+ctypedef void* (*mem_calloc_ft)(size_t blocks, size_t size)
+ctypedef void (*mem_free_ft)(void* block)
+ctypedef size_t (*hash_ft)(const void* key, int l, uint32_t seed)
+ctypedef int (*key_compare_ft)(const void* key1, const void* key2)
+
+
+#cdef extern from "array.c":
+#
+#    struct array_s:
+#        size_t          size
+#        size_t          capacity
+#        float           exp_factor
+#        void**          buffer
+#        mem_alloc_ft  mem_alloc
+#        mem_calloc_ft mem_calloc
+#        mem_free_ft   mem_free
+
+
+cdef extern from "array.h":
 
     cdef enum cc_stat:
         CC_OK
@@ -17,30 +36,18 @@ cdef extern from "hashset.h":
 
     int cc_common_cmp_ptr(void* key1, void* key2)
 
-    ctypedef void* (*_mem_alloc_ft)(size_t size)
-
-    ctypedef void* (*_mem_calloc_ft)(size_t blocks, size_t size)
-
-    ctypedef void (*_mem_free_ft)(void* block)
-
     ctypedef struct Array:
-        size_t          size
-        size_t          capacity
-        float           exp_factor
-        void**          buffer
-        _mem_alloc_ft*  mem_alloc
-        _mem_calloc_ft* mem_calloc
-        _mem_free_ft*   mem_free
+        pass
 
     ctypedef struct ArrayConf:
         size_t          capacity
         float           exp_factor
-        #_mem_alloc_ft*  mem_alloc
-        #_mem_calloc_ft* mem_calloc
-        #_mem_free_ft*   mem_free
-        void *(*mem_alloc)  (size_t size)
-        void *(*mem_calloc) (size_t blocks, size_t size)
-        void  (*mem_free)   (void *block)
+        mem_alloc_ft  mem_alloc
+        mem_calloc_ft mem_calloc
+        mem_free_ft   mem_free
+        #void *(*mem_alloc)  (size_t size)
+        #void *(*mem_calloc) (size_t blocks, size_t size)
+        #void  (*mem_free)   (void *block)
 
     ctypedef struct ArrayIter:
         Array* ar
@@ -157,54 +164,71 @@ cdef extern from "hashset.h":
 
     void** array_get_buffer(Array* ar)
 
-    ctypedef struct TableEntry:
+
+cdef extern from "hashtable.h":
+
+    struct table_entry_s:
         void*       key
         void*       value
         size_t      hash
-        TableEntry* next
+        table_entry_s* next
 
-    ctypedef size_t (*_hash_ft)(const void* key, int l, uint32_t seed)
+    ctypedef table_entry_s TableEntry
 
-    ctypedef bint (*_key_compare_ft)(const void* key1, const void* key2)
+cdef extern from "hashtable.c":
 
-    ctypedef struct HashTable:
+    struct hashtable_s:
         size_t          capacity
         size_t          size
         size_t          threshold
         uint32_t        hash_seed
         int             key_len
         float           load_factor
-        TableEntry      **buckets
+        TableEntry**      buckets
+
+        #size_t (*hash)        (const void *key, int l, uint32_t seed)
+        #bint    (*key_cmp) (const void *key1, const void *key2)
+        #void *(*mem_alloc)  (size_t size)
+        #void *(*mem_calloc) (size_t blocks, size_t size)
+        #void  (*mem_free)   (void *block)
+        hash_ft           hash
+        key_compare_ft    key_cmp
+        mem_alloc_ft      mem_alloc
+        mem_calloc_ft     mem_calloc
+        mem_free_ft       mem_free
+
 
-        size_t (*hash)        (const void *key, int l, uint32_t seed)
-        bint    (*key_cmp) (const void *key1, const void *key2)
-        void *(*mem_alloc)  (size_t size)
-        void *(*mem_calloc) (size_t blocks, size_t size)
-        void  (*mem_free)   (void *block)
+cdef extern from "hashtable.h":
 
-    ctypedef struct HashTableConf:
+    ctypedef hashtable_s HashTable
+
+    struct hashtable_conf_s:
         float               load_factor
         size_t              initial_capacity
         int                 key_length
         uint32_t            hash_seed
 
-        #_hash_ft            hash
-        #_key_compare_ft*    key_compare
-        #_mem_alloc_ft*  mem_alloc
-        #_mem_calloc_ft* mem_calloc
-        #_mem_free_ft*   mem_free
-        size_t (*hash)        (const void *key, int l, uint32_t seed)
-        bint    (*key_compare) (const void *key1, const void *key2)
-        void *(*mem_alloc)  (size_t size)
-        void *(*mem_calloc) (size_t blocks, size_t size)
-        void  (*mem_free)   (void *block)
-
-    ctypedef struct HashTableIter:
+        hash_ft           hash
+        key_compare_ft    key_compare
+        mem_alloc_ft  mem_alloc
+        mem_calloc_ft mem_calloc
+        mem_free_ft   mem_free
+        #size_t (*hash)        (const void *key, int l, uint32_t seed)
+        #bint    (*key_compare) (const void *key1, const void *key2)
+        #void *(*mem_alloc)  (size_t size)
+        #void *(*mem_calloc) (size_t blocks, size_t size)
+        #void  (*mem_free)   (void *block)
+
+    ctypedef hashtable_conf_s HashTableConf
+
+    struct hashtable_iter_s:
         HashTable* table
         size_t bucket_index
         TableEntry* prev_entry
         TableEntry* next_entry
 
+    ctypedef hashtable_iter_s HashTableIter
+
     size_t get_table_index(HashTable *table, void *key)
 
     void hashtable_conf_init(HashTableConf* conf)
@@ -254,16 +278,23 @@ cdef extern from "hashset.h":
     cc_stat hashtable_iter_remove(HashTableIter* iter, void** out)
 
 
-    ctypedef struct HashSet:
+cdef extern from "hashset.c":
+
+    struct hashset_s:
         HashTable*      table
         int*            dummy
 
-        #_mem_alloc_ft*  mem_alloc
-        #_mem_calloc_ft* mem_calloc
-        #_mem_free_ft*   mem_free
-        void *(*mem_alloc)  (size_t size)
-        void *(*mem_calloc) (size_t blocks, size_t size)
-        void  (*mem_free)   (void *block)
+        mem_alloc_ft  mem_alloc
+        mem_calloc_ft mem_calloc
+        mem_free_ft   mem_free
+        #void *(*mem_alloc)  (size_t size)
+        #void *(*mem_calloc) (size_t blocks, size_t size)
+        #void  (*mem_free)   (void *block)
+
+
+cdef extern from "hashset.h":
+
+    ctypedef hashset_s HashSet
 
     ctypedef HashTableConf HashSetConf
 

+ 2 - 3
lakesuperior/model/graph/graph.pxd

@@ -20,8 +20,8 @@ ctypedef Buffer SPOBuffer[3]
 ctypedef Buffer *BufferPtr
 
 cdef:
-    bint term_cmp_fn(const void* key1, const void* key2)
-    bint triple_cmp_fn(const void* key1, const void* key2)
+    int term_cmp_fn(const void* key1, const void* key2)
+    int triple_cmp_fn(const void* key1, const void* key2)
     size_t trp_hash_fn(const void* key, int l, uint32_t seed)
     size_t hash_ptr_passthrough(const void* key, int l, uint32_t seed)
 
@@ -52,4 +52,3 @@ cdef class Imr(SimpleGraph):
         readonly str uri
 
     cpdef as_rdflib(self)
-

+ 5 - 4
lakesuperior/model/graph/graph.pyx

@@ -14,6 +14,7 @@ from libc.stdlib cimport free
 from cymem.cymem cimport Pool
 
 from lakesuperior.cy_include cimport cylmdb as lmdb
+from lakesuperior.cy_include cimport collections as cc
 from lakesuperior.cy_include.collections cimport (
     CC_OK,
     HashSet, HashSetConf, HashSetIter, TableEntry,
@@ -49,7 +50,7 @@ def use_data(fn):
     return _wrapper
 
 
-cdef bint term_cmp_fn(const void* key1, const void* key2):
+cdef int term_cmp_fn(const void* key1, const void* key2):
     """
     Compare function for two Buffer objects.
     """
@@ -68,7 +69,7 @@ cdef bint term_cmp_fn(const void* key1, const void* key2):
     return cmp == 0
 
 
-cdef bint triple_cmp_fn(const void* key1, const void* key2):
+cdef int triple_cmp_fn(const void* key1, const void* key2):
     """
     Compare function for two triples in a CAlg set.
 
@@ -212,14 +213,14 @@ cdef class SimpleGraph:
 
         hashset_conf_init(&terms_conf)
         terms_conf.load_factor = 0.85
-        terms_conf.hash = hash_ptr_passthrough # spookyhash_64?
+        terms_conf.hash = &hash_ptr_passthrough # spookyhash_64?
         terms_conf.hash_seed = term_hash_seed32
         terms_conf.key_compare = &term_cmp_fn
         terms_conf.key_length = sizeof(void*)
 
         hashset_conf_init(&trp_conf)
         trp_conf.load_factor = 0.75
-        trp_conf.hash = hash_ptr_passthrough # spookyhash_64?
+        trp_conf.hash = &hash_ptr_passthrough # spookyhash_64?
         trp_conf.hash_seed = term_hash_seed32
         trp_conf.key_compare = &triple_cmp_fn
         trp_conf.key_length = sizeof(void*)