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 */ |