00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #if !defined escript_DataBlocks2D_20040405_H
00016 #define escript_DataBlocks2D_20040405_H
00017 #include "system_dep.h"
00018
00019 #include "DataVector.h"
00020
00021 #include <sstream>
00022 #include <iostream>
00023
00024 namespace escript {
00025
00035 class DataBlocks2D {
00036
00037 public:
00038
00039
00040
00041
00042
00043 typedef DataVector ValueType;
00044
00053 ESCRIPT_DLL_API
00054 DataBlocks2D();
00055
00063 ESCRIPT_DLL_API
00064 DataBlocks2D(const DataBlocks2D& other);
00065
00079 ESCRIPT_DLL_API
00080 DataBlocks2D(int numRows, int numCols, int blockSize);
00081
00089 ESCRIPT_DLL_API
00090 ~DataBlocks2D();
00091
00097 ESCRIPT_DLL_API
00098 inline
00099 ValueType::size_type
00100 size() const;
00101
00106 ESCRIPT_DLL_API
00107 inline
00108 ValueType::size_type
00109 getNumRows() const;
00110
00115 ESCRIPT_DLL_API
00116 inline
00117 ValueType::size_type
00118 getNumCols() const;
00119
00124 ESCRIPT_DLL_API
00125 inline
00126 ValueType::size_type
00127 getBlockSize() const;
00128
00140 ESCRIPT_DLL_API
00141 void
00142 resize(int numRows, int numCols, int blockSize);
00143
00149 ESCRIPT_DLL_API
00150 DataBlocks2D&
00151 operator=(const DataBlocks2D& other);
00152
00157 ESCRIPT_DLL_API
00158 void
00159 Swap(DataBlocks2D& other);
00160
00169 ESCRIPT_DLL_API
00170 inline
00171 ValueType::size_type
00172 index(int row, int col) const;
00173
00179 ESCRIPT_DLL_API
00180 inline
00181 ValueType::reference
00182 operator[](ValueType::size_type i);
00183
00184 ESCRIPT_DLL_API
00185 inline
00186 ValueType::const_reference
00187 operator[](ValueType::size_type i) const;
00188
00193 ESCRIPT_DLL_API
00194 inline
00195 ValueType::reference
00196 operator()(int row, int col);
00197
00198 ESCRIPT_DLL_API
00199 inline
00200 ValueType::const_reference
00201 operator()(int row, int col) const;
00202
00209 ESCRIPT_DLL_API
00210 inline
00211 ValueType&
00212 getData();
00213
00214 ESCRIPT_DLL_API
00215 inline
00216 const ValueType&
00217 getData() const;
00218
00219
00220 protected:
00221
00222 private:
00223
00224
00225
00226
00227
00228 ValueType m_data;
00229
00230
00231
00232 ValueType::size_type m_numRows;
00233 ValueType::size_type m_numCols;
00234
00235
00236
00237 ValueType::size_type m_blockSize;
00238
00239 };
00240
00241 inline
00242 DataBlocks2D::ValueType::size_type
00243 DataBlocks2D::size() const
00244 {
00245 EsysAssert(((m_numRows >= 0) && (m_numCols >= 0) && (m_blockSize >= 0)), "(DataBlocks2D) Invalid object.");
00246 return m_data.size();
00247 }
00248
00249 inline
00250 DataBlocks2D::ValueType::size_type
00251 DataBlocks2D::getNumRows() const
00252 {
00253 EsysAssert(((m_numRows >= 0) && (m_numCols >= 0) && (m_blockSize >= 0)), "(DataBlocks2D) Invalid object.");
00254 return m_numRows;
00255 }
00256
00257 inline
00258 DataBlocks2D::ValueType::size_type
00259 DataBlocks2D::getNumCols() const
00260 {
00261 EsysAssert(((m_numRows >= 0) && (m_numCols >= 0) && (m_blockSize >= 0)), "(DataBlocks2D) Invalid object.");
00262 return m_numCols;
00263 }
00264
00265 inline
00266 DataBlocks2D::ValueType::size_type
00267 DataBlocks2D::getBlockSize() const
00268 {
00269 EsysAssert(((m_numRows >= 0) && (m_numCols >= 0) && (m_blockSize >= 0)), "(DataBlocks2D) Invalid object.");
00270 return m_blockSize;
00271 }
00272
00273 inline
00274 DataBlocks2D::ValueType::size_type
00275 DataBlocks2D::index(int row, int col) const
00276 {
00277 EsysAssert(((m_numRows >= 0) && (m_numCols >= 0) && (m_blockSize >= 0)), "(DataBlocks2D) Invalid object.");
00278 EsysAssert(((row >= 0) && (col >= 0) && (m_data.size() > 0)), "(DataBlocks2D) Index value out of range.");
00279 ValueType::size_type temp=(row*m_numCols+col)*m_blockSize;
00280 EsysAssert((temp <= (m_data.size()-m_blockSize)), "(DataBlocks2D) Index value out of range.");
00281 return (temp);
00282 }
00283
00284 inline
00285 DataBlocks2D::ValueType::reference
00286 DataBlocks2D::operator[](DataBlocks2D::ValueType::size_type i)
00287 {
00288 EsysAssert(((m_numRows >= 0) && (m_numCols >= 0) && (m_blockSize >= 0)), "(DataBlocks2D) Invalid object.");
00289 return m_data[i];
00290 }
00291
00292 inline
00293 DataBlocks2D::ValueType::const_reference
00294 DataBlocks2D::operator[](DataBlocks2D::ValueType::size_type i) const
00295 {
00296 EsysAssert(((m_numRows >= 0) && (m_numCols >= 0) && (m_blockSize >= 0)), "(DataBlocks2D) Invalid object.");
00297 return m_data[i];
00298 }
00299
00300 inline
00301 DataBlocks2D::ValueType::reference
00302 DataBlocks2D::operator()(int row, int col)
00303 {
00304 EsysAssert(((m_numRows >= 0) && (m_numCols >= 0) && (m_blockSize >= 0)), "(DataBlocks2D) Invalid object.");
00305 return m_data[index(row,col)];
00306 }
00307
00308 inline
00309 DataBlocks2D::ValueType::const_reference
00310 DataBlocks2D::operator()(int row, int col) const
00311 {
00312 EsysAssert(((m_numRows >= 0) && (m_numCols >= 0) && (m_blockSize >= 0)), "(DataBlocks2D) Invalid object.");
00313 return m_data[index(row,col)];
00314 }
00315
00316 inline
00317 DataBlocks2D::ValueType&
00318 DataBlocks2D::getData()
00319 {
00320 EsysAssert(((m_numRows >= 0) && (m_numCols >= 0) && (m_blockSize >= 0)), "(DataBlocks2D) Invalid object.");
00321 return m_data;
00322 }
00323
00324 inline
00325 const DataBlocks2D::ValueType&
00326 DataBlocks2D::getData() const
00327 {
00328 EsysAssert(((m_numRows >= 0) && (m_numCols >= 0) && (m_blockSize >= 0)), "(DataBlocks2D) Invalid object.");
00329 return m_data;
00330 }
00331
00332 }
00333
00334 #endif