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