synaps/linalg/lisp.h

00001 ********************************************************************
00002 *      This file is part of the source code of SYNAPS library.       *
00003 *   Author(s): B. Mourrain, GALAAD, INRIA                            *
00004 **********************************************************************
00005 History: 
00006 **********************************************************************/
00007 #ifndef synaps_linalg_lisp_H
00008 #define synaps_linalg_lisp_H
00009 //--------------------------------------------------------------------
00010 #include <synaps/init.h>
00011 #include <synaps/base/lisp.h>
00012 //--------------------------------------------------------------------
00013 __BEGIN_NAMESPACE_SYNAPS
00014 //----------------------------------------------------------------------
00015 template<class C, class R> struct VectDse;
00016 template<class C, class R> struct MatrDse;
00017 template<class R> struct MatrStr;
00018 template<class C, class R> struct MatrSps;
00019 //--------------------------------------------------------------------
00020 namespace lisp 
00021 {
00022   //--------------------------------------------------------------------
00023   template<class OSTREAM, class X>
00024     OSTREAM& print_lisp(OSTREAM& os, const X& x) 
00025   { 
00026     os<<x; return os; 
00027   }
00028   
00029   //--------------------------------------------------------------------
00030   namespace VECTOR 
00031   {
00032     template<class OSTREAM, class R>
00033       OSTREAM& lisp(OSTREAM& os, const R &V) 
00034     {
00035       os<<"([]";
00036       for(typename R::size_type i = 0; i < V.size(); i++) {
00037         os<<" ";
00038         print_lisp(os,V[i]); 
00039       }
00040       os<<")";
00041       return os;
00042     }
00043   } 
00044   //----------------------------------------------------------------------
00046   template<class OSTREAM, class C,class R>
00047       OSTREAM& print_lisp (OSTREAM& os, const VectDse<C,R> &V) 
00048     { 
00049       return VECTOR::lisp(os, V);
00050     }
00051   //----------------------------------------------------------------------
00052   namespace MATRIX 
00053   {  
00054     template <class OSTREAM, class R>
00055       inline OSTREAM & lisp(OSTREAM & os,const R & M) 
00056     {
00057       typedef typename R::size_type  size_type;
00058       if(M.nbrow()) {
00059         os<<"([] ";
00060         for(size_type i = 0; i < M.nbrow(); i++) {
00061           os << " ([]";
00062           for(size_type j = 0; j < M.nbcol(); j++)
00063             {
00064               os<<" ";
00065               print_lisp(os,M(i, j)); 
00066             }
00067           os<<")";
00068         }
00069         os<<")";
00070       }
00071       return os;
00072     }
00073   }
00074   //----------------------------------------------------------------------
00076   template<class OSTREAM, class C,class R>
00077   OSTREAM& print_lisp(OSTREAM& os, const MatrDse<C,R> &M) 
00078   {
00079     return MATRIX::lisp(os,M);
00080   }
00081   
00083   template<class OSTREAM, class R>
00084   OSTREAM& print_lisp(OSTREAM& os, const MatrStr<R> &M) 
00085   {
00086     return MATRIX::lisp(os,M);
00087   }
00089   template<class OSTREAM, class C, class R>
00090   OSTREAM& print_lisp(OSTREAM& os, const MatrSps<C,R> &M) 
00091   {
00092     return MATRIX::lisp(os,M);
00093   }
00094 }
00095 //----------------------------------------------------------------------
00096 __END_NAMESPACE_SYNAPS
00097 //----------------------------------------------------------------------
00098 #endif //synaps_base_lisp_H

SYNAPS DOCUMENTATION
logo