summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2013-03-30 16:08:12 +0000
committerCarl Hetherington <cth@carlh.net>2013-03-30 16:08:12 +0000
commit713a073cae011a108e6acb69daca73abf852783c (patch)
tree027d66fdc5b44e842e77987abf4fea299bc47fd9 /src
parentd14bbc2088ed9c0f9d77f15cb943968a70bb8198 (diff)
Various bits of development.
Diffstat (limited to 'src')
-rw-r--r--src/cxml.cc46
-rw-r--r--src/cxml.h41
2 files changed, 55 insertions, 32 deletions
diff --git a/src/cxml.cc b/src/cxml.cc
index 2a755bf..20d06ee 100644
--- a/src/cxml.cc
+++ b/src/cxml.cc
@@ -21,8 +21,15 @@ cxml::Node::Node (xmlpp::Node const * node)
}
+string
+cxml::Node::name () const
+{
+ assert (_node);
+ return _node->get_name ();
+}
+
shared_ptr<cxml::Node>
-cxml::Node::node_child (string name)
+cxml::Node::node_child (string name) const
{
list<shared_ptr<cxml::Node> > n = node_children (name);
if (n.size() > 1) {
@@ -34,8 +41,21 @@ cxml::Node::node_child (string name)
return n.front ();
}
+shared_ptr<cxml::Node>
+cxml::Node::optional_node_child (string name) const
+{
+ list<shared_ptr<cxml::Node> > n = node_children (name);
+ if (n.size() > 1) {
+ throw cxml::Error ("duplicate XML tag " + name);
+ } else if (n.empty ()) {
+ return shared_ptr<cxml::Node> ();
+ }
+
+ return n.front ();
+}
+
list<shared_ptr<cxml::Node> >
-cxml::Node::node_children (string name)
+cxml::Node::node_children (string name) const
{
/* XXX: using find / get_path should work here, but I can't follow
how get_path works.
@@ -55,13 +75,13 @@ cxml::Node::node_children (string name)
}
string
-cxml::Node::string_child (string c)
+cxml::Node::string_child (string c) const
{
return node_child(c)->content ();
}
optional<string>
-cxml::Node::optional_string_child (string c)
+cxml::Node::optional_string_child (string c) const
{
list<shared_ptr<Node> > nodes = node_children (c);
if (nodes.size() > 1) {
@@ -76,14 +96,14 @@ cxml::Node::optional_string_child (string c)
}
bool
-cxml::Node::bool_child (string c)
+cxml::Node::bool_child (string c) const
{
string const s = string_child (c);
return (s == "1" || s == "yes");
}
optional<bool>
-cxml::Node::optional_bool_child (string c)
+cxml::Node::optional_bool_child (string c) const
{
optional<string> s = optional_string_child (c);
if (!s) {
@@ -94,13 +114,13 @@ cxml::Node::optional_bool_child (string c)
}
void
-cxml::Node::ignore_child (string name)
+cxml::Node::ignore_child (string name) const
{
_taken.push_back (name);
}
string
-cxml::Node::string_attribute (string name)
+cxml::Node::string_attribute (string name) const
{
xmlpp::Element const * e = dynamic_cast<const xmlpp::Element *> (_node);
if (!e) {
@@ -116,7 +136,7 @@ cxml::Node::string_attribute (string name)
}
optional<string>
-cxml::Node::optional_string_attribute (string name)
+cxml::Node::optional_string_attribute (string name) const
{
xmlpp::Element const * e = dynamic_cast<const xmlpp::Element *> (_node);
if (!e) {
@@ -132,14 +152,14 @@ cxml::Node::optional_string_attribute (string name)
}
bool
-cxml::Node::bool_attribute (string name)
+cxml::Node::bool_attribute (string name) const
{
string const s = string_attribute (name);
return (s == "1" || s == "yes");
}
optional<bool>
-cxml::Node::optional_bool_attribute (string name)
+cxml::Node::optional_bool_attribute (string name) const
{
optional<string> s = optional_string_attribute (name);
if (!s) {
@@ -150,7 +170,7 @@ cxml::Node::optional_bool_attribute (string name)
}
void
-cxml::Node::done ()
+cxml::Node::done () const
{
xmlpp::Node::NodeList c = _node->get_children ();
for (xmlpp::Node::NodeList::iterator i = c.begin(); i != c.end(); ++i) {
@@ -161,7 +181,7 @@ cxml::Node::done ()
}
string
-cxml::Node::content ()
+cxml::Node::content () const
{
string content;
diff --git a/src/cxml.h b/src/cxml.h
index bf2a2d3..c9f1065 100644
--- a/src/cxml.h
+++ b/src/cxml.h
@@ -8,6 +8,7 @@
#include <boost/optional.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/algorithm/string/erase.hpp>
+#include <glibmm.h>
namespace xmlpp {
class Node;
@@ -52,6 +53,8 @@ public:
*/
Node (xmlpp::Node const * node);
+ std::string name () const;
+
/* A set of methods which look up a child of this node by
* its name, and return its contents as some type or other.
*
@@ -74,14 +77,14 @@ public:
* than one of the specified child node.
*/
- std::string string_child (std::string c);
- boost::optional<std::string> optional_string_child (std::string);
+ std::string string_child (std::string c) const;
+ boost::optional<std::string> optional_string_child (std::string) const;
- bool bool_child (std::string);
- boost::optional<bool> optional_bool_child (std::string);
+ bool bool_child (std::string) const;
+ boost::optional<bool> optional_bool_child (std::string) const;
template <class T>
- T numerical_child (std::string c)
+ T numerical_child (std::string c) const
{
std::string s = string_child (c);
boost::erase_all (s, " ");
@@ -89,7 +92,7 @@ public:
}
template <class T>
- boost::optional<T> optional_numerical_child (std::string c)
+ boost::optional<T> optional_numerical_child (std::string c) const
{
boost::optional<std::string> s = optional_string_child (c);
if (!s) {
@@ -102,25 +105,25 @@ public:
}
/** This will mark a child as to be ignored when calling done() */
- void ignore_child (std::string);
+ void ignore_child (std::string) const;
/** Check whether all children of this Node have been looked up
* or passed to ignore_child(). If not, an exception is thrown.
*/
- void done ();
+ void done () const;
/* These methods look for an attribute of this node, in the
* same way as the child methods do.
*/
- std::string string_attribute (std::string);
- boost::optional<std::string> optional_string_attribute (std::string);
+ std::string string_attribute (std::string) const;
+ boost::optional<std::string> optional_string_attribute (std::string) const;
- bool bool_attribute (std::string);
- boost::optional<bool> optional_bool_attribute (std::string);
+ bool bool_attribute (std::string) const;
+ boost::optional<bool> optional_bool_attribute (std::string) const;
template <class T>
- T numerical_attribute (std::string c)
+ T numerical_attribute (std::string c) const
{
std::string s = string_attribute (c);
boost::erase_all (s, " ");
@@ -128,7 +131,7 @@ public:
}
template <class T>
- boost::optional<T> optional_numerical_attribute (std::string c)
+ boost::optional<T> optional_numerical_attribute (std::string c) const
{
boost::optional<std::string> s = optional_string_attribute (c);
if (!s) {
@@ -141,18 +144,18 @@ public:
}
/** @return The content of this node */
- std::string content ();
+ std::string content () const;
- boost::shared_ptr<Node> node_child (std::string);
- boost::shared_ptr<Node> optional_node_child (std::string);
+ boost::shared_ptr<Node> node_child (std::string) const;
+ boost::shared_ptr<Node> optional_node_child (std::string) const;
- std::list<boost::shared_ptr<Node> > node_children (std::string);
+ std::list<boost::shared_ptr<Node> > node_children (std::string) const;
protected:
xmlpp::Node const * _node;
private:
- std::list<Glib::ustring> _taken;
+ mutable std::list<Glib::ustring> _taken;
};
class File : public Node