cdef extern from "lrcalc/hashtab.h":
    ctypedef struct hashtab:
        pass

    ctypedef struct hash_itr:
        pass

    ctypedef unsigned long hashkey_t
    ctypedef int (*cmp_t) (void* a, void* b)
    ctypedef hashkey_t (*hash_t) (void* a)

    hashtab* hash_new(cmp_t cm, hash_t hsh)
    void hash_free(hashtab *ht)

    void* hash_lookup(hashtab *ht, void *key)
    void* hash_insert(hashtab *ht, void *key, void *value)

    bint hash_good(hash_itr)
    void hash_first(hashtab* s, hash_itr itr)
    void hash_next(hash_itr itr)
    void* hash_key(hash_itr itr)
    void* hash_value(hash_itr itr)
    int hash_intvalue(hash_itr itr)

cdef extern from "lrcalc/vector.h":
    ctypedef struct vector:
        size_t length
        int* array

    vector* v_new(int length)
    void v_free(vector* v)
    void v_print(vector *v)
    int v_length(vector* v)
    int v_elem(vector* v, int i)

    ctypedef struct vecpair:
        vector *first
        vector *second

    vector* vp_first(vecpair* vp)
    vector* vp_second(vecpair* vp)


cdef extern from "lrcalc/symfcn.h":
    long long lrcoef_c "lrcoef"(vector* outer, vector* inner1, vector* inner2)
    hashtab* mult_c "mult"(vector *sh1, vector *sh2, int maxrows)
    hashtab* skew_c "skew"(vector *outer, vector *inner, int maxrows)
    hashtab* coprod_c "coprod"(vector *part, int all)
    void fusion_reduce_c "fusion_reduce"(hashtab* ht, int rows, int cols, int opt_zero)

    ctypedef struct skewtab:
        vector *outer
        vector *inner
        vector *conts
        int maxrows
        vector *conjugate
        int rows
        int cols
        int matrix[1]

    skewtab *st_new(vector *outer, vector *inner, vector *conts, int maxrows)
    int st_next(skewtab *st)
    void st_print(skewtab *st)
    void st_free(skewtab *st)


cdef extern from "lrcalc/schublib.h":
    hashtab* mult_schubert_c "mult_schubert"(vector *sh1, vector *sh2, int rank)
