⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 set.h

📁 Oversampling Delta-Sigma Data Converters
💻 H
字号:
/* set.h -- header file for set.c that implements set     see README and set.c      only uses mem.c, malloc/free   for error handling, writes message and calls      qh_errexit (qhmem_ERRqhull, NULL, NULL);      set operations satisfy the following properties:    - sets have a max size, the actual size (if different) is stored at the end    - every set is NULL terminated    - sets may be sorted or unsorted, the caller must distinguish this      copyright (c) 1993-1995, The Geometry Center*/#ifndef qhDEFset#define qhDEFset 1/* ================= -structures- ===============*/#ifndef DEFsetT#define DEFsetT 1typedef struct setT setT;   /* a set is a sorted or unsorted array of pointers */#endif/* -----------------------------------------------setT- a set or list of pointers with maximum size and actual size. The set/list is terminated with NULL The maxsize element (e[set->maxsize]) is:   NULL                if actual size equals maximum size   actual_size + 1     if actual size is less than maximum size styles of setT:   unique              a set of unique elements, usually ordered   unordered           a collection of elements with duplicates allowed   table               a collection of elements with 'NULL' allowed                       can not use FOREACH... because of internal NULLs*/typedef union setelemT setelemT;union setelemT {  void    *p;  int      i;         /* integer used for e[maxSize] */};struct setT {  unsigned int maxsize; /* maximum number of elements (except NULL) */  setelemT e[1];        /* array of pointers, tail is NULL */                        /* last slot (unless NULL) is actual size+1                            e[maxsize]==NULL or e[e[maxsize]-1]==NULL */};/* -----------------------------------------------constants and flags*/#define SETelemsize sizeof(setelemT) /* size of set element in bytes *//* =========== -macros- ========================= *//*------------------------------------------------FOREACHsetelement_(type, set, variable)- define FOREACH iterator    variable is NULL at end of loop    assumes *variable and **variablep are declared    variablep is one beyond variable.      to repeat an element,          variablep--; / *repeat* /    use FOREACHsetelement_i_() if need index or include NULLs    WARNING: strange behavior if don't use braces when nested-FOREACHsetelement_i_(type, set, variable)- define FOREACH iterator    assumes *variable, variable_n, and variable_i are declared    variable_i is index, variable_n is qh_setsize()    variable may be NULL inside looop    at end of loop, variable==NULL and variable_i==variable_n    variable_i--; variable_n-- repeats for deleted element-FOREACHsetelementreverse_    same as FOREACHsetelement but returns elements in reverse order    uses 'int variabletemp'-FOREACHsetelementreverse12_    same as FOREACHsetelement but returns e[1], e[0], e[2], e[3],-FOREACHelem_(set)- for each element in a set of elements-FOREACHset_(sets)- for each set in a set of sets-SETindex_(set,elem)- returns index for iterated elem in set*/#define FOREACHsetelement_(type, set, variable) \        if (set || (variable= NULL)) for(\          variable##p= (type **)&((set)->e[0].p); \	  (variable= *variable##p++);)#define FOREACHsetelement_i_(type, set, variable) \        if (set || (variable= NULL)) for (\          variable##_i= 0, variable= (type *)((set)->e[0].p), \                   variable##_n= qh_setsize(set);\          variable##_i < variable##_n;\          variable= (type *)((set)->e[++variable##_i].p) )#define FOREACHsetelementreverse_(type, set, variable) \        if (set || (variable= NULL)) for(\	   variable##temp= qh_setsize(set)-1, variable= qh_setlast(set);\	   variable; variable= \	   ((--variable##temp >= 0) ? SETelem_(set, variable##temp) : NULL))#define FOREACHsetelementreverse12_(type, set, variable) \        if (set || (variable= NULL)) for(\          variable##p= (type **)&((set)->e[1].p); \	  (variable= *variable##p); \          variable##p == ((type **)&((set)->e[0].p))?variable##p += 2: \	      (variable##p == ((type **)&((set)->e[1].p))?variable##p--:variable##p++))#define FOREACHelem_(set) FOREACHsetelement_(void, set, elem)#define FOREACHset_(sets) FOREACHsetelement_(setT, sets, set)#define SETindex_(set, elem) ((void **)elem##p - (void **)&(set)->e[1].p)#define SETref_(elem) (elem##p[-1])/*------------------------------------------------SETelem_(set, n)- return the n'th element of set      assumes that n is valid [0..size] and that set is defined      may need a type cast      -SETelemaddr_(set, n, type)-return address of the n'th element of a set      assumes that n is valid [0..size] and set is defined-SETfirst_(set)- return first element of set-SETsecond_(set)- return second element of set-SETaddr_(set, type)-   return address of set's elements*/#define SETelem_(set, n)           ((set)->e[n].p)#define SETelemaddr_(set, n, type) ((type **)(&((set)->e[n].p)))#define SETfirst_(set)             ((set)->e[0].p)#define SETsecond_(set)            ((set)->e[1].p)#define SETaddr_(set,type)	   ((type **)(&((set)->e[0].p)))/*------------------------------------------------SETreturnsize_(set, size) - return size of a set      set must be defined      use qh_setsize(set) unless speed is critical-SETempty_(set) - return true (1) if set is empty      set may be NULL*/#define SETreturnsize_(set, size) (((size)= ((set)->e[(set)->maxsize].i))?(--(size)):((size)= (set)->maxsize))#define SETempty_(set) 	          (!set || (SETfirst_(set) ? 0:1))/* ======= -functions ===========    see set.c for function definitions	Add functions-setaddsorted	    adds an element to a sorted set-setaddnth	    adds newelem as n'th element of sorted or unsorted set-setappend	    appends an element to a set-setappend_set      appends a set to a set-setappend2ndlast   makes newelem the next to the last element in set-setlarger	    returns a larger set that contains elements of *setp-setreplace	    replaces oldelem in set with newelem-setunique	    add an element if not already in set	Access and predicate functions	-setin		    returns 1 if setelem is in a set, 0 otherwise-setindex	    returns the index of elem in set.   If none, returns -1-setlast	    return last element of set or NULL-setequal	    returns 1 if two sorted sets are equal, otherwise returns 0-setequal_except    returns 1 if two sorted sets are equal except at element-setequal_skip	    returns 1 if two sorted sets are equal except for skips	Delete functions-setdel		    deletes oldelem from unsorted set.-setdelsorted	    deletes oldelem from sorted set-setdelnth	    delete and return nth element from unsorted set-setdelnthsorted    delete and return nth element from sorted set-setdellast	    delete and return last element from set or NULL-setnew_delnthsorted create a sorted set not containing nth element	Allocation and deallocation functions-setnew		    create a new set-setfree	    free the space occupied by a sorted or unsorted set-setfreelong	    frees a set only if it's in long memory-setfree2           free a set and its elements	Temporary set functions-settemp	    return a stacked, temporary set-settempfree	    free temporary set at top of qhmem.tempstack-settemppop	    pop qhmem.tempstack (makes temporary set permanent)-settemppush	    push temporary set unto qhmem.tempstack (makes it temporary)-settempfree_all    free all temporary sets in qhmem.tempstack	Other functions-setsize	    returns the size of a set-setcompact	    compact NULLs in an unsorted set-setcopy	    copies a sorted or unsorted set into another-setcheck	    check set for validity-setduplicate       duplicate a set of elements-setprint	    print set elements to fp-settruncate        truncate set to size elements-setzero            zero remainder of set and set to maximum size*//*---------- -prototypes in alphabetical order -----------*/void  qh_setaddsorted(setT **setp, void *elem);void  qh_setaddnth(setT **setp, int nth, void *newelem);void  qh_setappend(setT **setp, void *elem);void  qh_setappend_set(setT **setp, setT *setA);void  qh_setappend2ndlast(setT **setp, void *elem);void  qh_setcheck(setT *set, char *typename, int id);void  qh_setcompact(setT *set);setT *qh_setcopy(setT *set, int extra);void *qh_setdel(setT *set, void *elem);void *qh_setdellast(setT *set);void *qh_setdelnth(setT *set, int nth);void *qh_setdelnthsorted(setT *set, int nth);void *qh_setdelsorted(setT *set, void *newelem);setT *qh_setduplicate( setT *set, int elemsize);int   qh_setequal(setT *setA, setT *setB);int   qh_setequal_except (setT *setA, void *skipelemA, setT *setB, void *skipelemB);int   qh_setequal_skip (setT *setA, int skipA, setT *setB, int skipB);void  qh_setfree(setT **set);void  qh_setfree2( setT **setp, int elemsize);void  qh_setfreelong(setT **set);int   qh_setin(setT *set, void *setelem);int   qh_setindex(setT *set, void *setelem);void  qh_setlarger(setT **setp);void *qh_setlast(setT *set);setT *qh_setnew(int size);setT *qh_setnew_delnthsorted(setT *set, int size, int nth, int prepend);void  qh_setprint(FILE *fp, char* string, setT *set);void  qh_setreplace(setT *set, void *oldelem, void *newelem);int   qh_setsize(setT *set);setT *qh_settemp(int setsize);void  qh_settempfree(setT **set);void  qh_settempfree_all(void);setT *qh_settemppop(void);void  qh_settemppush(setT *set);void  qh_settruncate (setT *set, int size);int   qh_setunique (setT **set, void *elem);void  qh_setzero (setT *set, int index, int size);#endif /* qhDEFset */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -