ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/hd/sm_sets.c
(Generate patch)

Comparing ray/src/hd/sm_sets.c (file contents):
Revision 3.2 by gwlarson, Fri Sep 11 11:52:27 1998 UTC vs.
Revision 3.7 by greg, Wed Apr 23 00:52:34 2003 UTC

# Line 1 | Line 1
1 /* Copyright (c) 1998 Silicon Graphics, Inc. */
2
1   #ifndef lint
2 < static char SCCSid[] = "$SunId$ SGI";
2 > static const char       RCSid[] = "$Id$";
3   #endif
6
4   /*
5   * Quadtree-specific set operations.
6   */
# Line 15 | Line 12 | static char SCCSid[] = "$SunId$ SGI";
12  
13   #define QTSETIBLK       2048            /* set index allocation block size */
14   #define QTELEMBLK       8               /* set element allocation block */
15 + #define QTELEMMOD(ne)   ((ne)&7)        /* (ne) % QTELEMBLK */
16  
17 < #define QTNODESIZ(ne)   ((ne) + QTELEMBLK - ((ne) % QTELEMBLK))
17 > #define QTONTHRESH(ne)  (!QTELEMMOD((ne)+1))
18 > #define QTNODESIZ(ne)   ((ne) + QTELEMBLK - QTELEMMOD(ne))
19  
20 < OBJECT  **qtsettab= NULL;                       /* quadtree leaf node table */
20 > OBJECT  **qtsettab= NULL;               /* quadtree leaf node table */
21   QUADTREE  qtnumsets;                    /* number of used set indices */
22   static int  qtfreesets = EMPTY;         /* free set index list */
23  
# Line 27 | Line 26 | QUADTREE
26   qtnewleaf(oset)                 /* return new leaf node for object set */
27   OBJECT  *oset;
28   {
29 <        register QUADTREE  osi;
31 <        int     nalc;
29 >  register QUADTREE  osi;
30  
31 <        if (*oset <= 0)
32 <                return(EMPTY);          /* should be error? */
33 <        if (qtfreesets != EMPTY) {
34 <                osi = qtfreesets;
35 <                qtfreesets = (int)qtsettab[osi];
36 <        } else if ((osi = qtnumsets++) % QTSETIBLK == 0) {
37 <                qtsettab = (OBJECT **)realloc((char *)qtsettab,
38 <                                (unsigned)(osi+QTSETIBLK)*sizeof(OBJECT *));
39 <                if (qtsettab == NULL)
40 <                        goto memerr;
41 <        }
42 <        nalc = QTNODESIZ(*oset);
43 <        if ((qtsettab[osi] = (OBJECT *)malloc(nalc*sizeof(OBJECT))) == NULL)
44 <                goto memerr;
45 <        setcopy(qtsettab[osi], oset);
46 <        return(QT_INDEX(osi));
31 >  if (*oset <= 0)
32 >    return(EMPTY);              /* should be error? */
33 >  if (qtfreesets != EMPTY) {
34 >    osi = qtfreesets;
35 >    qtfreesets = (int)qtsettab[osi];
36 >  } else if ((osi = qtnumsets++) % QTSETIBLK == 0) {
37 >    qtsettab = (OBJECT **)realloc((void *)qtsettab,
38 >                                  (unsigned)(osi+QTSETIBLK)*sizeof(OBJECT *));
39 >    if (qtsettab == NULL)
40 >      goto memerr;
41 >  }
42 >  qtsettab[osi] = (OBJECT *)malloc(QTNODESIZ(*oset)*sizeof(OBJECT));
43 >  if (qtsettab[osi] == NULL)
44 >    goto memerr;
45 >  setcopy(qtsettab[osi], oset);
46 >  return(QT_INDEX(osi));
47   memerr:
48 <        error(SYSTEM, "out of memory in qtnewleaf");
48 >  error(SYSTEM, "out of memory in qtnewleaf");
49   }
50  
51  
52   QUADTREE
53 < qtdelelem(qt, id)               /* delete element from leaf node, no quest. */
53 > qtdelelem(qt, id)               /* delete element from leaf node */
54   QUADTREE  qt;
55   OBJECT  id;
56   {
57          register QUADTREE  lf;
60        int  oalc, nalc;
58  
59   #ifdef DEBUG
60          if(id < 0)
# Line 70 | Line 67 | OBJECT  id;
67          lf = QT_SET_INDEX(qt);
68   #endif
69          if (qtsettab[lf][0] <= 1) {             /* blow leaf away */
70 <                free((char *)qtsettab[lf]);
70 >                free((void *)qtsettab[lf]);
71                  qtsettab[lf] = (OBJECT *)qtfreesets;
72                  qtfreesets = lf;
73                  return(EMPTY);
74 <        }                                       /* else delete element */
78 <        oalc = QTNODESIZ(qtsettab[lf][0]);
79 <        nalc = QTNODESIZ(qtsettab[lf][0] - 1);
74 >        }
75          deletelem(qtsettab[lf], id);
76 <        if (nalc != oalc)
77 <                qtsettab[lf] = (OBJECT *)realloc((char *)qtsettab[lf],
78 <                                nalc*sizeof(OBJECT));
76 >        if (QTONTHRESH(qtsettab[lf][0]))
77 >                qtsettab[lf] = (OBJECT *)realloc((void *)qtsettab[lf],
78 >                                QTNODESIZ(qtsettab[lf][0])*sizeof(OBJECT));
79          return(qt);
80   }
81  
82  
83   QUADTREE
84 < qtaddelem(qt, id)               /* add element to leaf node, no quest. */
84 > qtaddelem(qt, id)               /* add element to leaf node */
85   QUADTREE  qt;
86   OBJECT  id;
87   {
88          OBJECT  newset[2];
89          register QUADTREE  lf;
95        int  oalc, nalc;
90  
91   #ifdef DEBUG
92          if(id < 0)
# Line 110 | Line 104 | OBJECT  id;
104   #else
105          lf = QT_SET_INDEX(qt);
106   #endif
107 <        oalc = QTNODESIZ(qtsettab[lf][0]);
108 <        nalc = QTNODESIZ(qtsettab[lf][0] + 1);
109 <        if (nalc != oalc) {
116 <                qtsettab[lf] = (OBJECT *)realloc((char *)qtsettab[lf],
117 <                                nalc*sizeof(OBJECT));
107 >        if (QTONTHRESH(qtsettab[lf][0])) {
108 >                qtsettab[lf] = (OBJECT *)realloc((void *)qtsettab[lf],
109 >                                QTNODESIZ(qtsettab[lf][0]+1)*sizeof(OBJECT));
110                  if (qtsettab[lf] == NULL)
111                          error(SYSTEM, "out of memory in qtaddelem");
112          }
# Line 147 | Line 139 | QUADTREE  qt;
139          osi = QT_SET_INDEX(qt);
140          if (osi >= qtnumsets)
141                  return;
142 <        free((char *)qtsettab[osi]);
142 >        free((void *)qtsettab[osi]);
143          qtsettab[osi] = (OBJECT *)qtfreesets;
144          qtfreesets = osi;
145   }
# Line 164 | Line 156 | qtfreeleaves()                 /* free ALL sets and leaf nodes */
156          }
157          for (i = qtnumsets; i--; )
158                  if (qtsettab[i] != NULL)
159 <                        free((char *)qtsettab[i]);
160 <        free((char *)qtsettab);
159 >                        free((void *)qtsettab[i]);
160 >        free((void *)qtsettab);
161          qtsettab = NULL;
162          qtnumsets = 0;
163   }
# Line 200 | Line 192 | register OBJECT  *cs;                   /* cs' = cs +
192      for (i = os[0]; i-- >= 0; )
193         *cs++ = *os++;
194   }
195 +
196 +
197 +
198 +
199 +
200 +
201 +
202 +
203  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines