APPENDIX A: CURRENT ORGANIZATIONS AND OPERATIONS IN C AND C++


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(hp,&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();

 

Chapter 19: Revision History Appendix B: References