int32_t size = bp_subtree_size(par, x) - 1;
if (size <= 0) return 0;
- size -= subtree_tags(x, xml_tree::PCDATA_OPEN_TAG_ID);
- size -= subtree_tags(x, xml_tree::ATTRIBUTE_OPEN_TAG_ID);
- size -= subtree_tags(x, xml_tree::ATTRIBUTE_DATA_OPEN_TAG_ID);
- if (size < 3) return (uint32_t) size;
- std::unordered_set<xml_tree::tag_t>::iterator it;
- for(it = this->attribute_ids->begin();
- it != this->attribute_ids->end();
- ++it)
- size -= subtree_tags(x, *it);
+ uint32_t num_texts = subtree_tags(x, xml_tree::PCDATA_OPEN_TAG_ID);
+ uint32_t num_atts = subtree_tags(x, xml_tree::ATTRIBUTE_OPEN_TAG_ID);
+ uint32_t num_att_data = subtree_tags(x, xml_tree::ATTRIBUTE_DATA_OPEN_TAG_ID);
+ size -= num_texts;
+ size -= num_atts;
+ size -= 2*num_att_data;
return (uint32_t) size;
}
/**
* [subtree_elements(n)] returns the number of element nodes below [n]
- * Runs in O(attribute_ids->size()+3)
+ * Runs in O(1)
*/
inline uint32_t subtree_elements(node_t) const;