This module implements a dynamic array as operational table data type. The internal element vector will be automatically resized on element insertion and disposal.
OT_Tab | Abstract operational table type |
OT_Obj | Abstract table element type |
OT_Objs | Abstract element vector type |
#define ROW(type) OT_Tab
OT_Tab OT_create ( OT_Obj (*copy)(OT_Obj obj), void (*del)(OT_Obj obj), c_bool (*equal)(OT_Obj lobj, OT_Obj robj) ) #define OT_CREATE(type,cpy,del,equ) \ OT_create \ ( \ (OT_Obj (*)(OT_Obj obj)) cpy, \ (void (*)(OT_Obj obj)) del, \ (c_bool (*)(OT_Obj lobj, OT_Obj robj)) equ \ ) #define OT_CREATE_ADT(type) OT_CREATE(type,primCopy,primFree,primEqual) | creates an operational table function parameter: copies an element frees an element equality on elements |
OT_Tab OT_cfill ( OT_Obj (*copy)(OT_Obj obj), void (*del)(OT_Obj obj), c_bool (*equal)(OT_Obj lobj, OT_Obj robj), OT_Obj dftval, INT ntimes ) #define OT_CFILL(type,cpy,del,equ,dft,n) \ OT_cfill \ ( \ (OT_Obj (*)(OT_Obj obj)) cpy, \ (void (*)(OT_Obj obj)) del, \ (c_bool (*)(OT_Obj lobj, OT_Obj robj)) equ, \ (OT_Obj)dft, \ (n) \ ) #define OT_CFILL_ADT(type,d,n) OT_CFILL(type,primCopy,primFree,primEqual,d,n) #define OT_INJECT_ADT(type,d) OT_CFILL(type,primCopy,primFree,primEqual,d,1) | creates and fills an operational table ntimes with the value 'dftval' function parameter: copies an element frees an element equality on elements default value initial element number |
void OT_init(OT_Tab tab) #define OT_INIT OT_init | resets / initializes table 'tab' |
INT OT_cnt(OT_Tab tab) #define OT_CNT OT_cnt | number of elements in table 'tab' |
INT OT_t_ins(OT_Tab tab, OT_Obj obj) #define OT_T_INS(tab,obj) OT_t_ins(tab,ABS_CAST(OT_Obj,obj)) | inserts 'obj' as last element of table 'tab' result = element index |
INT OT_p_ins(OT_Tab tab, OT_Obj obj, INT nth) #define OT_P_INS(tab,obj,nth) OT_p_ins(tab,ABS_CAST(OT_Obj,obj),nth) | inserts 'obj' as nth element of table 'tab' ( nth >= 1 ) result = element index |
INT OT_s_ins ( OT_Tab tab,OT_Obj obj,int (*cmp3)(OT_Obj lobj, OT_Obj robj),c_bool unique ) #define OT_S_INS(tab,obj,cmp3) \ OT_s_ins \ ( \ tab, \ ABS_CAST(OT_Obj,obj), \ (int (*)(OT_Obj lobj, OT_Obj robj)) cmp3, \ C_False \ ) #define OT_S_INS_U(tab,obj,cmp3) \ OT_s_ins \ ( \ tab, \ ABS_CAST(OT_Obj,obj), \ (int (*)(OT_Obj lobj, OT_Obj robj)) cmp3, \ C_True \ ) | inserts element 'obj' in table 'tab' ( sorted ) unique --> no insert if the element exists result = element index |
OT_Obj OT_upd(OT_Tab tab, INT idx, OT_Obj obj) #define OT_UPD(type,tab,idx,obj) \ ( ABS_CAST(type,OT_upd(tab,(idx),ABS_CAST(OT_Obj,obj))) ) | updates table element tab[idx] with 'obj' |
OT_Objs OT_copyV(OT_Tab tab, INT size, StdCPtr (*cfun)(OT_Obj obj)) #define OT_COPY_V(type,tab,sz,fun) \ ( ABS_CAST(type,OT_copyV(tab,(sz),(StdCPtr (*)(OT_Obj obj)) fun)) ) | copies elements of table 'tab' to an array assertion: elements of constant size |
OT_Tab OT_reverse(OT_Tab tab) #define OT_REVERSE OT_reverse | reverses elements in table 'tab' ( not copied ) |
OT_Tab OT_copy(OT_Tab tab) #define OT_COPY OT_copy | copies table 'tab' |
OT_Tab OT_append(OT_Tab dst, OT_Tab src) #define OT_APPEND OT_append | appends table 'src' to table 'dst'; 'src' won't be removed |
OT_Obj __HUGE* OT_TRICKY_objects(OT_Tab tab) | internal element array of table 'tab' ( use with care ! ) |
OT_Obj OT_get(OT_Tab tab, INT idx) #define OT_GET(type,tab,idx) ( ABS_CAST(type,OT_get(tab,(idx))) ) #define OT_GET_I(type,t,it,idx) OT_GET(type,t,OT_GET(INT,it,(idx))) #define OT_GET_small(type,tab,idx) ( (type)((long)OT_get(tab,(idx))) ) #define OT_GET_short(tab,idx) ( (short)((long)OT_get(tab,(idx))) ) | table element tab[idx] |
INT OT_l_find(OT_Tab tab, OT_Obj obj, c_bool (*cmp)(OT_Obj tobj, OT_Obj obj)) #define OT_L_FIND_EQ(tab,obj) \ OT_l_find(tab,ABS_CAST(OT_Obj,obj),(c_bool (*)(OT_Obj tobj, OT_Obj Obj))NULL) #define OT_L_FIND(tab,obj,cmp) \ OT_l_find(tab,ABS_CAST(OT_Obj,obj),(c_bool (*)(OT_Obj tobj, OT_Obj Obj)) cmp) | position of key element 'obj' in table 'tab' or 0 ( linear search ) |
OT_Tab OT_sort(OT_Tab tab, int (*cmp3)(OT_Obj lobj, OT_Obj robj)) #define OT_SORT(tab,cmp3) \ OT_sort(tab,(int (*)(OT_Obj lobj, OT_Obj robj)) cmp3) | sorts table 'tab' ( quicksort method ) result = index table |
INT OT_b_find ( OT_Tab tab,OT_Tab idxtab,OT_Obj obj,int (*cmp3)(OT_Obj lobj, OT_Obj robj) ) #define OT_B_FIND_NI(tab,obj,cmp3) \ OT_b_find \ ( \ tab,(OT_Tab)NULL,ABS_CAST(OT_Obj,obj), \ (int (*)(OT_Obj lobj, OT_Obj robj)) cmp3 \ ) #define OT_B_FIND(tab,itab,obj,cmp3) \ OT_b_find \ ( \ tab,itab,ABS_CAST(OT_Obj,obj), \ (int (*)(OT_Obj lobj, OT_Obj robj)) cmp3 \ ) | position of key element 'obj' in table 'tab' or 0 ( binary search ) Optional the index table 'idxtab' specifies the sort order. |
void OT_delH(OT_Tab tab) #define OT_DEL_H OT_delH | removes header of table 'tab' |
void OT_delT(OT_Tab tab) #define OT_DEL_T OT_delT | removes table 'tab' |
void OT_delE(OT_Tab tab, INT idx) #define OT_DEL_E OT_delE | removes table element tab[idx] |
void OT_delES(OT_Tab tab, INT idx, INT cnt) #define OT_DEL_ES OT_delES | removes 'cnt' elements from table 'tab' beginning at index 'idx' |
void OT_clear(OT_Tab tab) #define OT_CLEAR OT_clear | clears table 'tab'; removes all elements |
void OT_print(OT_Tab tab, void (*pMbr)(OT_Obj obj), int cols, int indent) #define OT_PRINT(tab,pMbr,cols,ind) \ OT_print(tab,(void (*)(OT_Obj obj)) pMbr,(cols),(ind)) | prints table 'tab' to stdout ( unsorted ) |
void OT_s_print ( OT_Tab tab, OT_Tab idxtab, void (*pMbr)(OT_Obj obj), int cols, int indent ) #define OT_S_PRINT(tab,itab,pMbr,cols,ind) \ OT_s_print(tab,itab,(void (*)(OT_Obj obj)) pMbr,(cols),(ind)) | prints table 'tab' to stdout ( sorted ) |
c_bool OT_equal(OT_Tab left, OT_Tab right) #define OT_EQUAL OT_equal | left = right ? |
StdCPtr OT_map ( int argcnt, void (*fun)(OT_Obj* objs, StdCPtr any), StdCPtr any, OT_Tab tab, ... ) #define OT_MAP_F OT_map | executes 'fun' on each element in all tables function parameter: number of arguments element map function any additional context operational tables |
c_bool OT_forall ( int argcnt, c_bool (*fun)(OT_Obj* objs, StdCPtr any), StdCPtr any, OT_Tab tab, ... ) #define OT_FORALL_P OT_forall | executes 'fun' on each element in all tables; on false execution stops function parameter: number of arguments element map function any additional context operational tables |
c_bool OT_exists ( int argcnt, c_bool (*fun)(OT_Obj* objs, StdCPtr any), StdCPtr any, OT_Tab tab, ... ) #define OT_EXISTS_P OT_exists | executes 'fun' on each element in all tables; on true execution stops function parameter: number of arguments element map function any additional context operational tables |
#define OT_NEWSTK(stk) stk = OT_CREATE_ADT(StdCPtr) #define OT_EMPTYSTK(stk) ( OT_CNT(stk) ? C_False : C_True ) #define OT_CNTSTK(stk) OT_CNT(stk) #define OT_PUSH(ptr,stk) OT_T_INS(stk,ABS_CAST(OT_Obj,ptr)) #define OT_POP(stk) OT_DEL_E(stk,OT_cnt(stk)-1) #define OT_TOP(type,stk) OT_GET(type,stk,OT_cnt(stk)-1) #define OT_TOP_small(type,stk) ( (type)((long)OT_get(stk,OT_cnt(stk)-1)) ) #define OT_TOP_short(stk) ( (short)((long)OT_get(stk,OT_cnt(stk)-1)) ) #define OT_DELSTK(stk) OT_DEL_T(stk)