00001 00002 #ifndef __ARRAYS_H 00003 #define __ARRAYS_H 00004 00005 #include <assert.h> 00006 00055 template <class T> class Array2 { 00056 private: 00058 T* m_data; 00060 int m_width, m_height; 00068 bool m_managed; 00069 00070 public: 00072 Array2(int width, int height) { 00073 assert(width > 0 && height > 0); 00074 00075 m_width = width; 00076 m_height = height; 00077 00078 m_data = new T[m_width * m_height]; 00079 00080 m_managed = true; 00081 } 00082 00084 Array2(int width, int height, T* data) { 00085 assert(width > 0 && height > 0 && data != 0); 00086 00087 m_width = width; 00088 m_height = height; 00089 00090 m_data = data; 00091 00092 m_managed = false; 00093 } 00094 00096 ~Array2() { 00097 if (m_managed) { 00098 delete [] m_data; 00099 } 00100 } 00101 00103 inline T& operator () (int col, int row) { 00104 assert(row >= 0 && row < m_height); 00105 assert(col >= 0 && col < m_width); 00106 return m_data[row * m_width + col]; 00107 } 00108 00110 inline const T& operator() (int col, int row) const { 00111 assert(row >= 0 && row < m_height); 00112 assert(col >= 0 && col < m_width); 00113 return m_data[row * m_width + col]; 00114 } 00115 00117 int getWidth() const { 00118 return m_width; 00119 } 00120 00122 int getHeight() const { 00123 return m_height; 00124 } 00125 00127 const T* getData() const { 00128 return m_data; 00129 } 00130 }; 00131 00133 template <class T> class Array3 { 00134 private: 00136 T* m_data; 00138 int m_width, m_height, m_depth; 00146 bool m_managed; 00147 00148 public: 00150 Array3(int width, int height, int depth) { 00151 assert(width > 0 && height > 0 && depth > 0); 00152 00153 m_width = width; 00154 m_height = height; 00155 m_depth = depth; 00156 00157 m_data = new T[m_width * m_height * m_depth]; 00158 00159 m_managed = true; 00160 } 00161 00163 Array3(int width, int height, int depth, T* data) { 00164 assert(width > 0 && height > 0 && depth > 0 && data != 0); 00165 00166 m_width = width; 00167 m_height = height; 00168 m_depth = depth; 00169 00170 m_data = data; 00171 00172 m_managed = false; 00173 } 00174 00176 ~Array3() { 00177 if (m_managed) { 00178 delete [] m_data; 00179 } 00180 } 00181 00183 inline T& operator () (int col, int row, int depth) { 00184 assert(row >= 0 && row < m_height); 00185 assert(col >= 0 && col < m_width); 00186 assert(depth >= 0 && depth < m_depth); 00187 return m_data[(row * m_width + col) * m_depth + depth]; 00188 } 00189 00191 inline const T& operator() (int col, int row, int depth) const { 00192 assert(row >= 0 && row < m_height); 00193 assert(col >= 0 && col < m_width); 00194 assert(depth >= 0 && depth < m_depth); 00195 return m_data[(row * m_width + col) * m_depth + depth]; 00196 } 00197 00199 int getWidth() const { 00200 return m_width; 00201 } 00202 00204 int getHeight() const { 00205 return m_height; 00206 } 00207 00209 int getDepth() const { 00210 return m_depth; 00211 } 00212 00214 const T* getData() const { 00215 return m_data; 00216 } 00217 }; 00218 00219 #endif // __ARRAYS_H