1 #ifndef XML_TREE_INTERNAL__
2 #error "xml-tree-inc.hpp should not be included directly"
5 #ifndef XML_TREE_INC_HPP_
6 #define XML_TREE_INC_HPP_
10 inline uint32_t xml_tree::size() const
12 return tag_seq_len / 2;
15 inline uint32_t xml_tree::num_tags() const
17 return tag_names->size();
20 inline uint32_t xml_tree::subtree_size(xml_tree::node_t x) const
22 return bp_subtree_size(this->par, x);
26 xml_tree::subtree_tags(xml_tree::node_t x, xml_tree::tag_t label) const
28 xml_tree::node_t y = bp_find_close(this->par, x);
31 for(xml_tree::node_t i = x; i < y; i++)
32 count += (tag(i) == label);
35 return tags->rank(label, y) - tags->rank(label, x);
39 inline uint32_t xml_tree::subtree_elements(xml_tree::node_t x,
40 xml_tree::tag_t *atts) const
43 int32_t size = bp_subtree_size(par, x) - 1;
44 if (size <= 0) return 0;
45 size -= subtree_tags(x, xml_tree::PCDATA_OPEN_TAG_ID);
46 if (size < 3) return (uint32_t) size;
47 for(; *atts != xml_tree::NIL_TAG_ID; atts++)
48 size -= subtree_tags(x, *atts);
49 return (uint32_t) size;
53 inline bool xml_tree::is_leaf(xml_tree::node_t x) const
55 return !bp_inspect(this->par, x+1);
58 inline bool xml_tree::is_open(xml_tree::node_t x) const
60 return bp_inspect(this->par, x);
63 inline bool xml_tree::is_ancestor(xml_tree::node_t x,
64 xml_tree::node_t y) const
66 return bp_is_ancestor(this->par, x, y);
70 xml_tree::is_right_descendant(xml_tree::node_t x,
71 xml_tree::node_t y) const
75 && (y <= bp_parent_close(this->par, x))
76 && (y >= bp_find_close(this->par, x));
79 inline bool xml_tree::is_first_child(xml_tree::node_t x) const
81 return (x <= this->root()) || (bp_inspect(this->par, x - 1));
84 inline bool xml_tree::is_nil(xml_tree::node_t x) const
86 return (x == xml_tree::NIL);
89 inline xml_tree::tag_t xml_tree::tag(xml_tree::node_t x) const
91 if (bits_per_tag == 8)
92 return (xml_tree::tag_t) (((unsigned char*) tag_seq)[x]);
94 return get_field(tag_seq, bits_per_tag, x);
97 inline xml_tree::node_t xml_tree::root() const
99 return xml_tree::ROOT;
103 inline xml_tree::node_t xml_tree::parent(xml_tree::node_t x) const
105 return bp_parent(this->par, x);
108 inline xml_tree::node_t xml_tree::first_child(node_t x) const
110 xml_tree::node_t result = bp_first_child(this->par, x);
114 inline xml_tree::node_t xml_tree::last_child(xml_tree::node_t x) const
117 return xml_tree::NIL;
119 return bp_find_open(this->par, bp_find_close(this->par, x) - 1);
122 inline xml_tree::node_t xml_tree::next_sibling(xml_tree::node_t x) const
124 xml_tree::node_t result = bp_next_sibling(this->par, x);
128 inline xml_tree::node_t xml_tree::prev_sibling(xml_tree::node_t x) const
130 return bp_prev_sibling(this->par, x);
133 inline xml_tree::node_t xml_tree::first_element(xml_tree::node_t x) const
135 xml_tree::node_t n = first_child(x);
136 if (is_nil(n)) return xml_tree::NIL;
138 case xml_tree::ATTRIBUTE_OPEN_TAG_ID:
140 if (is_nil(n) || tag(n) != xml_tree::PCDATA_OPEN_TAG_ID) return n;
142 case PCDATA_OPEN_TAG_ID:
144 return bp_inspect(this->par, n) ? n : xml_tree::NIL;
150 inline xml_tree::node_t xml_tree::next_element(xml_tree::node_t x) const
153 if (is_nil(x)) return x;
154 if (tag(x) == xml_tree::PCDATA_OPEN_TAG_ID){
155 xml_tree::node_t y = x + 2;
156 return bp_inspect(this->par, y) ? y : xml_tree::NIL;
161 inline xml_tree::node_t xml_tree::tagged_next(node_t x, tag_t tag) const
163 return this->tags->select_next(tag, x);
166 inline xml_tree::node_t
167 xml_tree::tagged_descendant(xml_tree::node_t x,
168 xml_tree::tag_t tag) const
170 xml_tree::node_t y = tagged_next(x, tag);
171 return is_nil(y) || !is_ancestor(x, y) ? xml_tree::NIL : y;
174 inline xml_tree::node_t
175 xml_tree::tagged_following_before(xml_tree::node_t x,
177 xml_tree::node_t limit) const
179 xml_tree::node_t close = bp_find_close(this->par, x);
180 xml_tree::node_t s = tagged_next(close, tag);
181 return (s < limit) ? s : xml_tree::NIL;
185 inline xml_tree::node_t xml_tree::tagged_child(xml_tree::node_t x,
186 xml_tree::tag_t t) const
188 xml_tree::node_t c = first_child(x);
189 xml_tree::node_t result;
190 if (is_nil(c) || tag(c) == t)
193 return tagged_sibling(c, t);
196 inline xml_tree::node_t xml_tree::tagged_sibling(xml_tree::node_t x,
197 xml_tree::tag_t t) const
199 xml_tree::node_t sibling = next_sibling(x);
200 xml_tree::tag_t stag;
201 while (sibling != xml_tree::NIL) {
205 sibling = next_sibling(sibling);
210 xml_tree::node_t xml_tree::closing(xml_tree::node_t x) const
212 return bp_find_close(this->par, x);
216 inline SXSI::TextCollection *xml_tree::get_text_collection() const
218 return text_collection;
221 inline xml_tree::node_t xml_tree::parent_node(int32_t d) const
223 xml_tree::node_t res = text_positions->select1(d+1);
224 return (xml_tree::node_t) res;
227 inline SXSI::TextCollection::document_result
228 xml_tree::prefix(uchar const *s) const
230 return text_collection->Prefix(s);
233 inline SXSI::TextCollection::document_result
234 xml_tree::suffix(uchar const *s) const
236 return text_collection->Suffix(s);
239 inline SXSI::TextCollection::document_result
240 xml_tree::equals(uchar const *s) const
242 return text_collection->Equal(s);
245 inline SXSI::TextCollection::document_result
246 xml_tree::contains(uchar const *s) const
248 return text_collection->Contains(s);
251 inline SXSI::TextCollection::document_result
252 xml_tree::less_than(uchar const *s) const
254 return text_collection->LessThan(s);
258 #endif //XML_TREE_INC_HPP_