///\file table.h /// the central table type, based on core/khash.h // // (c) 2008 why the lucky stiff, the freelance professor // #ifndef POTION_TABLE_H #define POTION_TABLE_H #include "potion.h" #include "internal.h" #include "khash.h" #ifndef MAX_INS_SORT # define MAX_INS_SORT 10 #endif typedef PN (*PN_MCACHE_FUNC)(unsigned int hash); // TODO: ensure the random PNUniq is truly unique for strings typedef PN (*PN_IVAR_FUNC)(PNUniq hash); /// the central vtable, see io http://www.piumarta.com/pepsi/objmodel.pdf /// \image html p2-mop.png /// \see objmodel.c struct PNVtable { PN_OBJECT_HEADER; ///< PNType vt; PNUniq uniq PNType parent; ///< parent type, default: for P->lobby: PN_VTABLE(PN_TOBJECT) PNType type; ///< current type PN name; ///< classes/types need to be found by name. \see potion_class_find int ivlen; ///< PN_TUPLE_LEN(ivars) PN ivars; ///< PNTuple of all our or the parents inherited vars vPN(Table) methods;///< methods hash, PNTable: name => closures vPN(Vtable) meta; /// meta PNVtable PN ctor; ///< store the bound closure (or its parents) PN call, callset; PN_MCACHE_FUNC mcache; ///< (yet unused) method cache PN_IVAR_FUNC ivfunc; }; /// the table class, based on khash struct PNTable { PN_OBJECT_HEADER; ///< PNType vt; PNUniq uniq PN_TABLE_HEADER; ///< PN_SIZE n_buckets, size, n_occupied, upper_bound char table[0]; }; KHASH_MAP_INIT_PN(PN, struct PNTable) KHASH_MAP_INIT_STR(str, struct PNTable) #endif