diff --git a/src/memory.h b/src/memory.h index 0073be189f..1e66207666 100644 --- a/src/memory.h +++ b/src/memory.h @@ -437,6 +437,72 @@ class Memory : protected Pointers { sfree(array); } +/* ---------------------------------------------------------------------- + create a 5d array +------------------------------------------------------------------------- */ + + template + TYPE *****create(TYPE *****&array, int n1, int n2, int n3, int n4, + int n5, const char *name) + { + bigint nbytes = ((bigint) sizeof(TYPE)) * n1*n2*n3*n4*n5; + TYPE *data = (TYPE *) smalloc(nbytes,name); + nbytes = ((bigint) sizeof(TYPE *)) * n1*n2*n3*n4; + TYPE **level4 = (TYPE **) smalloc(nbytes,name); + nbytes = ((bigint) sizeof(TYPE **)) * n1*n2*n3; + TYPE ***level3 = (TYPE ***) smalloc(nbytes,name); + nbytes = ((bigint) sizeof(TYPE ***)) * n1*n2; + TYPE ****level2 = (TYPE ****) smalloc(nbytes,name); + nbytes = ((bigint) sizeof(TYPE ****)) * n1; + array = (TYPE *****) smalloc(nbytes,name); + + int i,j,k,l; + bigint m1,m2,m3,m4,m5; + bigint n = 0; + for (i = 0; i < n1; i++) { + m2 = ((bigint) i) * n2; + array[i] = &level2[m2]; + for (j = 0; j < n2; j++) { + m1 = ((bigint) i) * n2 + j; + m2 = ((bigint) i) * n2*n3 + ((bigint) j) * n3; + level2[m1] = &level3[m2]; + for (k = 0; k < n3; k++) { + m1 = ((bigint) i) * n2*n3 + ((bigint) j) * n3 + k; + m2 = ((bigint) i) * n2*n3*n4 + + ((bigint) j) * n3*n4 + ((bigint) k) * n4; + level3[m1] = &level4[m2]; + for (l = 0; l < n4; l++) { + m1 = ((bigint) i) * n2*n3*n4 + + ((bigint) j) * n3*n4 + ((bigint) k) * n4 + l; + level4[m1] = &data[n]; + n += n5; + } + } + } + } + return array; + } + + template + TYPE ******create(TYPE ******&array, int n1, int n2, int n3, int n4, + int n5, const char *name) + {fail(name);} + +/* ---------------------------------------------------------------------- + destroy a 5d array +------------------------------------------------------------------------- */ + + template + void destroy(TYPE *****array) + { + if (array == NULL) return; + sfree(array[0][0][0][0]); + sfree(array[0][0][0]); + sfree(array[0][0]); + sfree(array[0]); + sfree(array); + } + /* ---------------------------------------------------------------------- memory usage of arrays, including pointers ------------------------------------------------------------------------- */