OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
bucket.c File Reference
#include <space.h>

Go to the source code of this file.

Functions

bucket_tnewBucket (PORD_INT maxbin, PORD_INT maxitem, PORD_INT offset)
void freeBucket (bucket_t *bucket)
bucket_tsetupBucket (PORD_INT maxbin, PORD_INT maxitem, PORD_INT offset)
PORD_INT minBucket (bucket_t *bucket)
void insertBucket (bucket_t *bucket, PORD_INT k, PORD_INT item)
void removeBucket (bucket_t *bucket, PORD_INT item)

Function Documentation

◆ freeBucket()

void freeBucket ( bucket_t * bucket)

Definition at line 78 of file bucket.c.

79{
80 free(bucket->bin);
81 free(bucket->next);
82 free(bucket->last);
83 free(bucket->key);
84 free(bucket);
85}
PORD_INT * last
Definition types.h:120
PORD_INT * next
Definition types.h:119
PORD_INT * bin
Definition types.h:118
PORD_INT * key
Definition types.h:121

◆ insertBucket()

void insertBucket ( bucket_t * bucket,
PORD_INT k,
PORD_INT item )

Definition at line 163 of file bucket.c.

164{ PORD_INT s, nextitem;
165
166 /* ------------------------------------
167 check whether there are any problems
168 ------------------------------------ */
169 if (abs(k) >= MAX_INT - bucket->offset - 1)
170 { fprintf(stderr, "\nError in function insertBucket\n"
171 " key %d too large/small for bucket\n", k);
172 quit();
173 }
174 if (item > bucket->maxitem)
175 { fprintf(stderr, "\nError in function insertBucket\n"
176 " item %d too large for bucket (maxitem is %d)\n", item,
177 bucket->maxitem);
178 quit();
179 }
180 if (bucket->key[item] != MAX_INT)
181 { fprintf(stderr, "\nError in function insertBucket\n"
182 " item %d already in bucket\n", item);
183 quit();
184 }
185
186 /* -------------------------------------
187 determine the bin that holds the item
188 ------------------------------------- */
189 s = max(0, (k + bucket->offset));
190 s = min(s, bucket->maxbin);
191
192 /* --------------------------------------------------------------
193 adjust minbin, increase nobj, and mark item as being in bucket
194 -------------------------------------------------------------- */
195 bucket->minbin = min(bucket->minbin, s);
196 bucket->nobj++;
197 bucket->key[item] = k;
198
199 /* -----------------------------
200 finally, insert item in bin s
201 ----------------------------- */
202 nextitem = bucket->bin[s];
203 if (nextitem != -1)
204 bucket->last[nextitem] = item;
205 bucket->next[item] = nextitem;
206 bucket->last[item] = -1;
207 bucket->bin[s] = item;
208}
#define MAX_INT
Definition const.h:56
#define quit()
Definition macros.h:64
#define min(a, b)
Definition macros.h:20
#define max(a, b)
Definition macros.h:21
PORD_INT offset
Definition types.h:115
PORD_INT maxitem
Definition types.h:114
PORD_INT nobj
Definition types.h:116
PORD_INT minbin
Definition types.h:117
PORD_INT maxbin
Definition types.h:114
#define PORD_INT
Definition types.h:20

◆ minBucket()

PORD_INT minBucket ( bucket_t * bucket)

Definition at line 117 of file bucket.c.

118{ PORD_INT *bin, *next, *key, maxbin, minbin, nobj;
119 PORD_INT item, bestitem, bestkey;
120
121 maxbin = bucket->maxbin;
122 nobj = bucket->nobj;
123 minbin = bucket->minbin;
124 bin = bucket->bin;
125 next = bucket->next;
126 key = bucket->key;
127
128 if (nobj > 0)
129 { /* ---------------------------------------------
130 get the first item from leftmost nonempty bin
131 --------------------------------------------- */
132 while (bin[minbin] == -1) minbin++;
133 bucket->minbin = minbin;
134 bestitem = bin[minbin];
135 bestkey = minbin;
136
137 /* --------------------------------------------------
138 items in bins 0 and maxbin can have different keys
139 => search for item with smallest key
140 -------------------------------------------------- */
141 if ((minbin == 0) || (minbin == maxbin))
142 { item = next[bestitem];
143 while (item != -1)
144 { if (key[item] < bestkey)
145 { bestitem = item;
146 bestkey = key[item];
147 }
148 item = next[item];
149 }
150 }
151 /* ---------------------------------
152 return the item with smallest key
153 --------------------------------- */
154 return(bestitem);
155 }
156 else return(-1);
157}

◆ newBucket()

bucket_t * newBucket ( PORD_INT maxbin,
PORD_INT maxitem,
PORD_INT offset )

Definition at line 56 of file bucket.c.

57{ bucket_t *bucket;
58
59 mymalloc(bucket, 1, bucket_t);
60 mymalloc(bucket->bin, (maxbin+1), PORD_INT);
61 mymalloc(bucket->next, (maxitem+1), PORD_INT);
62 mymalloc(bucket->last, (maxitem+1), PORD_INT);
63 mymalloc(bucket->key, (maxitem+1), PORD_INT);
64
65 bucket->maxbin = maxbin;
66 bucket->maxitem = maxitem;
67 bucket->offset = offset;
68 bucket->nobj = 0;
69 bucket->minbin = MAX_INT;
70
71 return(bucket);
72}
#define mymalloc(ptr, nr, type)
Definition macros.h:23
integer, dimension(:), allocatable offset
Definition rad2r.F:53
struct _bucket bucket_t

◆ removeBucket()

void removeBucket ( bucket_t * bucket,
PORD_INT item )

Definition at line 214 of file bucket.c.

215{ PORD_INT s, nextitem, lastitem;
216
217 /* ----------------------------
218 check whether item in bucket
219 ---------------------------- */
220 if (bucket->key[item] == MAX_INT)
221 { fprintf(stderr, "\nError in function removeBucket\n"
222 " item %d is not in bucket\n", item);
223 quit();
224 }
225
226 /* -----------------------
227 remove item from bucket
228 ----------------------- */
229 nextitem = bucket->next[item];
230 lastitem = bucket->last[item];
231 if (nextitem != -1)
232 bucket->last[nextitem] = lastitem;
233 if (lastitem != -1)
234 bucket->next[lastitem] = nextitem;
235 else
236 { s = max(0, (bucket->key[item] + bucket->offset));
237 s = min(s, bucket->maxbin);
238 bucket->bin[s] = nextitem;
239 }
240
241 /* --------------------------------------------
242 decrease nobj and mark item as being removed
243 -------------------------------------------- */
244 bucket->nobj--;
245 bucket->key[item] = MAX_INT;
246}

◆ setupBucket()

bucket_t * setupBucket ( PORD_INT maxbin,
PORD_INT maxitem,
PORD_INT offset )

Definition at line 91 of file bucket.c.

92{ bucket_t *bucket;
93 PORD_INT i, u;
94
95 if (offset < 0)
96 { fprintf(stderr, "\nError in function setupBucket\n"
97 " offset must be >= 0\n");
98 quit();
99 }
100
101 bucket = newBucket(maxbin, maxitem, offset);
102
103 for (i = 0; i <= maxbin; i++)
104 bucket->bin[i] = -1;
105 for (u = 0; u <= maxitem; u++)
106 { bucket->next[u] = bucket->last[u] = -1;
107 bucket->key[u] = MAX_INT;
108 }
109
110 return(bucket);
111}
bucket_t * newBucket(PORD_INT maxbin, PORD_INT maxitem, PORD_INT offset)
Definition bucket.c:56