X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=xml-tree.cpp;h=8c0386e4497ef57a577f392be272972ab32e32db;hb=9b8afc78da8be3f210cf204b732d4c84ca5080d5;hp=df7efe234fbacc745639e34e22bcecd48a6e3f47;hpb=115c103a05a3143ccea9e6a725fc6ee3fa206061;p=SXSI%2FXMLTree.git diff --git a/xml-tree.cpp b/xml-tree.cpp index df7efe2..8c0386e 100644 --- a/xml-tree.cpp +++ b/xml-tree.cpp @@ -42,7 +42,13 @@ static int bits8 (int t ) { } - +static bool array_mem(xml_tree::tag_t *a, xml_tree::tag_t t) +{ + for(; *a != xml_tree::NIL_TAG_ID; a++){ + if (*a >= t) return (*a == t); + }; + return false; +} static void ufread(void *ptr, size_t size, size_t nmemb, FILE *stream) { @@ -162,52 +168,48 @@ uint32_t xml_tree::postorder(xml_tree::node_t x) const } xml_tree::node_t -xml_tree::select_child(xml_tree::node_t x, - std::unordered_set *tags) const +xml_tree::select_child(xml_tree::node_t x, xml_tree::tag_t *tags) const { if (is_nil(x) || is_leaf(x)) return xml_tree::NIL; xml_tree::node_t child = first_child(x); - if (tags->find(tag(child)) != tags->end()) return child; + if (array_mem(tags, tag(child))) return child; return select_sibling(child, tags); } xml_tree::node_t -xml_tree::select_descendant(xml_tree::node_t x, - std::unordered_set *tags) const +xml_tree::select_descendant(xml_tree::node_t x, xml_tree::tag_t *tags) const { if (is_leaf(x)) return xml_tree::NIL; auto min = xml_tree::NIL; auto aux = xml_tree::NIL; - for(auto tag = tags->begin(); tag != tags->end(); ++ tag){ - aux = tagged_descendant(x, *tag); + for(; *tags != xml_tree::NIL_TAG_ID; ++tags){ + aux = tagged_descendant(x, *tags); if ((unsigned int) aux < (unsigned int) min) min = aux; }; return min; } xml_tree::node_t -xml_tree::select_sibling(xml_tree::node_t x, - std::unordered_set *tags) const +xml_tree::select_sibling(xml_tree::node_t x, xml_tree::tag_t *tags) const { xml_tree::node_t sibling = next_sibling(x); xml_tree::tag_t t; while(!is_nil(sibling)) { t = tag(sibling); - if (tags->find(t) != tags->end()) return sibling; + if (array_mem(tags, t)) return sibling; sibling = next_sibling(sibling); }; return sibling; } xml_tree::node_t -xml_tree::select_following_before(xml_tree::node_t x, - std::unordered_set *tags, +xml_tree::select_following_before(xml_tree::node_t x, xml_tree::tag_t *tags, xml_tree::node_t limit) const { auto min = xml_tree::NIL; auto aux = xml_tree::NIL; - for(auto tag = tags->begin(); tag != tags->end(); ++tag){ - aux = tagged_following_before(x, *tag, limit); + for(; *tags != xml_tree::NIL_TAG_ID; ++tags){ + aux = tagged_following_before(x, *tags, limit); if ((unsigned int) aux < (unsigned int) min) min = aux; } return min;