--- /dev/null
+/*\r
+ * Boost.Foreach support for pugixml classes.\r
+ * This file is provided to the public domain.\r
+ */\r
+\r
+#ifndef HEADER_PUGIXML_FOREACH_HPP\r
+#define HEADER_PUGIXML_FOREACH_HPP\r
+\r
+#include "pugixml.hpp"\r
+\r
+/*\r
+ * These types add support for BOOST_FOREACH macro to xml_node and xml_document classes (child iteration only).\r
+ * Example usage:\r
+ * BOOST_FOREACH(xml_node n, doc) {}\r
+ */\r
+\r
+namespace boost\r
+{\r
+ template <typename> struct range_mutable_iterator;\r
+ template <typename> struct range_const_iterator;\r
+\r
+ template<> struct range_mutable_iterator<pugi::xml_node>\r
+ {\r
+ typedef pugi::xml_node::iterator type;\r
+ };\r
+\r
+ template<> struct range_const_iterator<pugi::xml_node>\r
+ {\r
+ typedef pugi::xml_node::iterator type;\r
+ };\r
+\r
+ template<> struct range_mutable_iterator<pugi::xml_document>\r
+ {\r
+ typedef pugi::xml_document::iterator type;\r
+ };\r
+\r
+ template<> struct range_const_iterator<pugi::xml_document>\r
+ {\r
+ typedef pugi::xml_document::iterator type;\r
+ };\r
+}\r
+\r
+/*\r
+ * These types add support for BOOST_FOREACH macro to xml_node and xml_document classes (child/attribute iteration).\r
+ * Example usage:\r
+ * BOOST_FOREACH(xml_node n, children(doc)) {}\r
+ * BOOST_FOREACH(xml_node n, attributes(doc)) {}\r
+ */\r
+\r
+namespace pugi\r
+{\r
+ inline xml_object_range<xml_node_iterator> children(const pugi::xml_node& node)\r
+ {\r
+ return node.children();\r
+ }\r
+\r
+ inline xml_object_range<xml_attribute_iterator> attributes(const pugi::xml_node& node)\r
+ {\r
+ return node.attributes();\r
+ }\r
+}\r
+\r
+#endif\r