X-Git-Url: https://git.rrq.au/?a=blobdiff_plain;f=vector%2FBindingTable.h;h=aa4ee6e110524b6449194fdccb74afd8621ac9eb;hb=48cdb87442b7b3f1cdde9c1710ed90ec773dce97;hp=47938b8ebafad0a3da088fc6fee8c08ddace9cf0;hpb=813cf9d12ff1b1c58e508485c977d33caaf89a86;p=rrq%2Frrqmisc.git diff --git a/vector/BindingTable.h b/vector/BindingTable.h index 47938b8..aa4ee6e 100644 --- a/vector/BindingTable.h +++ b/vector/BindingTable.h @@ -3,36 +3,31 @@ #include #include +#include /** * A BindingTable is a chain of \ref HashVector "HashVectors" of * Binding items that associate a (char*) name with a (void*) value. */ -typedef struct _BindingTable { - HashVector table; - struct _BindingTable *next; -} BindingTable; +typedef HashVector/**/ BindingTable; /** - * \brief Allocate a new \ref BindingTable and chain it to the one given. + * \brief Allocate a new \ref BindingTable. * * \returns the allocated \ref bandingtable. * * \related BindingTable */ -extern BindingTable *BindingTable_create(BindingTable *next); +extern BindingTable *BindingTable_create(); /** - * \brief Reclaim a \ref BindingTable with all its bindings and return - * its chained. + * \brief Reclaim a \ref BindingTable with all its bindings. * * \param bt is the \ref BindingTable to reclaim. * - * \returns the chained \ref BindingTable. - * * \related BindingTable */ -extern BindingTable *BindingTable_release(BindingTable *bt); +extern void BindingTable_release(BindingTable *bt); /** * \brief Set a Binding in a \ref BindingTable. @@ -46,6 +41,10 @@ extern BindingTable *BindingTable_release(BindingTable *bt); * \note Binding names are equal or not by means of strcmp, and each * name has a at most single Binding. * + * The name and the value are held as given with all memory management + * the callers responsibility. This function will however create new + * Binding objects and reclaim the old ones as needed. + * * A value of \b 0 indicates "unbound". * * \related BindingTable @@ -59,14 +58,13 @@ extern void BindingTable_set(BindingTable *bt,char *name,void *value); * * \param name is the Binding variable name. * - * \param value is the Binding value. + * \returns the value of the found Binding, or \b 0 if none is found. * * \note Binding names are equal or not by means of strcmp, and each * name has a at most single Binding. * - * This function scan's the \ref BindingTable chain for the first - * assignment, if any, of the name. Note that a name can be made - * unbound on top of being bound by setting it to \b 0. + * \note Not also that a name can be made unbound on top of being + * bound by setting it to \b 0. * * \related BindingTable */ @@ -77,32 +75,23 @@ extern void *BindingTable_get(BindingTable *bt,char *name); * * \param bt is the BindingTable concerned. * - * \param arity is the tuple arity. - * * \param t is the tuple of (char*) names to dereference. */ -void BindingTable_deref(BindingTable *bt,int arity,Tuple *t); +extern void BindingTable_deref(BindingTable *bt,Tuple *t); /** - * \brief Unify two named bindings with option equal-value callback. + * \brief Set values for names, optionally unbinding names as well. * - * \param bt is the first BindingTable concerned. - * - * \param n1 is the first Binding name. + * \param bt is the bindingtable concerned. * - * \param n2 is the second Binding name. + * \param nm is the Tuple of names to bind. * - * \param eq is the optional equal-value callback that returns 0 if - * the given values are equal. + * \param vs is the Tuple of values. * - * This function updates the top \ref BindingTable by assigning n1 or - * n2 to any value the other has (in the chain) unless they have - * different values (in the chain). If both are unassigned, then - * neither get reassigned in the to both BindingTable/ + * \param all is a flag to assign all (1) or only non-zero (0) values. * - * \related BindingTable + * \note The values tuple must be as wide as the names tuple. */ -extern int BindingTable_unify( - BindingTable *bt,char *n1,char *n2,int (*eq)(void*,void*)); +extern void BindingTable_set_all(BindingTable *bt,Tuple *nm,Tuple *vs,int all); #endif