Пример #1
0
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
Пример #2
0
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):