ESYS13  Revision_
DataBlocks2D.h
Go to the documentation of this file.
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