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 |
|