00001 #include <country.h>
00002
00003 namespace country{
00004 DOCIMPL_APPLYXPATH_FUNC_BEGIN()
00005 DOCIMPL_APPLYXPATH_MATCH(Country)
00006 DOCIMPL_APPLYXPATH_FUNC_END()
00007
00008 DOCIMPL_ELEMENT_BEGIN()
00009 DOCIMPL_ELEMENT_PUSH_IF_EQUAL(Country)
00010 DOCIMPL_ELEMENT_END()
00011
00012 DOCIMPL_ELEMENTS_FUNC_BEGIN(Country)
00013 DOCIMPL_ELEMENTS_SUBSEQUENCER(nm, string)
00014 DOCIMPL_ELEMENTS_SUBSEQUENCER(population, decimal)
00015 DOCIMPL_ELEMENTS_FUNC_END()
00016
00017 }
00018 APPLYXPATH_FUNC_BEGIN(country::Country)
00019 APPLYXPATH_SEQUENCE(nm)
00020 APPLYXPATH_SEQUENCE(population)
00021 APPLYXPATH_FUNC_END()
00022
00023
00024
00025 TO_XML_FUNC_BEGIN(country::Country,Country)
00026 TO_XML_HAS_ELEMENTS_BEGIN()
00027 TO_XML_SEQUENCER(nm,nm)
00028 TO_XML_SEQUENCER(population,population)
00029 TO_XML_HAS_ELEMENTS_END()
00030 TO_XML_FUNC_END()
00031
00032
00033
00034 void xpath_iterator<country::Country>::ApplyByPath(XPath::const_iterator xp, XPath::const_iterator xe, xpath_iterator_functor& f) {
00035 if(value == NULL)
00036 return;
00037 if(xp == xe) {
00038 f.apply(*this);
00039 return;
00040 }
00041 if(xp->type == XP_ELEMENT) {
00042 XPath::const_iterator xpp = xp;
00043 if(xpp != xe)
00044 xpp++;
00045 else
00046 return;
00047 if(xp->text == "nm" || xp->text == "*") {
00048 typeof(value->nms.begin()) i = value->nms.begin(), ie = value->nms.end();
00049 if(xpp != xe) {
00050 xpath_iterator<country::nm> it(this, NULL);
00051 for(;i != ie;i++) {
00052 it.setValue(*i);
00053 it.ApplyByPath(xpp, xe, f);
00054 }
00055 } else {
00056 xpath_iterator<country::nm> it(this, NULL);
00057 for(;i != ie;i++){
00058 it.setValue(*i);
00059 f.apply(it);
00060 }
00061 }
00062 }
00063 if(xp->text == "population" || xp->text == "*") {
00064 typeof(value->populations.begin()) i = value->populations.begin(), ie = value->populations.end();
00065 if(xpp != xe) {
00066 xpath_iterator<country::population> it(this, NULL);
00067 for(;i != ie;i++) {
00068 it.setValue(*i);
00069 it.ApplyByPath(xpp, xe, f);
00070 }
00071 } else {
00072 xpath_iterator<country::population> it(this, NULL);
00073 for(;i != ie;i++){
00074 it.setValue(*i);
00075 f.apply(it);
00076 }
00077 }
00078 }
00079 if(xp->text == ".." && parent != NULL)
00080 parent->ApplyByPath(xpp, xe, f);
00081 }
00082 }
00083
00084 void xpath_iterator<country::Country>::getValueByPath(XPath::const_iterator xp, XPath::const_iterator xe, XPathResult& res) {
00085 if(value == NULL)
00086 return;
00087 if(xp == xe) {
00088 res.push_back(value);
00089 return;
00090 }
00091 if(xp->type == XP_ELEMENT) {
00092 XPath::const_iterator xpp = xp;
00093 if(xpp != xe)
00094 xpp++;
00095 else
00096 return;
00097 if(xp->text == "nm" || xp->text == "*") {
00098 typeof(value->nms.begin()) i = value->nms.begin(), ie = value->nms.end();
00099 if(xpp != xe) {
00100 xpath_iterator<country::nm> it(this, NULL);
00101 for(;i != ie;i++) {
00102 it.setValue(*i);
00103 it.getValueByPath(xpp, xe, res);
00104 }
00105 } else {
00106 for(;i != ie;i++)
00107 res.push_back(*i);
00108 }
00109 }
00110 if(xp->text == "population" || xp->text == "*") {
00111 typeof(value->populations.begin()) i = value->populations.begin(), ie = value->populations.end();
00112 if(xpp != xe) {
00113 xpath_iterator<country::population> it(this, NULL);
00114 for(;i != ie;i++) {
00115 it.setValue(*i);
00116 it.getValueByPath(xpp, xe, res);
00117 }
00118 } else {
00119 for(;i != ie;i++)
00120 res.push_back(*i);
00121 }
00122 }
00123 if(xp->text == ".." && parent != NULL)
00124 parent->getValueByPath(xpp, xe, res);
00125 }
00126 }
00127
00128 bool xpath_iterator<country::Country>::checkPathCondition(XPath::const_iterator xp, XPath::const_iterator xe) {
00129 if(value == NULL)
00130 return false;
00131 if(xp == xe)
00132 return true;
00133 if(xp->type == XP_ELEMENT) {
00134 XPath::const_iterator xpp = xp;
00135 if(xpp != xe)
00136 xpp++;
00137 else
00138 return false;
00139 if(xp->text == "nm" || xp->text == "*") {
00140 typeof(value->nms.begin()) i = value->nms.begin(), ie = value->nms.end();
00141 if(xpp != xe) {
00142 xpath_iterator<country::nm> it(this, NULL);
00143 for(;i != ie;i++) {
00144 it.setValue(*i);
00145 if(it.checkPathCondition(xpp, xe))
00146 return true;
00147 }
00148 } else
00149 return !(i == ie);
00150 }
00151 if(xp->text == "population" || xp->text == "*") {
00152 typeof(value->populations.begin()) i = value->populations.begin(), ie = value->populations.end();
00153 if(xpp != xe) {
00154 xpath_iterator<country::population> it(this, NULL);
00155 for(;i != ie;i++) {
00156 it.setValue(*i);
00157 if(it.checkPathCondition(xpp, xe))
00158 return true;
00159 }
00160 } else
00161 return !(i == ie);
00162 }
00163 if(xp->text == ".." && parent != NULL)
00164 return parent->checkPathCondition(xpp, xe);
00165 return false;
00166 }
00167 return false;
00168 }
00169
00170 void xpath_iterator<country::Country>::to_xml(std::ostream& out) {
00171 if(value)
00172 ::to_xml(*value, NULL, out);
00173 }
00174