00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #define ATTRIBUTE(type, name) private: type _##name; \
00014 public: void set##name(const type c) { \
00015 _##name = c; \
00016 } \
00017 public: type get##name() const { \
00018 return _##name; \
00019 }
00020
00021 #define DOCIMPL_ELEMENT_PUSH_IF_EQUAL(nam) if(strcmp(name, #nam) == 0) { \
00022 if(th->start_element_func.empty()) \
00023 th->start_element_func.push(nam##_element); \
00024 return; \
00025 }
00026
00027 #define DOCIMPL_ELEMENT_BEGIN() \
00028 void DocumentImpl::element ( xml_loader *th, const char *name, const char **atts ) {
00029
00030 #define DOCIMPL_ELEMENT_END() }
00031
00032 #define IGNORE_IF_NULL \
00033 if(*c == NULL) \
00034 continue;
00035
00036 #define TO_XML_ATTRIBUTE(name) \
00037 printf(" %s=\"%s\"",#name, to_string(ser.get##name ()));
00038
00039 #define TO_XML_SEQUENCE(name) \
00040 { \
00041 typeof(ser.name##s.begin()) it = ser.name##s.begin(); \
00042 typeof(ser.name##s.begin()) ite = ser.name##s.end(); \
00043 for(;it != ite;it++) \
00044 if(*it) \
00045 ::to_xml(**it); \
00046 }
00047
00048 #define TO_XML_SEQUENCER(name, ref) \
00049 { \
00050 typeof(ser.name##s.begin()) it = ser.name##s.begin(); \
00051 typeof(ser.name##s.begin()) ite = ser.name##s.end(); \
00052 for(;it != ite;it++) \
00053 if(*it) \
00054 ::to_xml(**it, #ref); \
00055 }
00056
00057 #define TO_XML_ELEMENT(name) \
00058 if(ser.name##s) \
00059 to_xml(*ser.name##s);
00060
00061 #define TO_XML_ELEMENTR(name, ref) \
00062 if(ser.name##s) \
00063 to_xml(*ser.name##s, #ref);
00064
00065 #define TO_XML_FUNC_BEGIN(name, ref) \
00066 void to_xml(const name& ser) { \
00067 const char* _element_name = #ref; \
00068 printf("<%s",_element_name);
00069
00070 #define TO_XML_FUNC_END() }
00071
00072 #define TO_XML_HAS_NO_ELEMENTS() printf("/>");
00073 #define TO_XML_HAS_ELEMENTS_BEGIN() printf(">");
00074 #define TO_XML_HAS_ELEMENTS_END() printf("</%s>", _element_name);
00075
00076 #define INIT_IF_MATCH(name) \
00077 else if(strcmp(*c, #name) == 0) \
00078 _##name = from_string<typeof(_##name)>(*(++c));
00079
00080 #define DOCIMPL_ELEMENTS_FUNC_BEGIN(nam) \
00081 void DocumentImpl::nam##_element ( xml_loader *th, const char *name, const char **atts ) { \
00082 nam* parent = (nam*)th->get_parent(); \
00083 if(parent != NULL) {
00084
00085 #define DOCIMPL_ELEMENTS_FUNC_END() \
00086 } else \
00087 th->push(instance<typeof(*parent)>(atts)); \
00088 }
00089
00090 #define DOCIMPL_ELEMENTS_SUBELEMENT(nam) \
00091 if(strcmp(name, #nam) == 0) { \
00092 nam* l = instance<nam>(atts); \
00093 parent->nam##s = l; \
00094 th->push(l, nam##_element); \
00095 return; \
00096 }
00097
00098 #define DOCIMPL_ELEMENTS_SUBELEMENTR(nam, ref) \
00099 if(strcmp(name, #nam) == 0) { \
00100 nam* l = instance<nam>(atts); \
00101 parent->nam##s = l; \
00102 th->push(l, ref##_element); \
00103 return; \
00104 }
00105
00106 #define DOCIMPL_ELEMENTS_SUBSEQUENCE(nam) \
00107 if(strcmp(name, #nam) == 0) { \
00108 nam* l = instance<nam>(atts); \
00109 parent->nam##s.push_back(l); \
00110 th->push(l, nam##_element); \
00111 return; \
00112 }
00113
00114 #define DOCIMPL_ELEMENTS_SUBSEQUENCER(nam, ref) \
00115 if(strcmp(name, #nam) == 0) { \
00116 nam* l = instance<nam>(atts); \
00117 printf("inserting new %s\n", #nam); \
00118 parent->nam##s.push_back(l); \
00119 th->push(l, ref##_element); \
00120 ref##_element(th, name, atts); \
00121 return; \
00122 }
00123
00124 #define APPLYXPATH_FUNC_BEGIN(nam) \
00125 void applyXPath(nam* obj, XPath::iterator xp, XPath::iterator ite, XPathResult& res) { \
00126 if(xp == ite) \
00127 return; \
00128 XPath::iterator xpp = xp; \
00129 xpp++;
00130
00131 #define APPLYXPATH_FUNC_END() } \
00132
00133 #define APPLYXPATH_ATTRIBUTE(nam) \
00134 if((xp->text == #nam || xp->text == "*") && xp->type == XP_ATTR) \
00135 res.push_back(&obj->_##nam);
00136
00137 #define APPLYXPATH_SEQUENCE(nam) \
00138 if((xp->text == #nam || xp->text == "*") && xp->type == XP_ELEMENT) { \
00139 typeof(obj->nam##s.begin()) i = obj->nam##s.begin(), ie = obj->nam##s.end();\
00140 if(xpp == ite) { \
00141 for(;i != ie;i++) \
00142 res.push_back(*i); \
00143 } \
00144 else { \
00145 for(;i != ie;i++) \
00146 ::applyXPath(*i ,xpp, ite, res); \
00147 } \
00148 if(xp->text == #nam && xp->type == XP_ELEMENT) \
00149 return; \
00150 }
00151
00152 #define APPLYXPATH_ELEMENT(nam) \
00153 if((xp->text == #nam || xp->text == "*") && xp->type == XP_ELEMENT) { \
00154 if(xpp == ite) \
00155 res.push_back(obj->nam##s); \
00156 else \
00157 applyXPath(obj->nam##s, xpp, ite, res); \
00158 if(xp->text == #nam && xp->type == XP_ELEMENT) \
00159 return; \
00160 }
00161
00162 #define DOCIMPL_APPLYXPATH_FUNC_BEGIN() \
00163 XPathResult DocumentImpl::applyXPath(XPath xp) { \
00164 XPathResult res; \
00165 if(root == NULL) \
00166 return res; \
00167 XPathEntry& top = *xp.begin(); \
00168 if(root_type != top.text && top.text != "*") \
00169 return res; \
00170 if(top.type != XP_ELEMENT) \
00171 return res; \
00172 if(xp.empty()) { \
00173 res.push_back(root); \
00174 return res; \
00175 }
00176
00177 #define DOCIMPL_APPLYXPATH_FUNC_END() \
00178 return res; \
00179 }
00180
00181 #define DOCIMPL_APPLYXPATH_MATCH(name) \
00182 if((top.text == #name || top.text == "*") && top.type == XP_ELEMENT) { \
00183 xpath_iterator<name> it(NULL, (name*)(root)); \
00184 it.getValueByPath(++xp.begin(), xp.end(), res); \
00185 }