ZZ_ORG_SINGLE_RING(id,type); ZZ_HYPER_SINGLE_RING(id,type);
type *entry,*p;
int (cmpF*)(const void*,const void*);
| ZZ_FORWARD(id,p,next); | next=id.fwd(p); |
| ZZ_ADD(id,entry,p); | entry=id.add(entry,p); |
| ZZ_DELETE(id,entry,p); | entry=id.del(entry,p); |
| ZZ_MERGE(id,s,t,NULL); | s=id.merge(s,t); |
| ZZ_SORT(id,cmpFun,entry); | entry=id.sort(cmpFun,entry); |
| ZZ_A_TRAVERSE(id,entry,p){ ... }ZZ_A_END; |
id_iterator it(entry); while(p= ++it){ ... }; it.start(entry); |
ZZ_ORG_DOUBLE_RING(id,type); ZZ_HYPER_DOUBLE_RING(id,type);
type *entry,*p,*next;
int (cmpF*)(const void*,const void*);
| ZZ_FORWARD(id,p,next); | next=id.fwd(p); |
| ZZ_BACKWARD(id,p,next); | next=id.bwd(p); |
| ZZ_ADD(id,entry,p); | entry=id.add(entry,p); |
| ZZ_INSERT(id,entry,p); | |
| entry=id.ins(entry,p); | |
| ZZ_DELETE(id,entry,p); | entry=id.del(entry,p); |
| ZZ_MERGE(id,s,t,NULL); | s=id.merge(s,t); |
| ZZ_SORT(id,cmpFun,entry); | entry=id.sort(cmpFun,entry); |
| ZZ_A_TRAVERSE(id,entry,p){ ... }ZZ_A_END; |
id_iterator it(entry); while(p= ++it){ ... }; |
| ZZ_A_REVERSE(id,entry,p){ ... ZZ_A_END; |
it.start(entry); while(p=it- -){ ... }; |
ZZ_ORG_SINGLE_TRIANGLE (id,parT,chiT); ZZ_HYPER_SINGLE_TRIANGLE(id,parT,chiT);
parT *p,*p1,*p2;
chiT *c,*s;
int (cmpF*)(const void*,const void*);
| ZZ_PARENT(id,c,p); | p=id.par(c); |
| ZZ_CHILD(id,c,p); | p=id.child(c); |
| ZZ_FORWARD(id,c,s); | s=id.fwd(c); |
| ZZ_SET(id,p,c); | id.set(c); |
| ZZ_ADD(id,p,c); | id.add(p,c); |
| ZZ_DELETE(id,p,c); | id.del(p,c); |
| ZZ_MERGE(id,c,s,p); | id.merge(c,s,p); |
| ZZ_SORT(id,cmpFun,p); |
id.sort(cmpFun,p); id.switchParents(p1,p2); |
| ZZ_A_TRAVERSE(id,p,c) ... }ZZ_A_END; |
{id_iterator it(p); while(c= ++it){ ... }; it.start(p); |
ZZ_ORG_SINGLE_COLLECT(id,parT,chiT); ZZ_HYPER_SINGLE_COLLECT(id,parT,chiT);
parT *p,*p1,*p2;
chiT *c,*s;
int (cmpF*)(const void*,const void*);
| ZZ_CHILD(id,c,p); | p=id.child(c); |
| ZZ_FORWARD(id,c,s); | s=id.fwd(c); |
| ZZ_SET(id,p,c); | id.set(p,c); |
| ZZ_ADD(id,p,c); | id.add(p,c); |
| ZZ_DELETE(id,p,c); | id.del(p,c); |
| ZZ_MERGE(id,c,s,p); | id.merge(c,s,p); |
| ZZ_SORT(id,cmpFun,p); |
id.sort(cmpFun,p); id.switchParents(p1,p2); |
| ZZ_A_TRAVERSE(id,p,c){ ... }ZZ_A_END; |
id_iterator it(p); while(c= ++it){ ... }; it.start(p); |
ZZ_ORG_DOUBLE_COLLECT(id,parT,chiT); ZZ_HYPER_DOUBLE_COLLECT(id,parT,chiT);
parT *p,*p1,*p2;
chiT *c,*s;
int (cmpF*)(const void*,const void*);
| ZZ_CHILD(id,c,p); | p=id.child(c); |
| ZZ_FORWARD(id,c,s); | s=id.fwd(c); |
| ZZ_BACKWARD(id,c,s); | s=id.bwd(c); |
| ZZ_SET(id,p,c); | id.set(p,c); |
| ZZ_ADD(id,p,c); | id.add(p,c); |
| ZZ_INSERT(id,c,s); | id.ins(c,s); |
| ZZ_DELETE(id,p,c); | id.del(p,c); |
| ZZ_MERGE(id,c,s,p); | id.merge(c,s,p); |
| ZZ_SORT(id,cmpFun,p); |
id.sort(cmpFun,p); id.switchParents(p1,p2); |
| ZZ_A_TRAVERSE(id,p,c){ ... }ZZ_A_END; |
id_iterator it(p); while(c= ++it){ ... }; it.start(p); |
| ZZ_A_REVERSE(id,p,c){ ... }ZZ_A_END; |
it.start(p); while(c=it++){ ... }; it.start(p); |
ZZ_ORG_NAME(id,type); ZZ_HYPER_NAME(id,type);
type *p;
char *n;
| ZZ_FORWARD(id,p,n); | n=id.fwd(p); |
| ZZ_ADD(id,p,n); | id.add(p,n); |
| ZZ_DELETE(id,p,n); | n=id.del(p); |
ZZ_ORG_SINGLE_LINK(id,sourT,targT); ZZ_HYPER_SINGLE_LINK(id,sourT,targT);
sourT *s;
targT *t;
| ZZ_FORWARD(id,s,t); | t=id.fwd(p); |
| ZZ_ADD(id,s,t); | id.add(p,t); |
| ZZ_DELETE(id,s,t); | t=id.del(p); |
ZZ_ORG_LIFO(id,type); ZZ_HYPER_LIFO(id,type);
type *p; /* an object */
type *entry; /* entry into the stack */
| ZZ_PUSH(id,entry,t); | id.push(p); |
| ZZ_POP(id,entry,t); | p=id.pop(); |
ZZ_ORG_FIFO(id,type); ZZ_HYPER_FIFO(id,type);
type *p; /* an object */
type *entry; /* entry into the stack */
| ZZ_PUSH(id,entry,t); | id.push(p); |
| ZZ_POP(id,entry,t); | p=id.pop(); |
ZZ_ORG_DOUBLE_LINK(id,sourT,targT); ZZ_HYPER_DOUBLE_LINK(id,sourT,targT);
sourT *s;
targT *t;
| ZZ_FORWARD(id,s,t); | t=id.fwd(p); |
| ZZ_BACKWARD(id,t,s); | s=id.bwd(t); |
| ZZ_ADD(id,s,t); | id.add(p,t); |
| ZZ_DELETE(id,s,t); | t=id.del(p); |
ZZ_ORG_GENERAL_LINK(id,sourT); ZZ_HYPER_GENERAL_LINK(id,sourT);
sourT *s;
char *t;
| ZZ_FORWARD(id,s,t); | t=id.fwd(p); |
| ZZ_ADD(id,s,t); | id.add(p,t); |
| ZZ_DELETE(id,s,t); | t=id.del(p); |
ZZ_ORG_REFERENCE(id,sourT,targT); ZZ_HYPER_REFERENCE(id,sourT,targT);
sourT *s; targT *t; int count;
| ZZ_FORWARD(id,s,t); | t=id.fwd(p); |
| ZZ_ADD(id,s,t); | id.add(p,t); |
| ZZ_DELETE(id,s,t); | t=id.del(p); |
| ZZ_SET_REFERENCE(id,t,count); | id.set(t,count); |
| ZZ_GET_REFERENCE(id,t,count); | count=id.get(t); |
ZZ_ORG_SINGLE_TREE(id,obj); ZZ_HYPER_SINGLE_TREE(id,obj);
obj *p,*c,*s;
| ZZ_PARENT(id,c,p); | p=id.par(c); |
| ZZ_CHILD(id,p,c); | c=id.child(p); |
| ZZ_FORWARD(id,c,s); | s=id.fwd(c); |
| ZZ_SET(id,p,c); | id.bwd(p,c); |
| ZZ_ADD(id,p,c); | id.add(p,c); |
| ZZ_APPEND(id,c,s); | id.app(c,s); |
| ZZ_DELETE(id,NULL,c);< | id.del(c); |
| ZZ_A_TRAVERSE(id,p,c){ ... }ZZ_A_END; |
id_iterator it(p); while(c= ++it){ ... }; it.start(p); |
ZZ_ORG_DOUBLE_TREE(id,obj); ZZ_HYPER_DOUBLE_TREE(id,obj);
obj *p,*c,*s;
| ZZ_PARENT(id,c,p); | p=id.par(c); |
| ZZ_CHILD(id,p,c); | c=id.child(p); |
| ZZ_FORWARD(id,c,s); | s=id.fwd(c); |
| ZZ_BACKWARD(id,c,s); | s=id.bwd(c); |
| ZZ_SET(id,p,c); | id.bwd(p,c); |
| ZZ_ADD(id,p,c); | id.add(p,c); |
| ZZ_INSERT(id,c,s) | id.ins(c,s); |
| ZZ_APPEND(id,c,s) | id.app(c,s); |
| ZZ_DELETE(id,NULL,c); | id.del(c); |
| ZZ_A_TRAVERSE(id,p,c){ ... }ZZ_A_END; |
id_iterator it(p); while(c= ++it){ ... }; |
| ZZ_A_RETRACE(id,p,c){ ... }ZZ_A_END; |
it.start(p); while(c=it- -){ ... }; |
ZZ_ORG_SINGLE_GRAPH(id,vertex,edge); ZZ_HYPER_SINGLE_GRAPH(id,vertex,edge);
vertex *v,*t[2];
edge *e,*s;
| ZZ_ADD(id,t,e); | id.add(t,e); |
| ZZ_DELETE(id,t,e); | id.del(e); |
| ZZ_NODES(id,t,e); |
id.nodes(t,e); e=id.edge(t); s=id.fwd(e); id.set(v,e); |
| ZZ_A_TRAVERSE(id,t,e){ ... }ZZ_A_END; |
id_iterator it(t[0]); while(e= ++it){ t[1]=it.adj(); ... }; it.start(t[0]); |
ZZ_ORG_DIRECT_GRAPH(id,vertex,edge); ZZ_HYPER_DIRECT_GRAPH(id,vertex,edge);
vertex *v,*t[2];
edge *e,*s;
| ZZ_ADD(id,t,e); | id.add(t,e); |
| ZZ_DELETE(id,t,e); | id.del(t,e); |
| ZZ_NODES(id,t,e); |
id.nodes(t,e); e=id.edge(t); s=id.fwd(e); id.set(v,e); |
| ZZ_A_TRAVERSE(id,t,e){ ... }ZZ_A_END; |
id_iterator it(t[0]); while(e= ++it){ inset pls t[1]=it.adj(); ... }; it.start(t[0]); |
ZZ_ORG_1_TO_1(id,srs,rel,targ); ZZ_HYPER_1_TO_1(id,src,rel,targ);
ZZ_ORG_1_TO_N(id,src,rel,targ); ZZ_HYPER_1_TO_N(id,src,rel,targ);
ZZ_ORG_M_TO_1(id,src,rel,targ); ZZ_HYPER_M_TO_1(id,src,rel,targ);
ZZ_ORG_M_TO_N(id,src,rel,targ); ZZ_HYPER_M_TO_N(id,src,rel,targ);
Source *s; Relation *r; Target *t;
| ZZ_ADD_RELATION(id,s,r,t); | id.add(s,r,t); |
| ZZ_DELETE_RELATION(id,r); | id.del(r); |
| ZZ_FORWARD(id,s,r); | r=id.fwd(s); |
| ZZ_BACKWARD(id,t,r); | r=id.bwd(t); |
| ZZ_SOURCE(id,s,r); | s=id.source(r); |
| ZZ_TARGET(id,t,r); | t=id.target(r); |
| ZZ_A_TRAVERSE(id,s,r){ ... }ZZ_A_END; |
id_sIterator it(s); while(r= ++it){ ... } id.start(s); |
| ZZ_A_RETRACE(id,t,r){ ... }ZZ_A_END; |
id_tIterator it(t); while(r= ++it){ ... } id.start(t); |
ZZ_ORG_ARRAY(id,holder,obj); ZZ_HYPER_ARRAY(id,holder,obj);
int sz,incr,wMark; /* size, increment, waterMark */ int i; /* index */ int (cmpF*)(const void*,const void*); /* function to compare two objects */ void (bck*)(void *,int); /* callback function */ holder *hp; obj *a; /* start of the array */ obj *e; /* pointer to an object/array */ obj r; /* element of the array */ void *vp; /* pointer to be NULL or undetermined value*/
| ZZ_FORM_ARRAY(id,hp,sz,incr,a); |
a=id.form(hp,sz,incr); vp=id.formed(hp); |
| ZZ_FREE_ARRAY(id,hp); | id.free(hp); |
| ZZ_SIZE_ARRAY(id,hp,sz,wMark,incr); | sz=id.size(hp,&wMark,&incr); |
| ZZ_INDEX_ARRAY(id,hp,i,e); | e=id.ind(hp,i); |
| ZZ_HEAD_ARRAY(id,hp,e); | e=id.head(hp); |
| ZZ_RESET_ARRAY(id,hp,wMark,incr); | id.reset(hp,wMark,incr); |
| ZZ_PUSH(id,hp,e); | id.push(hp,e); |
| ZZ_POP(id,hp,e); | e=id.pop(hp); |
| ZZ_SORT(id,cmpF,hp); | id.sort(cmpF,hp); |
| ZZ_IN_HEAP(id,cmpF,hp,e,bck); | id.inHeap(cmpF,hp,e,bck); |
| ZZ_OUT_HEAP(id,cmpF,hp,&r,bck); | id.outHeap(cmpF,hp,&r,bck); |
| ZZ_UPDATE_HEAP(id,cmpF,hp,i,bck); | id.updHeap(cmpF,hp,i,bck); |
| ZZ_DELETE_HEAP(id,cmpF,hp,i,bck); | id.delHeap(cmpF,hp,i,bck); |
ZZ_HYPER_HASH(id,holder,obj); ZZ_HYPER_HASH(id,holder,obj);
int sz,num,slot; /* size, number, slot */ holder *hp; /* holder object */ obj *p,*s; /* objects */ obj *t; /* object template with a search key */ void *vp; /* pointer to be NULL or undetermined value*/
| ZZ_FORM_HASH(id,hp,sz); |
id.form(hp,sz); id.formed(hp); |
| ZZ_RESIZE_HASH(id,hp,sz); | id.resize(hp,sz); |
| ZZ_ADD(id,hp,p); | id.add(hp,p); |
| ZZ_DELETE(id,hp,p); | id.del(hp,p); |
| ZZ_SIZE_HASH(id,hp,sz,*num); | sz=id.size(hp,&num); |
| ZZ_SLOT_HASH(id,hp,slot,p); | p=id.slot(hp,slot); |
| ZZ_FREE_HASH(id,hp); | id.free(hp); |
| ZZ_GET_HASH(id,hp,t,p); |
p=id.get(h,t); id.newFun(h); |
| ZZ_A_TRAVERSE(id,s,p){ ... }ZZ_A_END; it.start(s); |
id_iterator it(s); while(p= ++it){ ... }; |
ZZ_ORG_TIME_STAMP(obj); ZZ_HYPER_TIME_STAMP(obj);
char ts[6]; /* time record, byte encoded numbers: Y M D H
M S */
obj *p,*s; /* two objects */
| ZZ_GET_TIME_STAMP(p,ts); | p->getTime(ts); |
| ZZ_SET_TIME(p); | p->setTime(); |
| ZZ_CMP_TIME_STAMP(p,s,i); | i=p->cmpTime(s); |
ZZ_ORG_PROPERTY(obj); ZZ_HYPER_PROPERTY(obj);
TEXT prop; /* property type, for example: int */ char *pTyp; /* property type as string, for example:"int"*/ obj *p; /* given object */ char *label; /* property label */ char **val; /* property value always treated as an array */ int n; /* size of the array */ FILE *fp; /* output file for the print */
| ZZ_SET_PROPERTY(prop,p,label,val,n); | p->setProp(pTyp,label,val,n); |
| ZZ_GET_PROPERTY(pTyp,p,label,val,n); | val=(char*)p->getProp(label,&pTyp,&n); |
| ZZ_DELETE_PROPERTY(p,label); | p->delProp(label); |
| ZZ_A_TRAVERSE_PROPERTY(pTyp,p,label,val,n){ ... }ZZ_A_END; |
obj_propIterator it(p); while(val=p->next(&label,&pType,&n)){ }; |
ZZ_ORG_PAGER(id,hp); ZZ_HYPER_PAGER(id,hp);
Holder *hp; /* holder object */ char *fn; /* file name */ int ps; /* page size */ int np; /* number of pages */ int ii; /* 0= not initialized, 1= by '\0', 2= by' ' */ long ind; /* byte address within the file */ char *buff; /* memory buffer */ int n; /* object size */ int mode; /* 0=read 1=write */ char *ptr; /* returned pointer to 'ind' location */
| ZZ_FORM_PAGER(id,hp,fn,ps,np,ii); | id.form(hp,fn,ps,np,ii); |
| ZZ_IO_PAGER(id,hp,ind,buff,n,mode); | id.io(hp,ind,buff,n,mode); |
| ZZ_ADDRESS_PAGER(id,hp,ind,ptr); | ptr=id.addr(hp,ind); |
| ZZ_CLOSE_PAGER(id,hp); |
id.close(hp); id.fill(hp); id.flush(); |
ZZ_HYPER_TYPE(id);
This organization works in C++ only
int n; // total number of types used int tp,tt; // index into the internal type table text objType; // object type void *vp; // object pointer void **vv; // pointer to a pointer void *r1,*r2; // range limits of the v.f.table zzTypeInfo inf; // type info structure
n=id.num(); // returns number of types tp=ZZgetType(objType); // gets type index id.trueType(&vp,&tp); // updates vp and tp to the true pointer and type id.info(tp,&inf);// returns info for type tp id.virtRange(&r1,&r2); // returns the range of v.f.pointers for all types id_iterate it(tp); // iterates through the base classes and members of tp
while((tt= ++it)=0){ ... }
type_pointers ptrs(vp,tp); // traverse HYPER pointers on vp
while(vv= ++ptrs){ ... }
struct zzTypeInfo { // structure which keeps the type info
char *name; // class name
int size; // size of this class
char *mask1; // 0-filled object with correct v.f/v.c. pointers
char *mask2; // 'F' or 'C' for bytes that start v.f./v.c. pointers
int virt; // bin packed:
// 01=abstr.class,02=virt.base class,04=virt.functions present
};
ZZ_ORG_UTILITIES(id); ZZ_HYPER_UTILITIES(id);
char *s,*p; /* strings */ int i,mSz,pSz; /* int memory size, page size */ int fmt,mode,ver; /* format, mode, and version for open/save */ char *file; int fc; /*file control */ char *bn; /* name or address of memory block */ void *hook; /* hook to private data */ char *obj; /* general object */ FILE *fp; /* file to print on */ char *lb,*tp; /* label and type of the property */ void *val; /* array of property values */ int n; /* size of the property array */ void fun(char *obj,int typeInd,int size,char *priv); type *r; int n; /* number of key entries (roots) */ void* v[]; /* array of pointers to key entries */ char* t[]; /* array of type names for key entries */
| ZZ_STRING_ALLOC(s,p); | p=id.strAlloc(s); |
| ZZ_STRING_FREE(s); | id.strFree(s); |
| ZZ_PLAIN_ALLOC(type,i,r); | r=new type[i]; |
| ZZ_PLAIN_FREE(type,i,r); | delete(r); |
| ZZ_OBJECT_CLEAR(); | id.objClear(); |
| ZZ_BLOCK_ALLOC(i); | id.blkAlloc(mSz,pSz); |
| ZZ_BLOCK_ACTIVE(bn,mode); | id.blkActive(bn,mode); |
| ZZ_BLOCK_UTIL(bn,&hook,mode); | it.blkUtil(bn,&hook,mode); |
| ZZ_BLOCK_FREE(i); | id.blkFree(i); |
| i=ZZerror | i=id.error(); |
| ZZerror=0; | id.ok(); |
| ZZ_SAVE(file,n,v,t); | id.save(file,n,v,t); |
| ZZ_OPEN(file,n,v,t); | id.open(file,n,v,t); |
| ZZ_CLEAR(n,v,t); | id.clear(n,v,t); |
| ZZ_BIND_POINTER(s,p); | p=id.bind(s); |
| ZZ_KEEP_TABLES(); | id.keepTbl(); |
| ZZ_FREE_TABLES(); | id.freeTbl()' |
| ZZ_SWEAP_SET(n,v,t); | id.swpSet(n,v,t); |
| ZZ_SWEAP_FUNCTION(n,v,t); | id.swpFun(fun,priv); |
| ZZ_SWEAP_FREE; | id.swpFree(); |
| ZZ_MODE_SAVE(fmt,mode,ver,fc); | id.mode(fmt,mode,ver,fc); |
| ZZ_CLOSE_BIND; | id.close(); |
| ZZ_TYPE_NAME(i,p); | p=id.type(i); |
| ZZ_PRINT_PROPERTY(fp,tp,lb,val,n); | prtProp(fp,tp,lb,val,n); |
| ZZ_DEB_PRT(r,tp) | id.debug(r,tp); |
| N/A | n=id.getNumObjects(); |
| Appendix B: References |