--- ray/src/common/objset.c 1997/03/07 15:45:28 2.4 +++ ray/src/common/objset.c 2003/06/07 12:50:20 2.12 @@ -1,15 +1,14 @@ -/* Copyright (c) 1986 Regents of the University of California */ - #ifndef lint -static char SCCSid[] = "$SunId$ LBL"; +static const char RCSid[] = "$Id: objset.c,v 2.12 2003/06/07 12:50:20 schorsch Exp $"; #endif - /* * objset.c - routines for maintaining object sets. * - * 7/28/85 + * External symbols declared in object.h */ +#include "copyright.h" + #include "standard.h" #include "octree.h" @@ -17,16 +16,17 @@ static char SCCSid[] = "$SunId$ LBL"; #include "object.h" #ifndef OSTSIZ -#ifdef BIGMEM -#define OSTSIZ 56437 /* object table size (a prime!) */ +#ifdef SMLMEM +#define OSTSIZ 32749 /* object table size (a prime!) */ #else -#define OSTSIZ 12329 /* object table size (a prime!) */ +#define OSTSIZ 262139 /* object table size (a prime!) */ #endif #endif static OBJECT *ostable[OSTSIZ]; /* the object set table */ +void insertelem(os, obj) /* insert obj into os, no questions */ register OBJECT *os; OBJECT obj; @@ -42,6 +42,7 @@ OBJECT obj; } +void deletelem(os, obj) /* delete obj from os, no questions */ register OBJECT *os; OBJECT obj; @@ -61,6 +62,7 @@ OBJECT obj; } +int inset(os, obj) /* determine if object is in set */ register OBJECT *os; OBJECT obj; @@ -68,8 +70,15 @@ OBJECT obj; int upper, lower; register int cm, i; + if ((i = os[0]) <= 6) { /* linear search algorithm */ + cm = obj; + while (i-- > 0) + if (*++os == cm) + return(1); + return(0); + } lower = 1; - upper = cm = os[0] + 1; + upper = cm = i + 1; /* binary search algorithm */ while ((i = (lower + upper) >> 1) != cm) { cm = obj - os[i]; @@ -85,6 +94,7 @@ OBJECT obj; } +int setequal(os1, os2) /* determine if two sets are equal */ register OBJECT *os1, *os2; { @@ -97,6 +107,7 @@ register OBJECT *os1, *os2; } +void setcopy(os1, os2) /* copy object set os2 into os1 */ register OBJECT *os1, *os2; { @@ -123,6 +134,7 @@ register OBJECT *os; } +void setunion(osr, os1, os2) /* osr = os1 Union os2 */ register OBJECT *osr, *os1, *os2; { @@ -142,6 +154,7 @@ register OBJECT *osr, *os1, *os2; } +void setintersect(osr, os1, os2) /* osr = os1 Intersect os2 */ register OBJECT *osr, *os1, *os2; { @@ -204,7 +217,7 @@ tryagain: /* remember position */ i = os - ostable[osentry]; os = ostable[osentry] = (OBJECT *)realloc( - (char *)ostable[osentry], + (void *)ostable[osentry], (unsigned)(i+oset[0]+2)*sizeof(OBJECT)); if (os == NULL) goto memerr; @@ -216,9 +229,11 @@ tryagain: return(ot); memerr: error(SYSTEM, "out of memory in fullnode"); + return NULL; /* pro forma return */ } +void objset(oset, ot) /* get object set for full node */ register OBJECT *oset; OCTREE ot; @@ -228,10 +243,10 @@ OCTREE ot; if (!isfull(ot)) goto noderr; - i = oseti(ot); - if ((os = ostable[i%OSTSIZ]) == NULL) + ot = oseti(ot); + if ((os = ostable[ot%OSTSIZ]) == NULL) goto noderr; - for (i /= OSTSIZ; i--; os += *os + 1) + for (i = ot/OSTSIZ; i--; os += *os + 1) if (*os <= 0) goto noderr; for (i = *os; i-- >= 0; ) /* copy set here */ @@ -262,13 +277,14 @@ int (*f)(); } +void donesets() /* free ALL SETS in our table */ { register int n; for (n = 0; n < OSTSIZ; n++) if (ostable[n] != NULL) { - free((char *)ostable[n]); + free((void *)ostable[n]); ostable[n] = NULL; } }