diff --git a/src/memory.h b/src/memory.h index 20ea426f909c0aabe619398e44f9b72bbaf40216..df942387fa82a7b312c8d0de870d8c987a4d667c 100644 --- a/src/memory.h +++ b/src/memory.h @@ -436,6 +436,53 @@ class Memory : protected Pointers { const char *name) {fail(name); return NULL;} +/* ---------------------------------------------------------------------- + grow or shrink 1st dim of a 4d array + last 3 dims must stay the same + ------------------------------------------------------------------------- */ + + template <typename TYPE> + TYPE ****grow(TYPE ****&array, int n1, int n2, int n3, int n4, + const char *name) + { + if (array == NULL) return create(array, n1, n2, n3, n4, name); + + bigint nbytes = ((bigint) sizeof(TYPE)) * n1*n2*n3*n4; + TYPE *data = (TYPE *)srealloc(array[0][0][0], nbytes, name); + nbytes = ((bigint) sizeof(TYPE *)) * n1*n2*n3; + TYPE **cube = (TYPE **)srealloc(array[0][0], nbytes, name); + nbytes = ((bigint) sizeof(TYPE **)) * n1*n2; + TYPE ***plane = (TYPE ***)srealloc(array[0], nbytes, name); + nbytes = ((bigint) sizeof(TYPE ***)) * n1; + array = (TYPE ****)srealloc(array, nbytes, name); + + int i, j, k; + bigint m1, m2; + bigint n = 0; + for (i = 0; i < n1; i++) { + m2 = ((bigint)i) * n2; + array[i] = &plane[m2]; + for (j = 0; j < n2; j++) { + m1 = ((bigint)i) * n2 + j; + m2 = ((bigint)i) * n2*n3 + j*n3; + plane[m1] = &cube[m2]; + for (k = 0; k < n3; k++) { + m1 = ((bigint)i) * n2*n3 + j*n3 + k; + cube[m1] = &data[n]; + n += n4; + } + } + } + return array; + } + + template <typename TYPE> + TYPE *****grow(TYPE *****&array, int n1, int n2, int n3, int n4, + const char *name) + { + fail(name); return NULL; + } + /* ---------------------------------------------------------------------- destroy a 4d array ------------------------------------------------------------------------- */