import cffi, os, platform from fb_ffi import ffi ffi.cdef(""" typedef struct { unsigned len, slots; wchar_t** arr; } dyn_array; """) def dyn_array_as_list(arr): out = [] for i in range(arr.len): out.append(ffi.string(arr.arr[i])) return out
import cffi, os, platform from fb_ffi import ffi as trie_ffi from dyn_array import dyn_array_as_list from UserDict import DictMixin libtype = "dylib" if platform.uname()[0] == "Darwin" else "so" trie_ffi.cdef("void* create_trie();") trie_ffi.cdef("void free_trie(void *trie);") trie_ffi.cdef("void trie_insert(void* trie, wchar_t *key, wchar_t *value);") trie_ffi.cdef("wchar_t* trie_search(void* trie, wchar_t *key);") trie_ffi.cdef("void print_dot(void* trie);") trie_ffi.cdef("dyn_array *trie_suffixes(void* trie, wchar_t *key, int strict, int max_matches);") trie_ffi.cdef("void dyn_array_free(dyn_array* darr);") libtrie = trie_ffi.dlopen(os.path.join(os.path.dirname(os.path.abspath(__file__)), "libtrie.%s" % libtype)) libtrieprint = trie_ffi.dlopen(os.path.join(os.path.dirname(os.path.abspath(__file__)), "libtrieprint.%s" % libtype)) class Trie(DictMixin): def __init__(self): self._trie = libtrie.create_trie() def __setitem__(self, key, value): ukey = unicode(key) uval = unicode(value) libtrie.trie_insert(self._trie, ukey, uval) def __getptr__(self, key): ukey = unicode(key) return libtrie.trie_search(self._trie, ukey) def __contains__(self, key):