shrub/include/f/chad.h
2014-03-14 10:50:12 -07:00

108 lines
3.3 KiB
C

/* include/chad.h
**
** This file is in the public domain.
*/
/** Data types.
**/
/* u2_loom_pear: overloaded name-value pair.
*/
typedef struct {
/* [nam val]: name-value pair
** [u2_none ray]: subtable
** [u2_none 0]: empty
*/
u2_weak nam;
u2_weak val;
} u2_loom_pear;
#define u2_pear_nam(per_r) *u2_at(per_r, u2_loom_pear, nam)
#define u2_pear_val(per_r) *u2_at(per_r, u2_loom_pear, nam)
/* u2_loom_chad:
**
** 16-way mug-powered hashtable. If wun != u2_none,
** table is not allocated.
*/
typedef struct {
u2_loom_pear dol_p[16];
} u2_loom_chad;
#define u2_chad_dol(cad_r, i_w) \
( (cad_r) + ((i_w) * c3_wiseof(u2_loom_pear)) )
#define u2_chad_dol_nam(cad_r, i_w) u2_pear_nam(u2_chad_dol(cad_r, i_w))
#define u2_chad_dol_val(cad_r, i_w) u2_pear_val(u2_chad_dol(cad_r, i_w))
/** Functions.
**/
/* u2_ch_init():
**
** Initialize empty chad.
*/
void
u2_ch_init(u2_ray cad_r);
/* u2_ch_find():
**
** Find value for `nam` in `cad`, or return `u2_none`.
*/
u2_weak
u2_ch_find(u2_ray cad_r,
u2_noun nam);
/* u2_ch_find_cell():
**
** Find value for `[hed tal]` in `cad`, or return `u2_none`.
*/
u2_weak
u2_ch_find_cell(u2_ray cad_r,
u2_noun hed,
u2_noun tal);
/* u2_ch_find_mixt():
**
** Find value for `[hed tal]` in `cad`, or return `u2_none`.
*/
u2_weak
u2_ch_find_mixt(u2_ray cad_r,
const c3_c* hed_c,
u2_noun tal);
/* u2_ch_save():
**
** Save `val` under `nam` in `cad`, allocating in `ral`.
** Return `u2_none` iff allocation fails. Asserts on duplicate.
*/
u2_weak // retain
u2_ch_save(u2_ray ral_r,
u2_ray cad_r,
u2_noun nam, // retain
u2_noun val); // retain
/* u2_ch_save_cell():
**
** Save `val` under `[hed tal]` in `cad`, allocating in `ral`.
** Return `u2_none` iff allocation fails. Asserts on duplicate.
*/
u2_weak // retain
u2_ch_save_cell(u2_ray ral_r,
u2_ray cad_r,
u2_noun hed, // retain
u2_noun tal, // retain
u2_noun val); // retain
/* u2_ch_save_mixt():
**
** Save `val` under `[hed tal]` in `cad`, allocating in `ral`.
** Return `u2_none` iff allocation fails. Asserts on duplicate.
**
** Caller retains ownership of arguments; callee retains result.
*/
u2_weak // retain
u2_ch_save_mixt(u2_ray ral_r,
u2_ray cad_r,
const c3_c* hed_c,
u2_noun tal, // retain
u2_noun val); // retain