Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members  

array2d.h

Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2001 The AUTHORS 
00003  *   Romeu Andre' Pieritz, Ph.D.        - romeu_pieritz@hotmail.com
00004  *   Rafael Mendes, Eng.                – mendes_rafael@yahoo.com
00005  *   Rodrigo Ferraz de Andrade, Eng.    – rferraz@iname.com 
00006  * All rights reserved.
00007  *
00008  * Permission to use, copy and distribute this software and its
00009  * documentation for educational and personal use, without fee is hereby granted, 
00010  * provided that the above copyright notice and the following
00011  * two paragraphs appear in all copies of this software.
00012  *
00013  * IN NO EVENT SHALL THE AUTHORS BE LIABLE TO ANY PARTY FOR
00014  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
00015  * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE AUTHORS
00016  * HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00017  *
00018  * THE AUTHORS SPECIFICALLY DISCLAIMS ANY WARRANTIES,
00019  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
00020  * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HERE UNDER IS
00021  * ON AN "AS IS" BASIS, AND THE AUTHORS HAVE NO OBLIGATION TO
00022  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
00023  *
00024  * SINMEC Lab. - CFD Sinflow Project - http://www.sinmec.ufsc.br/cfd
00025  */
00026 
00027 
00028 // File Define
00029 #ifndef __CSFL_SYS_MATH_ARRAY2D_H__
00030 #define __CSFL_SYS_MATH_ARRAY2D_H__
00031 
00032 
00033 // Include
00034 #include <csfl/sys/core/sflobject.h>
00035 #include <csfl/sys/geom/point.h>
00036 #include <csfl/sys/geom/size.h>
00037 
00038 
00039 // Namespace
00040 namespace csfl {
00041 
00042 
00043         
00044 template <class T>
00045 class IArray2D 
00046 
00050 {
00051 public:
00052 
00057         IArray2D( int _row, int _col, T ** _data = NULL );
00058         IArray2D( const ISize &, T ** = NULL );
00059         IArray2D( IArray2D<T> * );
00060 
00061         ~IArray2D();
00062 
00064         virtual IArray2D<T> & operator =( const IArray2D<T> & );
00065 
00070     inline T & operator () ( int _row, int _col )  { return data[_row][_col]; }
00071 
00076         inline T ** Data() { return data; }
00077         
00083         inline const ISize & Size() const { return size; }
00084 
00089         inline T Value( const IPoint &_p ) const { return data[_p.x][_p.y]; }
00090     inline T Value( int _x, int _y ) const { return data[_x][_y]; }
00091 
00096         inline T & Value( const IPoint &_p ) { return data[_p.x][_p.y]; }
00097         inline T & Value( int _x, int _y ) { return data[_x][_y]; }
00098 
00103     inline void SetValue( const IPoint &_p, T _value );
00104     inline void SetValue( int _x, int _y, T _value );
00105 
00110     inline void AddValue( const IPoint &_p, T _value );
00111         inline void AddValue( int _x, int _y, T _value );
00112 
00117         IArray2D<T> * Row( int _nrow );
00118         
00123         IArray2D<T> * Column( int _ncolumn);
00124 
00125 private:
00126         void AllocData();
00127         void FreeData();
00128         bool CopyData( T ** );
00129 
00130 protected:
00131         ISize size;
00132         T **data;
00133 };
00134 
00135 // Template Class Methods Implementation =======================================
00136 
00137 template <class T>
00138 IArray2D<T>::IArray2D( int _row, int _col, T **_data )
00139 {
00140     size = ISize( _row, _col );
00141         AllocData();
00142         CopyData( _data );
00143 }
00144 
00145 template <class T>
00146 IArray2D<T>::IArray2D( const ISize &_size, T **_data )
00147 {
00148         size = _size;
00149         AllocData();
00150         CopyData( _data );
00151 }
00152 
00153 template <class T>
00154 IArray2D<T>::IArray2D( IArray2D<T> *_m )
00155 {
00156         size = _m->size;
00157         AllocData();
00158         CopyData( _m->data );
00159 }
00160 
00161 template <class T>
00162 IArray2D<T>::~IArray2D()
00163 {
00164         FreeData();
00165 }
00166 
00167 template <class T>
00168 inline IArray2D<T> & IArray2D<T>::operator = ( const IArray2D<T> &_m )
00169 {
00170         if (size != _m.size) {
00171                 FreeData();
00172                 size = _m.size;
00173                 AllocData();
00174         }
00175         CopyData( _m.data );
00176                 
00177         return *this;
00178 }
00179 
00180 template <class T>
00181 void IArray2D<T>::AllocData()
00182 {
00183         data = new T * [size.width];
00184         int i;
00185         for( i=0; i<size.width; i++ )
00186                 data[i] = new T [size.height];
00187 }
00188 
00189 template <class T>
00190 void IArray2D<T>::FreeData()
00191 {
00192         if (data) {
00193                 for( int i=0; i<size.width; i++ ) 
00194                         delete [] data[i];
00195                 delete [] data;
00196         }
00197 }
00198 
00199 template <class T>
00200 bool IArray2D<T>::CopyData( T **_data )
00201 {
00202         if (_data) {
00203         
00204         int i;
00205                 for( i=0; i<size.width; i++ )
00206                         memcpy( data[i], _data[i], sizeof( T )*size.height );
00207 
00208         return true;
00209         }
00210         else
00211                 return false;
00212 }
00213 
00214 template <class T>
00215 inline void IArray2D<T>::SetValue( const IPoint &_p, T _value )
00216 {
00217         data[_p.x][_p.y] = _value;
00218 }
00219 
00220 template <class T>
00221 inline void IArray2D<T>::SetValue( int _x, int _y, T _value )
00222 {
00223         data[_x][_y] = _value;
00224 }
00225 
00226 template <class T>
00227 inline void IArray2D<T>::AddValue( const IPoint &_p, T _value )
00228 {
00229         data[_p.x][_p.y] += _value;
00230 }
00231 
00232 template <class T>
00233 inline void IArray2D<T>::AddValue( int _x, int _y, T _value )
00234 {
00235         data[_x][_y] += _value;
00236 }
00237 
00238 template <class T>
00239 IArray2D<T> * IArray2D<T>::Row( int _nrow )
00240 {
00241         if( nrow>=0 && nrow<size.width ) {
00242                 IArray2D<T> *row = new IArray2D<T>( ISize(size.width,1) );
00243                 for( int i=0; i<size.width; i++ )
00244                         (*row)(i,0) = data[i][_nrow];
00245                 return row;
00246         }
00247         else
00248                 return NULL;
00249 }
00250 
00251 template <class T>
00252 IArray2D<T> * IArray2D<T>::Column( int _ncolumn )
00253 {
00254         if( ncolumn>=0 && ncolumn<size.height ) {
00255                 IArray2D<T> *column = new IArray2D<T>( ISize(size.height,1) );
00256                 for( int j=0; j<size.height; j++ )
00257                         (*column)(j,0) = data[_ncolumn][j];
00258                 return column;
00259         }
00260         else
00261                 return NULL;
00262 }
00263 
00264 } // csfl namespace
00265 
00266 #endif // __CSFL_SYS_MATH_ARRAY2D_H__
00267 

 

CFD Project | Documents | Downloads | Contact us | Use Terms

 

© SINMEC/EMC/UFSC, 2001.

All rights reserved.

Last Update: Jan. 18, 2002

 Webmaster