template void Dim2::Create(int cx_, int cy_) { cx = cx_; cy = cy_; ASSERT(cx >= 0 && cy >= 0); if(data) delete[] data; data = new T[cx * cy]; } template T& Dim2::At0(int x, int y) const { ASSERT(x >= 0 && y >= 0 && x < cx && y < cy); return data[x * cy + y]; } template void Dim2::Clear() { if(data) delete[] data; cx = cy = 0; } template void Dim2::Set(const Dim2& src) { Create(src.cx, src.cy); Copy(data, src.data, src.data + cx * cy); } template Dim2& Dim2::operator=(const Dim2& src) { if(&src == this) return *this; Set(src); return *this; } template void Dim3::Create(int cx_, int cy_, int cz_) { cx = cx_; cy = cy_; cz = cz_; ASSERT(cx >= 0 && cy >= 0 && cz >= 0); if(data) delete[] data; data = new T[cx * cy * cz]; } template T& Dim3::At0(int x, int y, int z) const { ASSERT(x >= 0 && y >= 0 && z >= 0 && x < cx && y < cy && z < cz); return data[cz * (x * cy + y) + z]; } template void Dim3::Clear() { if(data) delete[] data; cx = cy = cz = 0; } template void Dim3::Set(const Dim3& src) { Create(src.cx, src.cy, src.cz); Copy(data, src.data, src.data + cx * cy * cz); } template Dim3& Dim3::operator=(const Dim3& src) { if(&src == this) return *this; Set(src); return *this; } template void Dim4::Create(int cx_, int cy_, int cz_, int cu_) { cx = cx_; cy = cy_; cz = cz_; cu = cu_; ASSERT(cx >= 0 && cy >= 0 && cz >= 0 && cy >= 0); if(data) delete[] data; data = new T[cx * cy * cz * cu]; } template T& Dim4::At0(int x, int y, int z, int u) const { ASSERT(x >= 0 && y >= 0 && z >= 0 && u >= 0 && x < cx && y < cy && z < cz && u < cu); return data[cu * (cz * (x * cy + y) + z) + u]; } template void Dim4::Clear() { if(data) delete[] data; cx = cy = cz = cu = 0; } template void Dim4::Set(const Dim4& src) { Create(src.cx, src.cy, src.cz, src.cu); Copy(data, src.data, src.data + cx * cy * cz * cu); } template Dim4& Dim4::operator=(const Dim4& src) { if(&src == this) return *this; Set(src); return *this; } template void Dim5::Create(int cx_, int cy_, int cz_, int cu_, int cv_) { cx = cx_; cy = cy_; cz = cz_; cu = cu_; cv = cv_; ASSERT(cx >= 0 && cy >= 0 && cz >= 0 && cu >= 0 && cv >= 0); if(data) delete[] data; data = new T[cx * cy * cz * cu * cv]; } template T& Dim5::At0(int x, int y, int z, int u, int v) const { ASSERT(x >= 0 && y >= 0 && z >= 0 && u >= 0 && v >= 0 && x < cx && y < cy && z < cz && u < cu && v < cv); return data[cv * (cu * (cz * (x * cy + y) + z) + u) + v]; } template void Dim5::Clear() { if(data) delete[] data; cx = cy = cz = cu = cv = 0; } template void Dim5::Set(const Dim5& src) { Create(src.cx, src.cy, src.cz, src.cu, src.cv); Copy(data, src.data, src.data + cx * cy * cz * cu * cv); } template Dim5& Dim5::operator=(const Dim5& src) { if(&src == this) return *this; Set(src); return *this; }