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_
8 inline uint32_t xml_tree::size() const
10 return tag_seq_len / 2;
13 inline uint32_t xml_tree::num_tags() const
15 return tag_names->size();
18 inline uint32_t xml_tree::subtree_size(xml_tree::node_t x) const
20 return bp_subtree_size(this->par, x);
24 xml_tree::subtree_tags(xml_tree::node_t x, xml_tree::tag_t label) const
26 xml_tree::node_t y = bp_find_close(this->par, x);
29 for(xml_tree::node_t i = x; i < y; i++)
30 count += (tag(i) == label);
33 return tags->rank(label, y) - tags->rank(label, x);
37 inline bool xml_tree::is_leaf(xml_tree::node_t x) const
39 return !bp_inspect(this->par, x+1);
42 inline bool xml_tree::is_ancestor(xml_tree::node_t x,
43 xml_tree::node_t y) const
45 return bp_is_ancestor(this->par, x, y);
49 xml_tree::is_right_descendant(xml_tree::node_t x,
50 xml_tree::node_t y) const
54 && (y <= bp_parent_close(this->par, x))
55 && (y >= bp_find_close(this->par, x));
58 inline bool xml_tree::is_first_child(xml_tree::node_t x) const
60 return (x <= this->root()) || (bp_inspect(this->par, x - 1));
63 inline bool xml_tree::is_nil(xml_tree::node_t x) const
65 return (x == xml_tree::NIL);
68 inline xml_tree::tag_t xml_tree::tag(xml_tree::node_t x) const
70 if (bits_per_tag == 8)
71 return (xml_tree::tag_t) (((unsigned char*) tag_seq)[x]);
73 return get_field(tag_seq, bits_per_tag, x);
76 inline xml_tree::node_t xml_tree::root() const
78 return xml_tree::ROOT;
82 inline xml_tree::node_t xml_tree::parent(xml_tree::node_t x) const
84 return bp_parent(this->par, x);
87 inline xml_tree::node_t xml_tree::first_child(node_t x) const
89 return bp_first_child(this->par, x);
92 inline xml_tree::node_t xml_tree::last_child(xml_tree::node_t x) const
97 return bp_find_open(this->par, bp_find_close(this->par, x) - 1);
100 inline xml_tree::node_t xml_tree::next_sibling(xml_tree::node_t x) const
102 return bp_next_sibling(this->par, x);
105 inline xml_tree::node_t xml_tree::prev_sibling(xml_tree::node_t x) const
107 return bp_prev_sibling(this->par, x);
110 inline xml_tree::node_t xml_tree::first_element(xml_tree::node_t x) const
112 xml_tree::node_t n = first_child(x);
113 if (is_nil(n)) return xml_tree::NIL;
115 case xml_tree::ATTRIBUTE_OPEN_TAG_ID:
117 if (is_nil(n) || tag(n) != xml_tree::PCDATA_OPEN_TAG_ID) return n;
119 case PCDATA_OPEN_TAG_ID:
121 return bp_inspect(this->par, n) ? n : xml_tree::NIL;
125 inline xml_tree::node_t xml_tree::next_element(xml_tree::node_t x) const
128 if (is_nil(x)) return x;
129 if (tag(x) == xml_tree::PCDATA_OPEN_TAG_ID){
130 xml_tree::node_t y = x + 2;
131 return bp_inspect(this->par, y) ? y : xml_tree::NIL;
136 inline xml_tree::node_t xml_tree::tagged_next(node_t x, tag_t tag) const
138 return this->tags->select_next(tag, x);
141 inline xml_tree::node_t
142 xml_tree::tagged_descendant(xml_tree::node_t x,
143 xml_tree::tag_t tag) const
145 xml_tree::node_t y = tagged_next(x, tag);
146 return is_nil(y) || !is_ancestor(x, y) ? xml_tree::NIL : y;
149 inline xml_tree::node_t
150 xml_tree::tagged_following_before(xml_tree::node_t x,
152 xml_tree::node_t limit) const
154 xml_tree::node_t close = bp_find_close(this->par, x);
155 xml_tree::node_t s = tagged_next(close, tag);
156 return (s < limit) ? s : xml_tree::NIL;
160 inline xml_tree::node_t xml_tree::tagged_child(xml_tree::node_t x,
161 xml_tree::tag_t t) const
163 xml_tree::node_t c = first_child(x);
164 if (is_nil(c) || tag(c) == t)
167 tagged_sibling(c, t);
170 inline xml_tree::node_t xml_tree::tagged_sibling(xml_tree::node_t x,
171 xml_tree::tag_t t) const
173 xml_tree::node_t sibling = next_sibling(x);
174 while(!is_nil(sibling) && tag(sibling) != t) sibling = next_sibling(sibling);
178 xml_tree::node_t xml_tree::closing(xml_tree::node_t x) const
180 return bp_find_close(this->par, x);
184 inline SXSI::TextCollection *xml_tree::get_text_collection() const
186 return text_collection;
189 inline xml_tree::node_t xml_tree::parent_node(int32_t d) const
191 return (xml_tree::node_t) text_positions->select1(d + 1);
194 inline SXSI::TextCollection::document_result
195 xml_tree::prefix(uchar const *s) const
197 return text_collection->Prefix(s);
200 inline SXSI::TextCollection::document_result
201 xml_tree::suffix(uchar const *s) const
203 return text_collection->Suffix(s);
206 inline SXSI::TextCollection::document_result
207 xml_tree::equals(uchar const *s) const
209 return text_collection->Equal(s);
212 inline SXSI::TextCollection::document_result
213 xml_tree::contains(uchar const *s) const
215 return text_collection->Contains(s);
218 inline SXSI::TextCollection::document_result
219 xml_tree::less_than(uchar const *s) const
221 return text_collection->LessThan(s);
225 #endif //XML_TREE_INC_HPP_