#ifndef _Dim_Dim4_h_ #define _Dim_Dim4_h_ template class Dim4; template class Dim4y; template class Dim4z; template class Dim4x { protected: typename Dim4 *dim; int x; friend typename Dim4; friend typename Dim4z; public: Dim4y operator[](int i) { Dim4y h; (Dim4x&)h = *this; h.y = i; return h; } }; template class Dim4y : protected Dim4x { protected: int y; friend typename Dim4x; public: Dim4z operator[](int i) { Dim4z h; (Dim4y&)h = *this; h.z = i; return h; } }; template class Dim4z : Dim4y { int z; friend typename Dim4y; public: R& operator[](int i) { return dim->At(x, y, z, i); } }; template class Dim4 { T *data; int cx, cy, cz, cu; T& At0(int x, int y, int z, int u) const; public: void Create(int cx, int cy, int cz, int cu); T& At(int x, int y, int z, int u) { return At0(x, y, z, u); } const T& At(int x, int y, int z, int u) const { return At0(x, y, z, u); } T& operator()(int x, int y, int z, int u) { return At0(x, y, z, u); } const T& operator()(int x, int y, int z, int u) const { return At0(x, y, z, u); } void Clear(); void Set(const Dim4& src); Dim4& operator=(const Dim4& src); Dim4(const Dim4& src) { data = NULL; Set(src); } Dim4() { data = NULL; } Dim4(int cx, int cy, int cz, int cu) { data = NULL; Create(cx, cy, cz, cu); } ~Dim4() { Clear(); } Dim4x operator[](int i) { Dim4x h; h.dim = this; h.x = i; return h; } Dim4x operator[](int i) const { Dim4x h; h.dim = const_cast *>(this); h.x = i; return h; } }; #endif