/* * Dimension */ #ifndef DIM_H #define DIM_H #include void *dim1(size_t sizeof_element, size_t n1) { return malloc(sizeof_element * n1); } void **dim2(size_t sizeof_element, size_t n1, size_t n2) { char **p1, *p2; size_t i1; p1 = (char **)malloc( sizeof(void *) * n1 + sizeof_element * n1 * n2); if (p1 == NULL) return NULL; p2 = (char *)(p1 + n1); for (i1 = 0; i1 < n1; i1++) p1[i1] = p2 + n2 * i1 * sizeof_element; return (void **)p1; } void ***dim3(size_t sizeof_element, size_t n1, size_t n2, size_t n3) { char ***p1, **p2, *p3; size_t i1, i2; size_t k1, k2; p1 = (char ***)malloc( sizeof(void *) * n1 + sizeof(void *) * n1 * n2 + sizeof_element * n1 * n2 * n3); if (p1 == NULL) return NULL; p2 = (char **)(p1 + n1); p3 = (char * )(p2 + n1 * n2); for (i1 = 0; i1 < n1; i1++) { k1 = i1; p1[k1] = p2 + n2 * k1; for (i2 = 0; i2 < n2; i2++) { k2 = n2 * k1 + i2; p2[k2] = p3 + n3 * k2 * sizeof_element; } } return (void ***)p1; } void ****dim4(size_t sizeof_element, size_t n1, size_t n2, size_t n3, size_t n4) { char ****p1, ***p2, **p3, *p4; size_t i1, i2, i3; size_t k1, k2, k3; p1 = (char ****)malloc( sizeof(void *) * n1 + sizeof(void *) * n1 * n2 + sizeof(void *) * n1 * n2 * n3 + sizeof_element * n1 * n2 * n3 * n4); if (p1 == NULL) return NULL; p2 = (char ***)(p1 + n1); p3 = (char ** )(p2 + n1 * n2); p4 = (char * )(p3 + n1 * n2 * n3); for (i1 = 0; i1 < n1; i1++) { k1 = i1; p1[k1] = p2 + n2 * k1; for (i2 = 0; i2 < n2; i2++) { k2 = n2 * k1 + i2; p2[k2] = p3 + n3 * k2; for (i3 = 0; i3 < n3; i3++) { k3 = n3 * k2 + i3; p3[k3] = p4 + n4 * k3 * sizeof_element; } } } return (void ****)p1; } void *****dim5(size_t sizeof_element, size_t n1, size_t n2, size_t n3, size_t n4, size_t n5) { char *****p1, ****p2, ***p3, **p4, *p5; size_t i1, i2, i3, i4; size_t k1, k2, k3, k4; p1 = (char *****)malloc( sizeof(void *) * n1 + sizeof(void *) * n1 * n2 + sizeof(void *) * n1 * n2 * n3 + sizeof(void *) * n1 * n2 * n3 * n4 + sizeof_element * n1 * n2 * n3 * n4 * n5); if (p1 == NULL) return NULL; p2 = (char ****)(p1 + n1); p3 = (char *** )(p2 + n1 * n2); p4 = (char ** )(p3 + n1 * n2 * n3); p5 = (char * )(p4 + n1 * n2 * n3 * n4); for (i1 = 0; i1 < n1; i1++) { k1 = i1; p1[k1] = p2 + n2 * k1; for (i2 = 0; i2 < n2; i2++) { k2 = n2 * k1 + i2; p2[k2] = p3 + n3 * k2; for (i3 = 0; i3 < n3; i3++) { k3 = n3 * k2 + i3; p3[k3] = p4 + n4 * k3; for (i4 = 0; i4 < n4; i4++) { k4 = n4 * k3 + i4; p4[k4] = p5 + n5 * k4 * sizeof_element; } } } } return (void *****)p1; } #ifdef __cplusplus template inline T *dim(size_t n1) { return reinterpret_cast(dim1(sizeof(T), n1)); } template inline T **dim(size_t n1, size_t n2) { return reinterpret_cast(dim2(sizeof(T), n1, n2)); } template inline T ***dim(size_t n1, size_t n2, size_t n3) { return reinterpret_cast(dim3(sizeof(T), n1, n2, n3)); } template inline T ****dim(size_t n1, size_t n2, size_t n3, size_t n4) { return reinterpret_cast(dim4(sizeof(T), n1, n2, n3, n4)); } template inline T *****dim(size_t n1, size_t n2, size_t n3, size_t n4, size_t n5) { return reinterpret_cast(dim5(sizeof(T), n1, n2, n3, n4, n5)); } #endif /*__cplusplus*/ #endif /*DIM_H*/