00001
00002
00003
00004
00005 #ifndef realroot_xml_hpp_
00006 #define realroot_xml_hpp_
00007 #include <string.h>
00008 #include <string>
00009
00010 namespace mmx {
00011
00012
00014 namespace xml {
00017 template<class ISTREAM>
00018 bool skip(ISTREAM& is, const char* s)
00019 {
00020 char c=(*s); const char* t=s;
00021 unsigned n= strlen(s),i=0;
00022 while(c != EOF)
00023 {
00024 for(i=0; i<n && (c !=EOF) && (c=is.get()) == (*t); i++,t++);
00025 if(i==n)
00026 return true;
00027 else
00028 t=s;
00029 }
00030 return false;
00031 }
00032
00033 template<class OSTREAM, typename X>
00034 OSTREAM& print(OSTREAM& os, const X& x, const char *tag)
00035 {
00036 os<<"<"<<tag<<">"<<x<<"</"<<tag<<">";
00037 return os;
00038 }
00039
00040
00041 #define begin_polynomial "<polynomial>"
00042 #define end_polynomial "</polynomial>"
00043
00044
00046 template<class ISTREAM>
00047 std::string read_tag(ISTREAM& is, const char* tag)
00048 {
00049 if(skip(is,tag))
00050 {
00051 std::string s; char c;
00052 while((c=is.get()) != EOF && c != '<')
00053 {
00054 if(c != '\n') s+=c;
00055 }
00056
00057 return s;
00058 }
00059 else
00060 {
00061 return std::string("");
00062 }
00063 }
00065 template<class ISTREAM, typename T>
00066 bool read_pol(ISTREAM& is, T& p)
00067 {
00068 if(skip(is,begin_polynomial))
00069 {
00070 ::std::string s; char c;
00071 while((c=is.get()) != EOF && c != '<')
00072 {
00073 if(c != ' ' && c != '\n') s+=c;
00074 }
00075 s+='\0';
00076
00077 p = T(s.data());
00078 return true;
00079 }
00080 else
00081 {
00082 p=T(0); return false;
00083 }
00084 }
00085
00087 template<class ISTREAM, typename T, class VAR>
00088 bool read_pol(ISTREAM& is, T& p, const VAR& V)
00089 {
00090 if(skip(is,begin_polynomial))
00091 {
00092 std::string s; char c;
00093 while((c=is.get()) != EOF && c != '<')
00094 {
00095 if(c != ' ' && c != '\n') s+=c;
00096 }
00097 s+='\0';
00098 p = T(s.data(),V);
00099 return true;
00100 }
00101 else
00102 {
00103 p=T(0); return false;
00104 }
00105 }
00106 }
00107
00108
00109 template<typename C,typename R> struct upoldse;
00110
00111 namespace xml
00112 {
00113
00114
00116 template<class ISTREAM, typename T>
00117 bool read_upol(ISTREAM& is, T& p)
00118 {
00119 if(skip(is,begin_polynomial))
00120 {
00121 std::string s; char c;
00122 while((c=is.get()) != EOF && c != '<')
00123 {
00124 if(c != ' ' && c != '\n') s+=c;
00125 }
00126 s+='\0';
00127 p = T(s.data());
00128 return true;
00129 }
00130 else
00131 {
00132 p=T(0); return false;
00133 }
00134 }
00135
00137 template<class ISTREAM, typename C,typename R>
00138 bool read(ISTREAM& is, upoldse<C,R>& p)
00139 {
00140 return read_upol(is,p);
00141 }
00142
00144 template<class OSTREAM, typename C,typename R>
00145 OSTREAM& print(OSTREAM& os, const upoldse<C,R>& p)
00146 {
00147 xml::print(os,p,"polynomial");
00148 return os;
00149 }
00150
00151 }
00152
00153 }
00154
00155 #endif //realroot_xml_hpp_