diff options
author | arseny.kapoulkine <arseny.kapoulkine@99668b35-9821-0410-8761-19e4c4f06640> | 2010-02-02 20:45:55 +0000 |
---|---|---|
committer | arseny.kapoulkine <arseny.kapoulkine@99668b35-9821-0410-8761-19e4c4f06640> | 2010-02-02 20:45:55 +0000 |
commit | 764b54d042a441c1fb31cfa25360a98b74159a32 (patch) | |
tree | 4d7f5c260106541f55ba435c5e03ab700eca1a96 | |
parent | 933c092395b6cee05e3e5bbf9fa67ff718ac6893 (diff) |
contrib: Added Boost.Foreach helpers
git-svn-id: http://pugixml.googlecode.com/svn/trunk@243 99668b35-9821-0410-8761-19e4c4f06640
-rw-r--r-- | contrib/foreach.hpp | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/contrib/foreach.hpp b/contrib/foreach.hpp new file mode 100644 index 0000000..c413f1d --- /dev/null +++ b/contrib/foreach.hpp @@ -0,0 +1,102 @@ +/*
+ * Boost.Foreach support for pugixml classes.
+ * This file is provided to the public domain.
+ * Written by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)
+ */
+
+#ifndef HEADER_PUGIXML_FOREACH_HPP
+#define HEADER_PUGIXML_FOREACH_HPP
+
+#include "pugixml.hpp"
+
+/*
+ * These types add support for BOOST_FOREACH macro to xml_node and xml_document classes (child iteration only).
+ * Example usage:
+ * BOOST_FOREACH(xml_node n, doc) {}
+ */
+
+namespace boost
+{
+ template <typename> struct range_mutable_iterator;
+ template <typename> struct range_const_iterator;
+
+ template<> struct range_mutable_iterator<pugi::xml_node>
+ {
+ typedef pugi::xml_node::iterator type;
+ };
+
+ template<> struct range_const_iterator<pugi::xml_node>
+ {
+ typedef pugi::xml_node::iterator type;
+ };
+
+ template<> struct range_mutable_iterator<pugi::xml_document>
+ {
+ typedef pugi::xml_document::iterator type;
+ };
+
+ template<> struct range_const_iterator<pugi::xml_document>
+ {
+ typedef pugi::xml_document::iterator type;
+ };
+}
+
+/*
+ * These types add support for BOOST_FOREACH macro to xml_node and xml_document classes (child/attribute iteration).
+ * Example usage:
+ * BOOST_FOREACH(xml_node n, children(doc)) {}
+ * BOOST_FOREACH(xml_node n, attributes(doc)) {}
+ */
+
+namespace pugi
+{
+ struct xml_node_children_adapter
+ {
+ typedef pugi::xml_node::iterator iterator;
+ typedef pugi::xml_node::iterator const_iterator;
+
+ xml_node node;
+
+ const_iterator begin() const
+ {
+ return node.begin();
+ }
+
+ const_iterator end() const
+ {
+ return node.end();
+ }
+ };
+
+ xml_node_children_adapter children(const pugi::xml_node& node)
+ {
+ xml_node_children_adapter result = {node};
+ return result;
+ }
+
+ struct xml_node_attribute_adapter
+ {
+ typedef pugi::xml_node::attribute_iterator iterator;
+ typedef pugi::xml_node::attribute_iterator const_iterator;
+
+ xml_node node;
+
+ const_iterator begin() const
+ {
+ return node.attributes_begin();
+ }
+
+ const_iterator end() const
+ {
+ return node.attributes_end();
+ }
+ };
+
+ xml_node_attribute_adapter attributes(const pugi::xml_node& node)
+ {
+ xml_node_attribute_adapter result = {node};
+ return result;
+ }
+}
+
+#endif
|