00001
00006 #include <vector>
00007
00008
00017 template<typename T>
00018 class Cube {
00019 public:
00020 Cube(unsigned nx, unsigned ny, unsigned nz);
00021
00022 class BadSize { };
00023
00024 void resize(unsigned nx, unsigned ny, unsigned nz);
00025
00026
00027
00028
00029 T& operator() (unsigned i, unsigned j, unsigned k);
00030 const T& operator() (unsigned i, unsigned j, unsigned k) const;
00031
00032 class BoundsViolation { };
00033
00034 unsigned nx() const;
00035 unsigned ny() const;
00036 unsigned nz() const;
00037
00038 private:
00039
00044 std::vector<std::vector<std::vector<T> > > _data;
00045 };
00046
00047 template<typename T>
00048 inline unsigned Cube<T>::nx() const
00049 { return _data.size(); }
00050
00051 template<typename T>
00052 inline unsigned Cube<T>::ny() const
00053 { return _data[0].size(); }
00054
00055 template<typename T>
00056 inline unsigned Cube<T>::nz() const
00057 { return _data[0][0].size(); }
00058
00059 template<typename T>
00060 inline T& Cube<T>::operator() (unsigned i, unsigned j, unsigned k)
00061 {
00062 if (i >= nx() || j >= ny() || k >= nz()) throw BoundsViolation();
00063 return _data[i][j][k];
00064 }
00065
00066 template<typename T>
00067 inline const T& Cube<T>::operator() (unsigned i, unsigned j, unsigned k) const
00068 {
00069 if (i >= nx() || j >= ny() || k >= nz()) throw BoundsViolation();
00070 return _data[i][j][k];
00071 }
00072
00073
00077 template<typename T>
00078 void
00079 Cube<T>::resize(unsigned nx, unsigned ny, unsigned nz)
00080 {
00081 if (nx == 0 || ny == 0 || nz == 0)
00082 throw BadSize();
00083 for (unsigned i = 0; i < nx; ++i){
00084 _data[i].resize(ny);
00085 for (unsigned j = 0; j < ny; ++j)
00086 _data[i][j].resize(nz);
00087 }
00088 }
00089
00090
00094 template<typename T>
00095 Cube<T>::Cube(unsigned nx, unsigned ny, unsigned nz)
00096 : _data (nx)
00097 {
00098 resize(nx, ny, nz);
00099 }