|
Boost : |
From: Ryan Gallagher (ryan.gallagher_at_[hidden])
Date: 2006-04-25 02:00:25
Matias Capeletto <matias.capeletto <at> gmail.com> writes:
> This is where the path concept will allow some magic. IMO the 'most'
> important property of the having a path class is the orthogonality
> that it introduce. Iterate with a path in a ptree and constructing a
> path are now two clearly separated process.
>
I have to agree with this statement. I've been thinking that path should be
a separate concept. Instances of the concept could even be worked on
separately.
I really see building a path much as you would build an expression template
to be evaluated when invoked by the getter. I've been thinking something like:
template<typename Path>
ptree ptree::get(Path const& p)
{
return eval(p, *this);
}
One good concretization of this concept would be an xpath-like implementation.
Some of the additions for this would be quite similar to what you mentioned in
a previous thread with your overload of operator%. I would instead be
interested in seeing operator[] implemented in this way since this is more
xpath-like and IMHO easier to read. (Disadvantage is precedence.) That is
xpath_expression& xpath_expression::operator[](where_expression const&).
where_expression would be very similar to lambda. Based on your example
from the other thread:
data.get((p / "log")[_1 / "text" == "error1"] / "checked" + "id");
Following along the xpath and xslt I'd also like to see grouping. In my mind
there should be an accessor to get the group resulting from evaluating the
xpath expression. A group would be modeled by a view of ptree nodes.
For:
<p>
<log><text>error1</text><checked id=0>foo</checked></log>
<log><text>warning</text><checked id=1>foo</checked></log>
<log><text>error1</text><checked id=2>foo</checked></log>
<log><text>error1</text><unchecked id=3>foo</unchecked></log>
</p>
group result_group
= tree.get((xpath("p") / "log")[_1 / "text" == "error1"] / "checked" + "id");
BOOST_FOREACH(ptree& result, result_group)
{
cout << result.data() << " ";
}
would output: "0 2".
Just my 2c,
-Ryan
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk