ESYS13
Revision_
|
00001 00002 /******************************************************* 00003 * 00004 * Copyright (c) 2003-2012 by University of Queensland 00005 * Earth Systems Science Computational Center (ESSCC) 00006 * http://www.uq.edu.au/esscc 00007 * 00008 * Primary Business: Queensland, Australia 00009 * Licensed under the Open Software License version 3.0 00010 * http://www.opensource.org/licenses/osl-3.0.php 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 // The type of the underlying data array under management. 00041 // The multi-dimensional data points are flattened and stored 00042 // serially as a vector of doubles. 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 // The underlying array of data values. 00226 // The two dimensional array of multi-dimensional data points is flattened 00227 // and serialised within this one dimensional array of doubles. 00228 ValueType m_data; 00229 00230 // 00231 // The dimensions of the 2D array of data points. 00232 ValueType::size_type m_numRows; 00233 ValueType::size_type m_numCols; 00234 00235 // 00236 // The number of values per data point. 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 } // end of namespace 00333 00334 #endif