33 void *
smalloc(bigint n,
string);
34 void *
srealloc(
void *, bigint n,
string);
42 template <
typename TYPE>
43 TYPE *create(TYPE *&array,
int n,
string name)
45 bigint nbytes = ((bigint)
sizeof(TYPE)) * n;
46 array = (TYPE *)
smalloc(nbytes,name);
50 template <
typename TYPE>
51 TYPE **create(TYPE **&array,
int n,
string name)
52 {
fail(name);
return NULL;}
58 template <
typename TYPE>
59 TYPE *grow(TYPE *&array,
int n,
string name)
61 if (array == NULL)
return create(array,n,name);
63 bigint nbytes = ((bigint)
sizeof(TYPE)) * n;
64 array = (TYPE *)
srealloc(array,nbytes,name);
68 template <
typename TYPE>
69 TYPE **grow(TYPE **&array,
int n,
string name)
70 {
fail(name);
return NULL;}
76 template <
typename TYPE>
77 void destroy(TYPE *array)
85 template <
typename TYPE>
86 TYPE *create1d_offset(TYPE *&array,
int nlo,
int nhi,
string name)
88 bigint nbytes = ((bigint)
sizeof(TYPE)) * (nhi-nlo+1);
89 array = (TYPE *)
smalloc(nbytes,name);
94 template <
typename TYPE>
95 TYPE **create1d_offset(TYPE **&array,
int nlo,
int nhi,
string name)
96 {
fail(name);
return NULL;}
102 template <
typename TYPE>
103 void destroy1d_offset(TYPE *array,
int offset)
105 if (array)
sfree(&array[offset]);
112 template <
typename TYPE>
113 TYPE **create(TYPE **&array,
int n1,
int n2,
string name)
115 bigint nbytes = ((bigint)
sizeof(TYPE)) * n1*n2;
116 TYPE *data = (TYPE *)
smalloc(nbytes,name);
117 nbytes = ((bigint)
sizeof(TYPE *)) * n1;
118 array = (TYPE **)
smalloc(nbytes,name);
121 for (
int i = 0; i < n1; i++) {
128 template <
typename TYPE>
129 TYPE ***create(TYPE ***&array,
int n1,
int n2,
string name)
130 {
fail(name);
return NULL;}
137 template <
typename TYPE>
138 TYPE **grow(TYPE **&array,
int n1,
int n2,
string name)
140 if (array == NULL)
return create(array,n1,n2,name);
142 bigint nbytes = ((bigint)
sizeof(TYPE)) * n1*n2;
143 TYPE *data = (TYPE *)
srealloc(array[0],nbytes,name);
144 nbytes = ((bigint)
sizeof(TYPE *)) * n1;
145 array = (TYPE **)
srealloc(array,nbytes,name);
148 for (
int i = 0; i < n1; i++) {
155 template <
typename TYPE>
156 TYPE ***grow(TYPE ***&array,
int n1,
int n2,
string name)
157 {
fail(name);
return NULL;}
163 template <
typename TYPE>
164 void destroy(TYPE **array)
166 if (array == NULL)
return;
175 template <
typename TYPE>
176 TYPE **create_ragged(TYPE **&array,
int n1,
int *n2,
string name)
179 for (
int i = 0; i < n1; i++) n2sum += n2[i];
181 bigint nbytes = ((bigint)
sizeof(TYPE)) * n2sum;
182 TYPE *data = (TYPE *)
smalloc(nbytes,name);
183 nbytes = ((bigint)
sizeof(TYPE *)) * n1;
184 array = (TYPE **)
smalloc(nbytes,name);
187 for (
int i = 0; i < n1; i++) {
194 template <
typename TYPE>
195 TYPE ***create_ragged(TYPE ***&array,
int n1,
int *n2,
string name)
196 {
fail(name);
return NULL;}
203 template <
typename TYPE>
204 TYPE **create2d_offset(TYPE **&array,
int n1,
int n2lo,
int n2hi,
207 int n2 = n2hi - n2lo + 1;
208 create(array,n1,n2,name);
209 for (
int i = 0; i < n1; i++) array[i] -= n2lo;
213 template <
typename TYPE>
214 TYPE ***create2d_offset(TYPE ***&array,
int n1,
int n2lo,
int n2hi,
215 string name) {
fail(name);
return NULL;}
221 template <
typename TYPE>
222 void destroy2d_offset(TYPE **array,
int offset)
224 if (array == NULL)
return;
225 sfree(&array[0][offset]);
233 template <
typename TYPE>
234 TYPE ***create(TYPE ***&array,
int n1,
int n2,
int n3,
string name)
236 bigint nbytes = ((bigint)
sizeof(TYPE)) * n1*n2*n3;
237 TYPE *data = (TYPE *)
smalloc(nbytes,name);
238 nbytes = ((bigint)
sizeof(TYPE *)) * n1*n2;
239 TYPE **plane = (TYPE **)
smalloc(nbytes,name);
240 nbytes = ((bigint)
sizeof(TYPE **)) * n1;
241 array = (TYPE ***)
smalloc(nbytes,name);
246 for (i = 0; i < n1; i++) {
247 m = ((bigint) i) * n2;
248 array[i] = &plane[m];
249 for (j = 0; j < n2; j++) {
250 plane[m+j] = &data[n];
257 template <
typename TYPE>
258 TYPE ****create(TYPE ****&array,
int n1,
int n2,
int n3,
string name)
259 {
fail(name);
return NULL;}
266 template <
typename TYPE>
267 TYPE ***grow(TYPE ***&array,
int n1,
int n2,
int n3,
string name)
269 if (array == NULL)
return create(array,n1,n2,n3,name);
271 bigint nbytes = ((bigint)
sizeof(TYPE)) * n1*n2*n3;
272 TYPE *data = (TYPE *)
srealloc(array[0][0],nbytes,name);
273 nbytes = ((bigint)
sizeof(TYPE *)) * n1*n2;
274 TYPE **plane = (TYPE **)
srealloc(array[0],nbytes,name);
275 nbytes = ((bigint)
sizeof(TYPE **)) * n1;
276 array = (TYPE ***)
srealloc(array,nbytes,name);
281 for (i = 0; i < n1; i++) {
282 m = ((bigint) i) * n2;
283 array[i] = &plane[m];
284 for (j = 0; j < n2; j++) {
285 plane[m+j] = &data[n];
292 template <
typename TYPE>
293 TYPE ****grow(TYPE ****&array,
int n1,
int n2,
int n3,
string name)
294 {
fail(name);
return NULL;}
300 template <
typename TYPE>
301 void destroy(TYPE ***array)
303 if (array == NULL)
return;
314 template <
typename TYPE>
315 TYPE ***create3d_offset(TYPE ***&array,
int n1lo,
int n1hi,
316 int n2,
int n3,
string name)
318 int n1 = n1hi - n1lo + 1;
319 create(array,n1,n2,n3,name);
324 template <
typename TYPE>
325 TYPE ****create3d_offset(TYPE ****&array,
int n1lo,
int n1hi,
326 int n2,
int n3,
string name)
327 {
fail(name);
return NULL;}
333 template <
typename TYPE>
334 void destroy3d_offset(TYPE ***array,
int offset)
336 if (array) destroy(&array[offset]);
347 template <
typename TYPE>
348 TYPE ***create3d_offset(TYPE ***&array,
int n1lo,
int n1hi,
349 int n2lo,
int n2hi,
int n3lo,
int n3hi,
352 int n1 = n1hi - n1lo + 1;
353 int n2 = n2hi - n2lo + 1;
354 int n3 = n3hi - n3lo + 1;
355 create(array,n1,n2,n3,name);
357 bigint m = ((bigint) n1) * n2;
358 for (bigint i = 0; i < m; i++) array[0][i] -= n3lo;
359 for (
int i = 0; i < n1; i++) array[i] -= n2lo;
364 template <
typename TYPE>
365 TYPE ****create3d_offset(TYPE ****&array,
int n1lo,
int n1hi,
366 int n2lo,
int n2hi,
int n3lo,
int n3hi,
368 {
fail(name);
return NULL;}
374 template <
typename TYPE>
375 void destroy3d_offset(TYPE ***array,
376 int n1_offset,
int n2_offset,
int n3_offset)
378 if (array == NULL)
return;
379 sfree(&array[n1_offset][n2_offset][n3_offset]);
380 sfree(&array[n1_offset][n2_offset]);
381 sfree(&array[n1_offset]);
388 template <
typename TYPE>
389 TYPE ****create(TYPE ****&array,
int n1,
int n2,
int n3,
int n4,
392 bigint nbytes = ((bigint)
sizeof(TYPE)) * n1*n2*n3*n4;
393 TYPE *data = (TYPE *)
smalloc(nbytes,name);
394 nbytes = ((bigint)
sizeof(TYPE *)) * n1*n2*n3;
395 TYPE **cube = (TYPE **)
smalloc(nbytes,name);
396 nbytes = ((bigint)
sizeof(TYPE **)) * n1*n2;
397 TYPE ***plane = (TYPE ***)
smalloc(nbytes,name);
398 nbytes = ((bigint)
sizeof(TYPE ***)) * n1;
399 array = (TYPE ****)
smalloc(nbytes,name);
404 for (i = 0; i < n1; i++) {
405 m2 = ((bigint) i) * n2;
406 array[i] = &plane[m2];
407 for (j = 0; j < n2; j++) {
408 m1 = ((bigint) i) * n2 + j;
409 m2 = ((bigint) i) * n2*n3 + j*n3;
410 plane[m1] = &cube[m2];
411 for (k = 0; k < n3; k++) {
412 m1 = ((bigint) i) * n2*n3 + j*n3 + k;
421 template <
typename TYPE>
422 TYPE *****create(TYPE *****&array,
int n1,
int n2,
int n3,
int n4,
424 {
fail(name);
return NULL;}
430 template <
typename TYPE>
431 void destroy(TYPE ****array)
433 if (array == NULL)
return;
434 sfree(array[0][0][0]);
448 template <
typename TYPE>
449 TYPE ****create4d_offset(TYPE ****&array,
int n1,
int n2lo,
int n2hi,
450 int n3lo,
int n3hi,
int n4lo,
int n4hi,
453 int n2 = n2hi - n2lo + 1;
454 int n3 = n3hi - n3lo + 1;
455 int n4 = n4hi - n4lo + 1;
456 create(array,n1,n2,n3,n4,name);
458 bigint m = ((bigint) n1) * n2 * n3;
459 for (bigint i = 0; i < m; i++) array[0][0][i] -= n4lo;
460 m = ((bigint) n1) * n2;
461 for (bigint i = 0; i < m; i++) array [0][i] -= n3lo;
462 for (
int i = 0; i < n1; i++) array[i] -= n2lo;
466 template <
typename TYPE>
467 TYPE ****create4d_offset(TYPE *****&array,
int n1,
int n2lo,
int n2hi,
468 int n3lo,
int n3hi,
int n4lo,
int n4hi,
470 {
fail(name);
return NULL;}
476 template <
typename TYPE>
477 void destroy4d_offset(TYPE ****array,
478 int n2_offset,
int n3_offset,
int n4_offset)
480 if (array == NULL)
return;
481 sfree(&array[0][n2_offset][n3_offset][n4_offset]);
482 sfree(&array[0][n2_offset][n3_offset]);
483 sfree(&array[0][n2_offset]);
491 template <
typename TYPE>
492 TYPE *****create(TYPE *****&array,
int n1,
int n2,
int n3,
int n4,
495 bigint nbytes = ((bigint)
sizeof(TYPE)) * n1*n2*n3*n4*n5;
496 TYPE *data = (TYPE *)
smalloc(nbytes,name);
497 nbytes = ((bigint)
sizeof(TYPE *)) * n1*n2*n3*n4;
498 TYPE **level4 = (TYPE **)
smalloc(nbytes,name);
499 nbytes = ((bigint)
sizeof(TYPE **)) * n1*n2*n3;
500 TYPE ***level3 = (TYPE ***)
smalloc(nbytes,name);
501 nbytes = ((bigint)
sizeof(TYPE ***)) * n1*n2;
502 TYPE ****level2 = (TYPE ****)
smalloc(nbytes,name);
503 nbytes = ((bigint)
sizeof(TYPE ****)) * n1;
504 array = (TYPE *****)
smalloc(nbytes,name);
509 for (i = 0; i < n1; i++) {
510 m2 = ((bigint) i) * n2;
511 array[i] = &level2[m2];
512 for (j = 0; j < n2; j++) {
513 m1 = ((bigint) i) * n2 + j;
514 m2 = ((bigint) i) * n2*n3 + ((bigint) j) * n3;
515 level2[m1] = &level3[m2];
516 for (k = 0; k < n3; k++) {
517 m1 = ((bigint) i) * n2*n3 + ((bigint) j) * n3 + k;
518 m2 = ((bigint) i) * n2*n3*n4 +
519 ((bigint) j) * n3*n4 + ((bigint) k) * n4;
520 level3[m1] = &level4[m2];
521 for (l = 0; l < n4; l++) {
522 m1 = ((bigint) i) * n2*n3*n4 +
523 ((bigint) j) * n3*n4 + ((bigint) k) * n4 + l;
524 level4[m1] = &data[n];
533 template <
typename TYPE>
534 TYPE ******create(TYPE ******&array,
int n1,
int n2,
int n3,
int n4,
536 {
fail(name);
return NULL;}
542 template <
typename TYPE>
543 void destroy(TYPE *****array)
545 if (array == NULL)
return;
546 sfree(array[0][0][0][0]);
547 sfree(array[0][0][0]);
557 template <
typename TYPE>
558 bigint usage(TYPE *array,
int n)
561 bigint bytes = ((bigint)
sizeof(TYPE)) * n;
565 template <
typename TYPE>
566 bigint usage(TYPE **array,
int n1,
int n2)
569 bigint bytes = ((bigint)
sizeof(TYPE)) * n1*n2;
570 bytes += ((bigint)
sizeof(TYPE *)) * n1;
574 template <
typename TYPE>
575 bigint usage(TYPE ***array,
int n1,
int n2,
int n3)
578 bigint bytes = ((bigint)
sizeof(TYPE)) * n1*n2*n3;
579 bytes += ((bigint)
sizeof(TYPE *)) * n1*n2;
580 bytes += ((bigint)
sizeof(TYPE **)) * n1;
584 template <
typename TYPE>
585 bigint usage(TYPE ****array,
int n1,
int n2,
int n3,
int n4)
588 bigint bytes = ((bigint)
sizeof(TYPE)) * n1*n2*n3*n4;
589 bytes += ((bigint)
sizeof(TYPE *)) * n1*n2*n3;
590 bytes += ((bigint)
sizeof(TYPE **)) * n1*n2;
591 bytes += ((bigint)
sizeof(TYPE ***)) * n1;
void sfree(void *)
Safe free.
Definition: memory.cpp:71
void * srealloc(void *, bigint n, string)
Safe reallocation.
Definition: memory.cpp:52
Definition: pointers.h:29
void * smalloc(bigint n, string)
Safe malloc.
Definition: memory.cpp:30
void fail(string)
Erroneous usage of templated create/grow functions.
Definition: memory.cpp:81