synaps/base/maple.h

00001 /*********************************************************************
00002 *      This file is part of the source code of SYNAPS library.       *
00003 *   Author(s): B. Mourrain, GALAAD, INRIA                            *
00004 **********************************************************************
00005 History: $Id: maple.H,v 1.1 2005/07/11 09:32:55 mourrain Exp $
00006 **********************************************************************/
00007 #ifndef synaps_inout_maple_H_
00008 #define synaps_inout_maple_H_
00009 //--------------------------------------------------------------------
00010 #include <iostream>
00011 #include <complex>
00012 #include <synaps/init.h>
00013 //--------------------------------------------------------------------
00014 __BEGIN_NAMESPACE_SYNAPS
00015 //--------------------------------------------------------------------
00017 namespace maple
00018 {
00019   
00021   class ostream {
00022   public:
00023     ostream(std::ostream& os): chl(os) { };
00024     std::ostream & chl;
00025   };
00026 
00028   template<class OSTREAM, class X>
00029   OSTREAM& print(OSTREAM & os, const X & x) {os.chl<<x; return(os);}
00030 
00032   template<class OSTREAM, class C>
00033   OSTREAM & print(OSTREAM& os, const std::complex<C> & c) {
00034     print(os, c.real()); 
00035     if(c.imag() !=0) {
00036       os<<"+I* ";
00037       print(os,c.imag());
00038     }
00039     return(os);
00040   }
00041 
00042 }//namespace maple
00043 //----------------------------------------------------------------------
00044 namespace maple {
00045   namespace VECTOR 
00046   {
00047      template<class OSTREAM, class R>
00048      OSTREAM& print(OSTREAM& os, const R &V) 
00049      {
00050        os << "linalg[vector]([";
00051        maple::print(os,V[0]);
00052        for(unsigned int i = 1; i < V.size(); i++) {
00053         os<<","; maple::print(os,V[i]); 
00054        }
00055        os <<"])";
00056        return os;
00057      }
00058   } 
00059 } //namespace maple;
00060 //----------------------------------------------------------------------
00061 template<class C,class R> struct VectDse;
00062 //----------------------------------------------------------------------
00063 namespace maple 
00064 {
00066   template<class OSTREAM, class C,class R>
00067   OSTREAM& print (OSTREAM& os, const VectDse<C,R> &V) 
00068   { 
00069     return maple::VECTOR::print(os, V);
00070   }
00071 }
00072 //----------------------------------------------------------------------
00073 namespace maple 
00074 {
00075   namespace MATRIX 
00076   {  
00077     template <class OSTREAM, class R>
00078     inline OSTREAM & print(OSTREAM & os,const R & M) 
00079     {
00080       using namespace maple;
00081       typedef typename R::size_type  size_type;
00082       if(M.nbrow()) {
00083         os << "linalg[matrix](" << M.nbrow()<< "," << M.nbcol() << ", [";
00084         for(size_type i = 0; i < M.nbrow()-1; i++) {
00085           os << "[" ;
00086           for(size_type j = 0; j < M.nbcol()-1; j++)
00087             os << M(i, j) << ",";
00088           os << M(i, M.nbcol()-1) << "], ";
00089         }
00090         os << "[" ;
00091         for(size_type j = 0; j < M.nbcol()-1; j++) os<<M(M.nbrow()-1, j)<<',';
00092         os << M(M.nbrow()-1, M.nbcol()-1) << "] ])";
00093       }
00094       return os;
00095     }
00096   }
00097 } //namespace maple
00098 
00099 //----------------------------------------------------------------------
00100 template<class C, class R> struct MatrDse;
00101 //----------------------------------------------------------------------
00103 template<class C,class R>
00104 maple::ostream& operator<< (maple::ostream& os, const MatrDse<C,R> &M) {
00105   return maple::MATRIX::print(os,M);
00106 }
00107 //----------------------------------------------------------------------
00108 template<class R> struct MatrStr;
00109 //----------------------------------------------------------------------
00111 template<class R>
00112 maple::ostream& operator<< (maple::ostream& os, const MatrStr<R> &M) {
00113   return maple::MATRIX::print(os,M);
00114 }
00115 //----------------------------------------------------------------------
00116 template<class C,class R> struct MatrSps;
00117 //----------------------------------------------------------------------
00119 template<class C, class R>
00120 maple::ostream& operator<< (maple::ostream& os, const MatrSps<C,R> &M) {
00121   return maple::MATRIX::print(os,M);
00122 }
00123 //----------------------------------------------------------------------
00124 maple::ostream& operator<< (maple::ostream& os, std::ostream& s(std::ostream &)) 
00125 {
00126  maple::print(os,";"); maple::print(os,s); return os;
00127 }
00128 //----------------------------------------------------------------------
00129 template<class T>
00130 maple::ostream & operator<< (maple::ostream& os, T t)
00131 {
00132   using namespace maple;
00133   print(os,t); return(os);
00134 }
00135 //----------------------------------------------------------------------
00137 maple::ostream cmaple(std::cout);
00138 //----------------------------------------------------------------------
00139 __END_NAMESPACE_SYNAPS
00140 //----------------------------------------------------------------------
00141 #endif //synaps_inout_maple_H_

SYNAPS DOCUMENTATION
logo