synaps/linalg/sym2d.h

00001 /*********************************************************************
00002 *      This file is part of the source code of SYNAPS kernel.        *
00003 *   Author(s): B. Mourrain, GALAAD, INRIA                            *
00004 **********************************************************************
00005 $Id: sym2d.h,v 1.1 2005/07/11 08:33:37 mourrain Exp $
00006 **********************************************************************/
00007 
00008 #ifndef SYNAPS_LINALG_SYM2D_H
00009 #define SYNAPS_LINALG_SYM2D_H
00010 //======================================================================
00011 #include <synaps/init.h>
00012 #include <synaps/arithm/Norm.h>
00013 #include <synaps/linalg/MethodName.h>
00014 #include <synaps/base/stride_iterator.h>
00015 #include <synaps/linalg/rep1d.h>
00016 
00017 
00018 __BEGIN_NAMESPACE_SYNAPS
00019 
00020 //======================================================================
00021 namespace linalg {  
00022 
00023 //----------------------------------------------------------------------
00024   typedef unsigned size_type;
00025   unsigned sym2dsz(unsigned i, unsigned j)
00026   { 
00027     unsigned m = std::max(i,j);
00028     return ( (m*(m+1))/2 );
00029   }
00030 
00031 
00032   unsigned sym2dcf(unsigned i, unsigned j)
00033   { 
00034 
00035     return (i<j ? i + (j*(j+1))/2 : j + (i*(i+1))/2 );
00036   }   
00037  
00038   //----------------------------------------------------------------------
00044   template <class C>
00045   struct sym2d : public linalg::rep1d<C> {
00046     
00047     typedef C*                              col_iterator;
00048     typedef stride_iterator<C,C*,size_type> row_iterator;
00049     typedef sym2d<C>                        self_t;
00050     
00051     size_type nbrow_, nbcol_;
00052     
00053     sym2d(): linalg::rep1d<C>(){}
00054     sym2d(const self_t & v): 
00055       linalg::rep1d<C>(v), nbrow_(v.nbrow_), nbcol_(v.nbcol_) {}
00056     sym2d(size_type i,size_type j): 
00057       linalg::rep1d<C>(sym2dsz(i,j)), nbrow_(i),nbcol_(j) {}
00058     sym2d(size_type i, size_type j, C* t): 
00059       linalg::rep1d<C>(sym2dsz(i,j),t), nbrow_(i), nbcol_(j) {}
00060     sym2d(size_type i, size_type j, C* t, char c);
00061     sym2d(const char * nm);
00062 
00063     sym2d<C> & operator=(const sym2d<C> & v)
00064       {
00065         this->linalg::rep1d<C>::operator=(v); 
00066         nbrow_ = v.nbrow(); nbcol_ = v.nbcol(); 
00067         return *this;
00068       }
00069 
00070     C &       operator()(size_type i, size_type j) 
00071       {return this->tab_[sym2dcf(i,j)];}
00072     const C & operator()(size_type i, size_type j) const 
00073       {return this->tab_[sym2dcf(i,j)];}
00074   
00075     size_type nbrow() const {return nbrow_;}
00076     size_type nbcol() const {return nbcol_;}
00077 
00078 
00079     self_t resize(size_type i,size_type j)
00080       {
00081         nbrow_=i; nbcol_=j; 
00082         this->linalg::rep1d<C>::resize(sym2dsz(i,j)); 
00083         return *this;
00084       }
00085     
00086   };
00087 }
00088 
00089 __END_NAMESPACE_SYNAPS
00090 
00091 //----------------------------------------------------------------------
00092 //#include "synaps/linalg/sym2d.C"
00093 //----------------------------------------------------------------------
00094 
00095 #endif // SYNAPS_LINALG_SYM2D_H
00096 

SYNAPS DOCUMENTATION
logo