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