// This may look like C code, but it is really -*- C++ -*- // C.Magneville 04/99 #ifndef TMATRIX_SEEN #define TMATRIX_SEEN #include "machdefs.h" #include #include #include "ppersist.h" #include "anydataobj.h" #include "ndatablock.h" namespace PlanckDPC { template class TMatrix : public AnyDataObj { public: // Creation / destruction TMatrix(); TMatrix(uint_4 r,uint_4 c); TMatrix(uint_4 r,uint_4 c,T* values,Bridge* br=NULL); TMatrix(const TMatrix& a); TMatrix(const TMatrix& a,bool share); virtual ~TMatrix(); // Temporaire? inline bool IsTemp(void) const {return mNDBlock.IsTemp();} inline void SetTemp(bool temp=false) const {mNDBlock.SetTemp(temp);} // Gestion taille/Remplissage void Clone(const TMatrix& a); void Reset(T v=0); void Realloc(uint_4 r,uint_4 c,bool force_alloc=true); // Informations pointeur/data inline int NRows() const {return mNr;} inline int NCol() const {return mNc;} T const& operator()(uint_4 r,uint_4 c) const {return *(mNDBlock.Begin()+r*mNc+c);} T& operator()(uint_4 r,uint_4 c) {return *(mNDBlock.Begin()+r*mNc+c);} inline T* Data() {return mNDBlock.Begin();} inline const T* Data() const {return mNDBlock.Begin();} inline NDataBlock& DataBlock() {return mNDBlock;} inline const NDataBlock& DataBlock() const {return mNDBlock;} // Operateur d'affectation TMatrix& operator = (T x); TMatrix& operator = (const TMatrix& a); // Impression void Print(ostream& os,int lp=0,uint_4 i0=0,uint_4 ni=10,uint_4 j0=0,uint_4 nj=10) const; inline void Print(int lp=0,uint_4 i0=0,uint_4 ni=10,uint_4 j0=0,uint_4 nj=10) const {Print(cout,lp,i0,ni,j0,nj);} // Surcharge d'operateurs INPLACE TMatrix& operator += (T b); TMatrix& operator -= (T b); TMatrix& operator *= (T b); TMatrix& operator /= (T b); TMatrix& operator += (const TMatrix& a); TMatrix& operator -= (const TMatrix& a); TMatrix& operator *= (const TMatrix& a); // Pour surcharge d'operateurs TMatrix Add(const TMatrix& b) const; TMatrix Sub(const TMatrix& b) const; TMatrix Mul(const TMatrix& b) const; protected: uint_4 mNr,mNc; NDataBlock mNDBlock; }; ///////////////////////////////////////////////////////////////////////// template inline ostream& operator << (ostream& os, const TMatrix& a) {a.Print(os); return(os);} ///////////////////////////////////////////////////////////////////////// template inline TMatrix operator + (const TMatrix& a, double b) { TMatrix result(a,false); result.DataBlock().SetTemp(true); result += b; return result; } template inline TMatrix operator + (double b,const TMatrix& a) { TMatrix result(a,false); result.DataBlock().SetTemp(true); result += b; return result; } template inline TMatrix operator - (const TMatrix& a, double b) { TMatrix result(a,false); result.DataBlock().SetTemp(true); result -= b; return result; } template inline TMatrix operator - (double b,const TMatrix& a) { TMatrix result(a,false); result.DataBlock().SetTemp(true); result.DataBlock() = b - result.DataBlock(); return result; } template inline TMatrix operator * (const TMatrix& a, double b) { TMatrix result(a,false); result.DataBlock().SetTemp(true); result *= b; return result; } template inline TMatrix operator * (double b,const TMatrix& a) { TMatrix result(a,false); result.DataBlock().SetTemp(true); result *= b; return result; } template inline TMatrix operator / (const TMatrix& a, double b) { TMatrix result(a,false); result.DataBlock().SetTemp(true); result /= b; return result; } ///////////////////////////////////////////////////////////////////////// template inline TMatrix operator + (const TMatrix& a,const TMatrix& b) {return a.Add(b);} template inline TMatrix operator - (const TMatrix& a,const TMatrix& b) {return a.Sub(b);} template inline TMatrix operator * (const TMatrix& a,const TMatrix& b) {return a.Mul(b);} ///////////////////////////////////////////////////////////////////////// // Classe pour la gestion de persistance template class FIO_TMatrix : public PPersist { public: FIO_TMatrix(); FIO_TMatrix(string const & filename); FIO_TMatrix(const TMatrix & obj); FIO_TMatrix(TMatrix * obj); virtual ~FIO_TMatrix(); virtual AnyDataObj* DataObj(); inline operator TMatrix() { return(*dobj); } protected : virtual void ReadSelf(PInPersist&); virtual void WriteSelf(POutPersist&) const; TMatrix * dobj; bool ownobj; }; } // Fin du namespace #endif