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)