src/xml_defines.h

См. документацию.
00001 //
00002 // C++ Interface: xml_defines
00003 //
00004 // Description: 
00005 //
00006 //
00007 // Author: yessss <gennadiyesss@mail.ru>, (C) 2007
00008 //
00009 // Copyright: See COPYING file that comes with this distribution
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      }

Документация по XDataServer. Последние изменения: Thu Jul 12 11:49:42 2007. Создано системой  doxygen 1.5.2