Started working on an XPath visitor class

This commit is contained in:
John Wiegley 2007-05-15 05:43:53 +00:00
parent 3244c693f8
commit ff43b1d135
4 changed files with 48 additions and 5 deletions

View file

@ -259,7 +259,7 @@ public:
}
virtual value_t to_value() const {
return text();
return value_t(text(), true);
}
void print(std::ostream& out) const;

View file

@ -1565,6 +1565,9 @@ void value_t::print(std::ostream& out, const int first_width,
case AMOUNT:
case STRING:
case POINTER:
// jww (2007-05-14): I need a version of this print just for XPath
// expression, since amounts and strings need to be output with
// special syntax.
out << *this;
break;

View file

@ -2150,8 +2150,6 @@ void xpath_t::op_t::dump(std::ostream& out, const int depth) const
} else {
assert(! right());
}
} else {
assert(! left());
}
}

View file

@ -231,7 +231,7 @@ public:
typedef std::list<element_t>::const_iterator element_iterator;
struct node_appender_t {
struct value_node_appender_t {
value_t::sequence_t& sequence;
node_appender_t(value_t::sequence_t& _sequence)
: sequence(_sequence) {}
@ -245,7 +245,7 @@ public:
void find_all(value_t::sequence_t& result,
node_t& start, scope_t * scope) {
visit(start, scope, node_appender_t(result));
visit(start, scope, value_node_appender_t(result));
}
void visit(node_t& start, scope_t * scope,
@ -261,6 +261,36 @@ public:
scope_t * scope, const function<void (node_t&)>& func);
};
class path_iterator_t
{
path_t path;
std::vector<node_t *> sequence;
struct node_appender_t {
std::vector<node_t *>& sequence;
node_appender_t(std::vector<node_t *>& _sequence)
: sequence(_sequence) {}
void operator()(node_t& node) {
sequence.push_back(&node);
}
};
public:
typedef std::vector<node_t *>::iterator iterator;
typedef std::vector<node_t *>::const_iterator const_iterator;
path_iterator_t(const xpath_t& path_expr, node_t& start, scope_t * scope)
: path(path_expr) {
path.visit(start, scope, node_appender_t(sequence));
}
iterator begin() { return sequence.begin(); }
const_iterator begin() const { return sequence.begin(); }
iterator end() { return sequence.end(); }
const_iterator end() const { return sequence.end(); }
};
struct op_t : public noncopyable
{
enum kind_t {
@ -704,6 +734,18 @@ public:
return temp.calc(top, scope);
}
void find_all(value_t::sequence_t& result,
node_t& start, scope_t * scope) {
path_t path(*this);
path.find_all(result, start, scope);
}
void visit(node_t& start, scope_t * scope,
const function<void (node_t&)>& func) {
path_t path(*this);
path.visit(start, scope, func);
}
void print(std::ostream& out, xml::document_t& document) const {
print(out, document, true, NULL, NULL, NULL);
}