synaps/base/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_base_lisp_H
00008 #define synaps_base_lisp_H
00009 //--------------------------------------------------------------------
00010 #include <iostream>
00011 #include <synaps/init.h>
00012 //--------------------------------------------------------------------
00013 namespace std {template<class C> class complex;}
00014 //--------------------------------------------------------------------
00015 __BEGIN_NAMESPACE_SYNAPS
00016 //--------------------------------------------------------------------
00018 namespace lisp
00019 {
00021   class ostream {
00022   public:
00023     ostream(std::ostream& os): chl(os) { };
00024     std::ostream & chl;
00025 
00026   };
00027 }
00028 //   template<class OSTREAM, class X>
00029 //   OSTREAM& print_lisp(OSTREAM & os, X x) {os.chl<<x; return(os);}
00030 template<class OSTREAM, class C>
00031 OSTREAM & print_lisp(OSTREAM& os, const std::complex<C> & c) {
00032   os << "(+ ";
00033   print_lisp(os, c.real()); 
00034   if(c.imag() !=0) {
00035     os<<" (* ";
00036     print_lisp(os,c.imag());
00037     os<<" i)";
00038   }
00039   os <<")";
00040   return(os);
00041 }
00042 
00043 namespace lisp {
00044 // using std::endl;
00046 //   lisp::ostream & operator<< (lisp::ostream& os, T t)
00047 //   {
00048 //     print_lisp(os,t); return(os);
00049 //   }
00050   inline ostream& operator <<(ostream& os, std::ostream& x(std::ostream &))
00051   {
00052     os.chl<<x; return os; 
00053   }
00054 
00055   template<class X>
00056   ostream& operator <<(ostream& os, const X& x) 
00057   { 
00058     print_lisp(os.chl,x); return os; 
00059   }
00060 }
00061 //--------------------------------------------------------------------
00062 
00063 template<class OSTREAM, class X>
00064 OSTREAM& print_lisp(OSTREAM& os, const X& x) 
00065 { 
00066   os<<x; return os; 
00067 }
00068 
00069 //----------------------------------------------------------------------
00070 namespace UPOLDAR 
00071 {
00072   template<class OSTREAM, class POL> 
00073   OSTREAM& lisp(OSTREAM& os, const POL&  P) 
00074   {
00075     print_lisp(os,"(+");
00076     int i, len= degree(P);
00077     for (i=len; i>=0; i--) {
00078       print_lisp(os," (* ");
00079       print_lisp(os,P[i]);
00080       print_lisp(os," (^ x ");
00081       print_lisp(os,i);
00082       print_lisp(os,"))");
00083     }
00084     print_lisp(os,")");
00085     return os;
00086   }
00087 }
00088 //----------------------------------------------------------------------
00089 template<class C,class R> struct UPolDse;
00090 //----------------------------------------------------------------------
00092 template<class OSTREAM, class C, class R>
00093 OSTREAM& print_lisp(OSTREAM& os, const UPolDse<C,R>& p) 
00094 {
00095   return UPOLDAR::lisp(os,p.rep());
00096 }
00097 //----------------------------------------------------------------------
00098 __END_NAMESPACE_SYNAPS
00099 //----------------------------------------------------------------------
00100 #endif //synaps_base_lisp_H

SYNAPS DOCUMENTATION
logo