Doxygen Source Code Documentation
qset.c File Reference
#include <stdio.h>#include <string.h>#include "qset.h"#include "mem.h"Go to the source code of this file.
Defines | |
| #define | SETsizeaddr_(set) (&((set)->e[(set)->maxsize].i)) |
Typedefs | |
| typedef ridgeT | ridgeT |
| typedef facetT | facetT |
Functions | |
| void | qh_errexit (int exitcode, facetT *, ridgeT *) |
| void | qh_setaddnth (setT **setp, int nth, void *newelem) |
| void | qh_setaddsorted (setT **setp, void *newelem) |
| void | qh_setappend (setT **setp, void *newelem) |
| void | qh_setappend_set (setT **setp, setT *setA) |
| void | qh_setappend2ndlast (setT **setp, void *newelem) |
| void | qh_setcheck (setT *set, char *tname, int id) |
| void | qh_setcompact (setT *set) |
| setT * | qh_setcopy (setT *set, int extra) |
| void * | qh_setdel (setT *set, void *oldelem) |
| 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 *oldelem) |
| 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 **setp) |
| void | qh_setfree2 (setT **setp, int elemsize) |
| void | qh_setfreelong (setT **setp) |
| int | qh_setin (setT *set, void *setelem) |
| int | qh_setindex (setT *set, void *atelem) |
| void | qh_setlarger (setT **oldsetp) |
| void * | qh_setlast (setT *set) |
| setT * | qh_setnew (int setsize) |
| 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) |
Define Documentation
|
|
Definition at line 38 of file qset.c. Referenced by qh_setaddnth(), qh_setappend(), qh_setappend2ndlast(), qh_setappend_set(), qh_setcopy(), qh_setdel(), qh_setdellast(), qh_setdelnth(), qh_setdelnthsorted(), qh_setdelsorted(), qh_setlarger(), qh_setlast(), and qh_setsize(). |
Typedef Documentation
|
|
|
|
|
|
Function Documentation
|
||||||||||||||||
|
||||||||||||||||
|
Definition at line 59 of file qset.c. References i, qh_errexit(), qh_setlarger(), qh_setprint(), qhmem_ERRqhull, SETelemaddr_, and SETsizeaddr_. Referenced by qh_appendmergeset(), qh_facet3vertex(), qh_initialvertices(), qh_mergecycle(), qh_mergesimplex(), qh_renameridgevertex(), and qh_setaddsorted().
00059 {
00060 int *sizep, oldsize, i;
00061 void **oldp, **newp;
00062
00063 if (!*setp || !*(sizep= SETsizeaddr_(*setp))) {
00064 qh_setlarger(setp);
00065 sizep= SETsizeaddr_(*setp);
00066 }
00067 oldsize= *sizep - 1;
00068 if (nth < 0 || nth > oldsize) {
00069 fprintf (qhmem.ferr, "qhull internal error (qh_setaddnth): nth %d is out-of-bounds for set:\n", nth);
00070 qh_setprint (qhmem.ferr, "", *setp);
00071 qh_errexit (qhmem_ERRqhull, NULL, NULL);
00072 }
00073 (*sizep)++;
00074 oldp= SETelemaddr_(*setp, oldsize, void); /* NULL */
00075 newp= oldp+1;
00076 for (i= oldsize-nth+1; i--; ) /* move at least NULL */
00077 *(newp--)= *(oldp--); /* may overwrite *sizep */
00078 *newp= newelem;
00079 } /* setaddnth */
|
|
||||||||||||
|
Definition at line 97 of file qset.c. References FOREACHelem_, and qh_setaddnth().
00097 {
00098 int newindex=0;
00099 void *elem, **elemp;
00100
00101 FOREACHelem_(*setp) { /* could use binary search instead */
00102 if (elem < newelem)
00103 newindex++;
00104 else if (elem == newelem)
00105 return;
00106 else
00107 break;
00108 }
00109 qh_setaddnth(setp, newindex, newelem);
00110 } /* setaddsorted */
|
|
||||||||||||
|
||||||||||||
|
Definition at line 199 of file qset.c. References qh_setlarger(), SETelemaddr_, and SETsizeaddr_. Referenced by qh_partitioncoplanar(), and qh_partitionpoint().
00199 {
00200 int *sizep;
00201 void **endp, **lastp;
00202
00203 if (!*setp || !*(sizep= SETsizeaddr_(*setp))) {
00204 qh_setlarger(setp);
00205 sizep= SETsizeaddr_(*setp);
00206 }
00207 endp= SETelemaddr_(*setp, (*sizep)++ -1, void); /* NULL */
00208 lastp= endp-1;
00209 *(endp++)= *lastp;
00210 *endp= NULL; /* may overwrite *sizep */
00211 *lastp= newelem;
00212 } /* setappend2ndlast */
|
|
||||||||||||
|
Definition at line 157 of file qset.c. References setT::e, setelemT::p, qh_setcopy(), qh_setfree(), qh_setnew(), SETelemsize, SETreturnsize_, and SETsizeaddr_. Referenced by qh_makenew_nonsimplicial().
00157 {
00158 int *sizep, sizeA, size;
00159 setT *oldset;
00160
00161 if (!setA)
00162 return;
00163 SETreturnsize_(setA, sizeA);
00164 if (!*setp)
00165 *setp= qh_setnew (sizeA);
00166 sizep= SETsizeaddr_(*setp);
00167 if (!(size= *sizep))
00168 size= (*setp)->maxsize;
00169 else
00170 size--;
00171 if (size + sizeA > (*setp)->maxsize) {
00172 oldset= *setp;
00173 *setp= qh_setcopy (oldset, sizeA);
00174 qh_setfree (&oldset);
00175 sizep= SETsizeaddr_(*setp);
00176 }
00177 *sizep= size+sizeA+1; /* memcpy may overwrite */
00178 if (sizeA > 0)
00179 memcpy((char *)&((*setp)->e[size].p), (char *)&(setA->e[0].p), SETelemsize *(sizeA+1));
00180 } /* setappend_set */
|
|
||||||||||||||||
|
Definition at line 225 of file qset.c. References setT::e, setT::maxsize, setelemT::p, qh_errexit(), qh_setprint(), qhmem_ERRqhull, and SETreturnsize_. Referenced by qh_checkfacet(), and qh_checkpolygon().
00225 {
00226 int maxsize, size;
00227 int waserr= 0;
00228
00229 if (!set)
00230 return;
00231 SETreturnsize_(set, size);
00232 maxsize= set->maxsize;
00233 if (size > maxsize || !maxsize) {
00234 fprintf (qhmem.ferr, "qhull internal error (qh_setcheck): actual size %d of %s%d is greater than max size %d\n",
00235 size, tname, id, maxsize);
00236 waserr= 1;
00237 }else if (set->e[size].p) {
00238 fprintf (qhmem.ferr, "qhull internal error (qh_setcheck): %s%d (size %d max %d) is not null terminated.\n",
00239 tname, id, maxsize, size-1);
00240 waserr= 1;
00241 }
00242 if (waserr) {
00243 qh_setprint (qhmem.ferr, "ERRONEOUS", set);
00244 qh_errexit (qhmem_ERRqhull, NULL, NULL);
00245 }
00246 } /* setcheck */
|
|
|
Definition at line 267 of file qset.c. References qh_settruncate(), SETaddr_, and SETreturnsize_. Referenced by qh_mergecycle_neighbors(), qh_mergecycle_ridges(), qh_mergecycle_vneighbors(), qh_nearcoplanar(), and qh_updatevertices().
00267 {
00268 int size;
00269 void **destp, **elemp, **endp, **firstp;
00270
00271 if (!set)
00272 return;
00273 SETreturnsize_(set, size);
00274 destp= elemp= firstp= SETaddr_(set, void);
00275 endp= destp + size;
00276 while (1) {
00277 if (!(*destp++ = *elemp++)) {
00278 destp--;
00279 if (elemp > endp)
00280 break;
00281 }
00282 }
00283 qh_settruncate (set, destp-firstp);
00284 } /* setcompact */
|
|
||||||||||||
|
Definition at line 301 of file qset.c. References setT::e, setelemT::p, qh_setnew(), SETelemsize, SETreturnsize_, and SETsizeaddr_. Referenced by qh_neighbor_intersections(), and qh_setappend_set().
00301 {
00302 setT *newset;
00303 int size;
00304
00305 if (extra < 0)
00306 extra= 0;
00307 SETreturnsize_(set, size);
00308 newset= qh_setnew(size+extra);
00309 *SETsizeaddr_(newset)= size+1; /* memcpy may overwrite */
00310 memcpy((char *)&(newset->e[0].p), (char *)&(set->e[0].p), SETelemsize *(size+1));
00311 return (newset);
00312 } /* setcopy */
|
|
||||||||||||
|
Definition at line 335 of file qset.c. References setT::maxsize, SETaddr_, SETelemaddr_, and SETsizeaddr_. Referenced by qh_attachnewfacets(), qh_delridge(), qh_furthestout(), qh_makenew_nonsimplicial(), qh_makeridges(), qh_maydropneighbor(), qh_merge_degenredundant(), qh_mergecycle_neighbors(), qh_mergecycle_ridges(), qh_mergeneighbors(), qh_mergesimplex(), qh_mergevertex_neighbors(), qh_order_vertexneighbors(), qh_remove_extravertices(), qh_rename_sharedvertex(), qh_renamevertex(), and qh_updatevertices().
00335 {
00336 void **elemp, **lastp;
00337 int *sizep;
00338
00339 if (!set)
00340 return NULL;
00341 elemp= SETaddr_(set, void);
00342 while (*elemp != oldelem && *elemp)
00343 elemp++;
00344 if (*elemp) {
00345 sizep= SETsizeaddr_(set);
00346 if (!(*sizep)--) /* if was a full set */
00347 *sizep= set->maxsize; /* *sizep= (maxsize-1)+ 1 */
00348 lastp= SETelemaddr_(set, *sizep-1, void);
00349 *elemp= *lastp; /* may overwrite itself */
00350 *lastp= NULL;
00351 return oldelem;
00352 }
00353 return NULL;
00354 } /* setdel */
|
|
|
Definition at line 374 of file qset.c. References setT::e, setT::maxsize, setelemT::p, and SETsizeaddr_. Referenced by qh_all_merges(), qh_findbest(), qh_initialvertices(), qh_merge_degenredundant(), qh_nextfurthest(), qh_order_vertexneighbors(), and qh_settemppop().
00374 {
00375 int setsize; /* actually, actual_size + 1 */
00376 int maxsize;
00377 int *sizep;
00378 void *returnvalue;
00379
00380 if (!set || !(set->e[0].p))
00381 return NULL;
00382 sizep= SETsizeaddr_(set);
00383 if ((setsize= *sizep)) {
00384 returnvalue= set->e[setsize - 2].p;
00385 set->e[setsize - 2].p= NULL;
00386 (*sizep)--;
00387 }else {
00388 maxsize= set->maxsize;
00389 returnvalue= set->e[maxsize - 1].p;
00390 set->e[maxsize - 1].p= NULL;
00391 *sizep= maxsize;
00392 }
00393 return returnvalue;
00394 } /* setdellast */
|
|
||||||||||||
|
Definition at line 414 of file qset.c. References setT::maxsize, qh_errexit(), qh_setprint(), qhmem_ERRqhull, SETelemaddr_, and SETsizeaddr_. Referenced by qh_attachnewfacets(), qh_detvnorm(), qh_find_newvertex(), and qh_nextfurthest().
00414 {
00415 void **elemp, **lastp, *elem;
00416 int *sizep;
00417
00418
00419 elemp= SETelemaddr_(set, nth, void);
00420 sizep= SETsizeaddr_(set);
00421 if (!(*sizep)--) /* if was a full set */
00422 *sizep= set->maxsize; /* *sizep= (maxsize-1)+ 1 */
00423 if (nth < 0 || nth >= *sizep) {
00424 fprintf (qhmem.ferr, "qhull internal error (qh_setaddnth): nth %d is out-of-bounds for set:\n", nth);
00425 qh_setprint (qhmem.ferr, "", set);
00426 qh_errexit (qhmem_ERRqhull, NULL, NULL);
00427 }
00428 lastp= SETelemaddr_(set, *sizep-1, void);
00429 elem= *elemp;
00430 *elemp= *lastp; /* may overwrite itself */
00431 *lastp= NULL;
00432 return elem;
00433 } /* setdelnth */
|
|
||||||||||||
|
Definition at line 455 of file qset.c. References setT::maxsize, qh_errexit(), qh_setprint(), qhmem_ERRqhull, SETelemaddr_, and SETsizeaddr_. Referenced by qh_renameridgevertex().
00455 {
00456 void **newp, **oldp, *elem;
00457 int *sizep;
00458
00459 sizep= SETsizeaddr_(set);
00460 if (nth < 0 || (*sizep && nth >= *sizep-1) || nth >= set->maxsize) {
00461 fprintf (qhmem.ferr, "qhull internal error (qh_setaddnth): nth %d is out-of-bounds for set:\n", nth);
00462 qh_setprint (qhmem.ferr, "", set);
00463 qh_errexit (qhmem_ERRqhull, NULL, NULL);
00464 }
00465 newp= SETelemaddr_(set, nth, void);
00466 elem= *newp;
00467 oldp= newp+1;
00468 while ((*(newp++)= *(oldp++)))
00469 ; /* copy remaining elements and NULL */
00470 if (!(*sizep)--) /* if was a full set */
00471 *sizep= set->maxsize; /* *sizep= (max size-1)+ 1 */
00472 return elem;
00473 } /* setdelnthsorted */
|
|
||||||||||||
|
Definition at line 493 of file qset.c. References setT::maxsize, SETaddr_, and SETsizeaddr_. Referenced by qh_mergecycle_vneighbors(), qh_mergevertex_del(), qh_neighbor_intersections(), qh_remove_extravertices(), and qh_renamevertex().
00493 {
00494 void **newp, **oldp;
00495 int *sizep;
00496
00497 if (!set)
00498 return NULL;
00499 newp= SETaddr_(set, void);
00500 while(*newp != oldelem && *newp)
00501 newp++;
00502 if (*newp) {
00503 oldp= newp+1;
00504 while ((*(newp++)= *(oldp++)))
00505 ; /* copy remaining elements */
00506 sizep= SETsizeaddr_(set);
00507 if (!(*sizep)--) /* if was a full set */
00508 *sizep= set->maxsize; /* *sizep= (max size-1)+ 1 */
00509 return oldelem;
00510 }
00511 return NULL;
00512 } /* setdelsorted */
|
|
||||||||||||
|
Definition at line 530 of file qset.c. References FOREACHelem_, qh_memalloc(), qh_setappend(), qh_setnew(), and qh_setsize().
00530 {
00531 void *elem, **elemp, *newElem;
00532 setT *newSet;
00533 int size;
00534
00535 if (!(size= qh_setsize (set)))
00536 return NULL;
00537 newSet= qh_setnew (size);
00538 FOREACHelem_(set) {
00539 newElem= qh_memalloc (elemsize);
00540 memcpy (newElem, elem, elemsize);
00541 qh_setappend (&newSet, newElem);
00542 }
00543 return newSet;
00544 } /* setduplicate */
|
|
||||||||||||
|
Definition at line 561 of file qset.c. References memcmp(), SETaddr_, SETelemsize, and SETreturnsize_. Referenced by qh_checkfacet().
00561 {
00562 void **elemAp, **elemBp;
00563 int sizeA, sizeB;
00564
00565 SETreturnsize_(setA, sizeA);
00566 SETreturnsize_(setB, sizeB);
00567 if (sizeA != sizeB)
00568 return 0;
00569 if (!sizeA)
00570 return 1;
00571 elemAp= SETaddr_(setA, void);
00572 elemBp= SETaddr_(setB, void);
00573 if (!memcmp((char *)elemAp, (char *)elemBp, sizeA*SETelemsize))
00574 return 1;
00575 return 0;
00576 } /* setequal */
|
|
||||||||||||||||||||
|
Definition at line 599 of file qset.c. References SETaddr_, and skip. Referenced by qh_hashridge_find().
00599 {
00600 void **elemA, **elemB;
00601 int skip=0;
00602
00603 elemA= SETaddr_(setA, void);
00604 elemB= SETaddr_(setB, void);
00605 while (1) {
00606 if (*elemA == skipelemA) {
00607 skip++;
00608 elemA++;
00609 }
00610 if (skipelemB) {
00611 if (*elemB == skipelemB) {
00612 skip++;
00613 elemB++;
00614 }
00615 }else if (*elemA != *elemB) {
00616 skip++;
00617 if (!(skipelemB= *elemB++))
00618 return 0;
00619 }
00620 if (!*elemA)
00621 break;
00622 if (*elemA++ != *elemB++)
00623 return 0;
00624 }
00625 if (skip != 2 || *elemB)
00626 return 0;
00627 return 1;
00628 } /* setequal_except */
|
|
||||||||||||||||||||
|
Definition at line 647 of file qset.c. References SETaddr_, and SETelemaddr_. Referenced by qh_attachnewfacets(), and qh_checkfacet().
00647 {
00648 void **elemA, **elemB, **skipAp, **skipBp;
00649
00650 elemA= SETaddr_(setA, void);
00651 elemB= SETaddr_(setB, void);
00652 skipAp= SETelemaddr_(setA, skipA, void);
00653 skipBp= SETelemaddr_(setB, skipB, void);
00654 while (1) {
00655 if (elemA == skipAp)
00656 elemA++;
00657 if (elemB == skipBp)
00658 elemB++;
00659 if (!*elemA)
00660 break;
00661 if (*elemA++ != *elemB++)
00662 return 0;
00663 }
00664 if (*elemB)
00665 return 0;
00666 return 1;
00667 } /* setequal_skip */
|
|
|
Definition at line 686 of file qset.c. References qh_memfree(), qh_memfree_, and SETelemsize. Referenced by qh_attachnewfacets(), qh_delfacet(), qh_delridge(), qh_delvertex(), qh_find_newvertex(), qh_freebuffers(), qh_freebuild(), qh_makenew_nonsimplicial(), qh_matchnewfacets(), qh_mergecycle_ridges(), qh_mergesimplex(), qh_mergevertices(), qh_nearcoplanar(), qh_nextfurthest(), qh_order_vertexneighbors(), qh_outcoplanar(), qh_partitionall(), qh_printfacet3geom_simplicial(), qh_printfacet4geom_simplicial(), qh_setappend_set(), qh_setfree2(), qh_setlarger(), qh_settempfree(), and qh_settempfree_all().
00686 {
00687 int size;
00688 void **freelistp; /* used !qh_NOmem */
00689
00690 if (*setp) {
00691 size= sizeof(setT) + ((*setp)->maxsize)*SETelemsize;
00692 if (size <= qhmem.LASTsize) {
00693 qh_memfree_(*setp, size, freelistp);
00694 }else
00695 qh_memfree (*setp, size);
00696 *setp= NULL;
00697 }
00698 } /* setfree */
|
|
||||||||||||
|
Definition at line 714 of file qset.c. References FOREACHelem_, qh_memfree(), and qh_setfree().
00714 {
00715 void *elem, **elemp;
00716
00717 FOREACHelem_(*setp)
00718 qh_memfree (elem, elemsize);
00719 qh_setfree (setp);
00720 } /* setfree2 */
|
|
|
Definition at line 740 of file qset.c. References qh_memfree(), and SETelemsize. Referenced by qh_freebuild().
00740 {
00741 int size;
00742
00743 if (*setp) {
00744 size= sizeof(setT) + ((*setp)->maxsize)*SETelemsize;
00745 if (size > qhmem.LASTsize) {
00746 qh_memfree (*setp, size);
00747 *setp= NULL;
00748 }
00749 }
00750 } /* setfreelong */
|
|
||||||||||||
|
Definition at line 765 of file qset.c. References FOREACHelem_. Referenced by qh_checkfacet(), qh_checkvertex(), qh_detvnorm(), qh_detvridge3(), qh_forcedmerges(), qh_initialvertices(), qh_mark_dupridges(), qh_maxsimplex(), qh_order_vertexneighbors(), qh_setunique(), and qh_vertexridges_facet().
00765 {
00766 void *elem, **elemp;
00767
00768 FOREACHelem_(set) {
00769 if (elem == setelem)
00770 return 1;
00771 }
00772 return 0;
00773 } /* setin */
|
|
||||||||||||
|
Definition at line 790 of file qset.c. References i, setT::maxsize, SETaddr_, and SETreturnsize_. Referenced by qh_checkfacet(), qh_matchneighbor(), qh_pointid(), and qh_renameridgevertex().
|
|
|
Definition at line 822 of file qset.c. References FOREACHset_, qh_setfree(), qh_setnew(), SETaddr_, SETelemsize, SETreturnsize_, and SETsizeaddr_. Referenced by qh_setaddnth(), qh_setappend(), and qh_setappend2ndlast().
00822 {
00823 int size= 1, *sizep;
00824 setT *newset, *set, **setp, *oldset;
00825 void **oldp, **newp;
00826
00827 if (*oldsetp) {
00828 oldset= *oldsetp;
00829 SETreturnsize_(oldset, size);
00830 qhmem.cntlarger++;
00831 qhmem.totlarger += size+1;
00832 newset= qh_setnew(2 * size);
00833 oldp= SETaddr_(oldset, void);
00834 newp= SETaddr_(newset, void);
00835 memcpy((char *)newp, (char *)oldp, (size+1) * SETelemsize);
00836 sizep= SETsizeaddr_(newset);
00837 *sizep= size+1;
00838 FOREACHset_((setT *)qhmem.tempstack) {
00839 if (set == oldset)
00840 *(setp-1)= newset;
00841 }
00842 qh_setfree(oldsetp);
00843 }else
00844 newset= qh_setnew(3);
00845 *oldsetp= newset;
00846 } /* setlarger */
|
|
|
Definition at line 861 of file qset.c. References setT::maxsize, SETelem_, and SETsizeaddr_. Referenced by qh_appendmergeset(), qh_furthestnext(), qh_nextfurthest(), qh_partitioncoplanar(), qh_partitionpoint(), and qh_printfacetheader().
00861 {
00862 int size;
00863
00864 if (set) {
00865 size= *SETsizeaddr_(set);
00866 if (!size)
00867 return SETelem_(set, set->maxsize - 1);
00868 else if (size > 1)
00869 return SETelem_(set, size - 2);
00870 }
00871 return NULL;
00872 } /* setlast */
|
|
|
Definition at line 890 of file qset.c. References setT::e, setelemT::i, setT::maxsize, setelemT::p, qh_memalloc(), qh_memalloc_, and SETelemsize. Referenced by qh_initqhull_buffers(), qh_makenew_nonsimplicial(), qh_newfacet(), qh_newhashtable(), qh_partitionall(), qh_setappend_set(), qh_setcopy(), qh_setduplicate(), qh_setlarger(), qh_setnew_delnthsorted(), qh_settemp(), qh_vertexintersect_new(), and qh_vertexneighbors().
00890 {
00891 setT *set;
00892 int sizereceived; /* used !qh_NOmem */
00893 int size;
00894 void **freelistp; /* used !qh_NOmem */
00895
00896 if (!setsize)
00897 setsize++;
00898 size= sizeof(setT) + setsize * SETelemsize;
00899 if ((unsigned) size <= (unsigned) qhmem.LASTsize) {
00900 qh_memalloc_(size, freelistp, set, setT);
00901 #ifndef qh_NOmem
00902 sizereceived= qhmem.sizetable[ qhmem.indextable[size]];
00903 if (sizereceived > size)
00904 setsize += (sizereceived - size)/SETelemsize;
00905 #endif
00906 }else
00907 set= (setT*)qh_memalloc (size);
00908 set->maxsize= setsize;
00909 set->e[setsize].i= 1;
00910 set->e[0].p= NULL;
00911 return (set);
00912 } /* setnew */
|
|
||||||||||||||||||||
|
Definition at line 933 of file qset.c. References setT::e, setT::maxsize, qh_errexit(), qh_setnew(), qh_setprint(), qhmem_ERRqhull, SETaddr_, and SETelemsize. Referenced by qh_createsimplex(), qh_facetintersect(), qh_makeridges(), qh_mergecycle_ridges(), qh_printfacet3geom_simplicial(), and qh_printfacet4geom_simplicial().
00933 {
00934 setT *newset;
00935 void **oldp, **newp;
00936 int tailsize= size - nth -1, newsize;
00937
00938 if (tailsize < 0) {
00939 fprintf (qhmem.ferr, "qhull internal error (qh_setaddnth): nth %d is out-of-bounds for set:\n", nth);
00940 qh_setprint (qhmem.ferr, "", set);
00941 qh_errexit (qhmem_ERRqhull, NULL, NULL);
00942 }
00943 newsize= size-1 + prepend;
00944 newset= qh_setnew(newsize);
00945 newset->e[newset->maxsize].i= newsize+1; /* may be overwritten */
00946 oldp= SETaddr_(set, void);
00947 newp= SETaddr_(newset, void) + prepend;
00948 switch (nth) {
00949 case 0:
00950 break;
00951 case 1:
00952 *(newp++)= *oldp++;
00953 break;
00954 case 2:
00955 *(newp++)= *oldp++;
00956 *(newp++)= *oldp++;
00957 break;
00958 case 3:
00959 *(newp++)= *oldp++;
00960 *(newp++)= *oldp++;
00961 *(newp++)= *oldp++;
00962 break;
00963 case 4:
00964 *(newp++)= *oldp++;
00965 *(newp++)= *oldp++;
00966 *(newp++)= *oldp++;
00967 *(newp++)= *oldp++;
00968 break;
00969 default:
00970 memcpy((char *)newp, (char *)oldp, nth * SETelemsize);
00971 newp += nth;
00972 oldp += nth;
00973 break;
00974 }
00975 oldp++;
00976 switch (tailsize) {
00977 case 0:
00978 break;
00979 case 1:
00980 *(newp++)= *oldp++;
00981 break;
00982 case 2:
00983 *(newp++)= *oldp++;
00984 *(newp++)= *oldp++;
00985 break;
00986 case 3:
00987 *(newp++)= *oldp++;
00988 *(newp++)= *oldp++;
00989 *(newp++)= *oldp++;
00990 break;
00991 case 4:
00992 *(newp++)= *oldp++;
00993 *(newp++)= *oldp++;
00994 *(newp++)= *oldp++;
00995 *(newp++)= *oldp++;
00996 break;
00997 default:
00998 memcpy((char *)newp, (char *)oldp, tailsize * SETelemsize);
00999 newp += tailsize;
01000 }
01001 *newp= NULL;
01002 return(newset);
01003 } /* setnew_delnthsorted */
|
|
||||||||||||||||
|
Definition at line 1015 of file qset.c. References setT::e, setT::maxsize, setelemT::p, and SETreturnsize_. Referenced by qh_checkfacet(), qh_setaddnth(), qh_setcheck(), qh_setdelnth(), qh_setdelnthsorted(), qh_setnew_delnthsorted(), qh_setreplace(), qh_setsize(), qh_settruncate(), and qh_setzero().
01015 {
01016 int size, k;
01017
01018 if (!set)
01019 fprintf (fp, "%s set is null\n", string);
01020 else {
01021 SETreturnsize_(set, size);
01022 fprintf (fp, "%s set=%p maxsize=%d size=%d elems=",
01023 string, set, set->maxsize, size);
01024 if (size > set->maxsize)
01025 size= set->maxsize+1;
01026 for (k=0; k < size; k++)
01027 fprintf(fp, " %p", set->e[k].p);
01028 fprintf(fp, "\n");
01029 }
01030 } /* setprint */
|
|
||||||||||||||||
|
Definition at line 1046 of file qset.c. References qh_errexit(), qh_setprint(), qhmem_ERRqhull, and SETaddr_. Referenced by qh_attachnewfacets(), qh_makenew_nonsimplicial(), qh_mergecycle_neighbors(), qh_mergefacet2d(), qh_mergeneighbors(), qh_mergesimplex(), and qh_mergevertex_neighbors().
01046 {
01047 void **elemp;
01048
01049 elemp= SETaddr_(set, void);
01050 while(*elemp != oldelem && *elemp)
01051 elemp++;
01052 if (*elemp)
01053 *elemp= newelem;
01054 else {
01055 fprintf (qhmem.ferr, "qhull internal error (qh_setreplace): elem %p not found in set\n",
01056 oldelem);
01057 qh_setprint (qhmem.ferr, "", set);
01058 qh_errexit (qhmem_ERRqhull, NULL, NULL);
01059 }
01060 } /* setreplace */
|
|
|
|
|
|
Definition at line 1165 of file qset.c. References FOREACHset_, and qh_setfree(). Referenced by qh_freebuild().
01165 {
01166 setT *set, **setp;
01167
01168 FOREACHset_((setT *)qhmem.tempstack)
01169 qh_setfree(&set);
01170 qh_setfree((setT **)&qhmem.tempstack);
01171 } /* settempfree_all */
|
|
|
Definition at line 1185 of file qset.c. References qh_errexit(), qh_setdellast(), qh_setsize(), and qhmem_ERRqhull. Referenced by qh_flippedmerges(), qh_forcedmerges(), qh_mergevertices(), qh_order_vertexneighbors(), and qh_settempfree().
01185 {
01186 setT *stackedset;
01187
01188 stackedset= (setT*)qh_setdellast((setT *)qhmem.tempstack);
01189 if (!stackedset) {
01190 fprintf (qhmem.ferr, "qhull internal error (qh_settemppop): pop from empty temporary stack\n");
01191 qh_errexit (qhmem_ERRqhull, NULL, NULL);
01192 }
01193 if (qhmem.IStracing >= 5)
01194 fprintf (qhmem.ferr, "qh_settemppop: depth %d temp set %p of %d elements\n",
01195 qh_setsize((setT*)qhmem.tempstack)+1, stackedset, qh_setsize(stackedset));
01196 return stackedset;
01197 } /* settemppop */
|
|
|
Definition at line 1211 of file qset.c. References qh_setappend(), and qh_setsize(). Referenced by qh_checkfacet(), qh_flippedmerges(), qh_forcedmerges(), qh_neighbor_intersections(), qh_rename_sharedvertex(), qh_settempfree(), and qh_vertexintersect().
01211 {
01212
01213 qh_setappend ((setT**)&qhmem.tempstack, set);
01214 if (qhmem.IStracing >= 5)
01215 fprintf (qhmem.ferr, "qh_settemppush: depth %d temp set %p of %d elements\n",
01216 qh_setsize((setT*)qhmem.tempstack), set, qh_setsize(set));
01217 } /* settemppush */
|
|
||||||||||||
|
Definition at line 1233 of file qset.c. References setT::e, setT::maxsize, setelemT::p, qh_errexit(), qh_setprint(), and qhmem_ERRqhull. Referenced by qh_createsimplex(), qh_deletevisible(), qh_findbest(), qh_freebuild(), qh_mergecycle_ridges(), qh_partitionall(), and qh_setcompact().
01233 {
01234
01235 if (size < 0 || size > set->maxsize) {
01236 fprintf (qhmem.ferr, "qhull internal error (qh_settruncate): size %d out of bounds for set:\n", size);
01237 qh_setprint (qhmem.ferr, "", set);
01238 qh_errexit (qhmem_ERRqhull, NULL, NULL);
01239 }
01240 set->e[set->maxsize].i= size+1; /* maybe overwritten */
01241 set->e[size].p= NULL;
01242 } /* settruncate */
|
|
||||||||||||
|
Definition at line 1257 of file qset.c. References qh_setappend(), and qh_setin(). Referenced by qh_maxsimplex().
01257 {
01258
01259 if (!qh_setin (*set, elem)) {
01260 qh_setappend (set, elem);
01261 return 1;
01262 }
01263 return 0;
01264 } /* setunique */
|
|
||||||||||||||||
|
Definition at line 1285 of file qset.c. References setT::e, setT::maxsize, qh_errexit(), qh_setprint(), qhmem_ERRqhull, SETelemaddr_, and SETelemsize. Referenced by qh_newhashtable(), qh_pointfacet(), qh_pointvertex(), qh_printextremes(), qh_printpoints_out(), and qh_printvneighbors().
01285 {
01286 int count;
01287
01288 if (index < 0 || index >= size || size > set->maxsize) {
01289 fprintf (qhmem.ferr, "qhull internal error (qh_setzero): index %d or size %d out of bounds for set:\n", index, size);
01290 qh_setprint (qhmem.ferr, "", set);
01291 qh_errexit (qhmem_ERRqhull, NULL, NULL);
01292 }
01293 set->e[set->maxsize].i= size+1; /* may be overwritten */
01294 count= size - index + 1; /* +1 for NULL terminator */
01295 memset ((char *)SETelemaddr_(set, index, void), 0, count * SETelemsize);
01296 } /* setzero */
|