15 |
|
|
16 |
|
#define QTSETIBLK 2048 /* set index allocation block size */ |
17 |
|
#define QTELEMBLK 8 /* set element allocation block */ |
18 |
+ |
#define QTELEMMOD(ne) ((ne)&7) /* (ne) % QTELEMBLK */ |
19 |
|
|
20 |
< |
#define QTNODESIZ(ne) ((ne) + QTELEMBLK - ((ne) % QTELEMBLK)) |
20 |
> |
#define QTONTHRESH(ne) (!QTELEMMOD((ne)+1)) |
21 |
> |
#define QTNODESIZ(ne) ((ne) + QTELEMBLK - QTELEMMOD(ne)) |
22 |
|
|
23 |
< |
OBJECT **qtsettab= NULL; /* quadtree leaf node table */ |
23 |
> |
OBJECT **qtsettab= NULL; /* quadtree leaf node table */ |
24 |
|
QUADTREE qtnumsets; /* number of used set indices */ |
25 |
|
static int qtfreesets = EMPTY; /* free set index list */ |
26 |
|
|
30 |
|
OBJECT *oset; |
31 |
|
{ |
32 |
|
register QUADTREE osi; |
31 |
– |
int nalc; |
33 |
|
|
34 |
|
if (*oset <= 0) |
35 |
|
return(EMPTY); /* should be error? */ |
42 |
|
if (qtsettab == NULL) |
43 |
|
goto memerr; |
44 |
|
} |
45 |
< |
nalc = QTNODESIZ(*oset); |
46 |
< |
if ((qtsettab[osi] = (OBJECT *)malloc(nalc*sizeof(OBJECT))) == NULL) |
45 |
> |
qtsettab[osi] = (OBJECT *)malloc(QTNODESIZ(*oset)*sizeof(OBJECT)); |
46 |
> |
if (qtsettab[osi] == NULL) |
47 |
|
goto memerr; |
48 |
|
setcopy(qtsettab[osi], oset); |
49 |
|
return(QT_INDEX(osi)); |
53 |
|
|
54 |
|
|
55 |
|
QUADTREE |
56 |
< |
qtdelelem(qt, id) /* delete element from leaf node, no quest. */ |
56 |
> |
qtdelelem(qt, id) /* delete element from leaf node */ |
57 |
|
QUADTREE qt; |
58 |
|
OBJECT id; |
59 |
|
{ |
60 |
|
register QUADTREE lf; |
60 |
– |
int oalc, nalc; |
61 |
|
|
62 |
|
#ifdef DEBUG |
63 |
|
if(id < 0) |
74 |
|
qtsettab[lf] = (OBJECT *)qtfreesets; |
75 |
|
qtfreesets = lf; |
76 |
|
return(EMPTY); |
77 |
< |
} /* else delete element */ |
78 |
< |
oalc = QTNODESIZ(qtsettab[lf][0]); |
79 |
< |
nalc = QTNODESIZ(qtsettab[lf][0] - 1); |
77 |
> |
} |
78 |
|
deletelem(qtsettab[lf], id); |
79 |
< |
if (nalc != oalc) |
79 |
> |
if (QTONTHRESH(qtsettab[lf][0])) |
80 |
|
qtsettab[lf] = (OBJECT *)realloc((char *)qtsettab[lf], |
81 |
< |
nalc*sizeof(OBJECT)); |
81 |
> |
QTNODESIZ(qtsettab[lf][0])*sizeof(OBJECT)); |
82 |
|
return(qt); |
83 |
|
} |
84 |
|
|
85 |
|
|
86 |
|
QUADTREE |
87 |
< |
qtaddelem(qt, id) /* add element to leaf node, no quest. */ |
87 |
> |
qtaddelem(qt, id) /* add element to leaf node */ |
88 |
|
QUADTREE qt; |
89 |
|
OBJECT id; |
90 |
|
{ |
91 |
|
OBJECT newset[2]; |
92 |
|
register QUADTREE lf; |
95 |
– |
int oalc, nalc; |
93 |
|
|
94 |
|
#ifdef DEBUG |
95 |
|
if(id < 0) |
107 |
|
#else |
108 |
|
lf = QT_SET_INDEX(qt); |
109 |
|
#endif |
110 |
< |
oalc = QTNODESIZ(qtsettab[lf][0]); |
114 |
< |
nalc = QTNODESIZ(qtsettab[lf][0] + 1); |
115 |
< |
if (nalc != oalc) { |
110 |
> |
if (QTONTHRESH(qtsettab[lf][0])) { |
111 |
|
qtsettab[lf] = (OBJECT *)realloc((char *)qtsettab[lf], |
112 |
< |
nalc*sizeof(OBJECT)); |
112 |
> |
QTNODESIZ(qtsettab[lf][0]+1)*sizeof(OBJECT)); |
113 |
|
if (qtsettab[lf] == NULL) |
114 |
|
error(SYSTEM, "out of memory in qtaddelem"); |
115 |
|
} |