14#ifndef PUGIXML_VERSION
17#define PUGIXML_VERSION 180
22#include "pugiconfig.hpp"
24#ifndef HEADER_PUGIXML_HPP
25#define HEADER_PUGIXML_HPP
31#if !defined(PUGIXML_NO_XPATH) && !defined(PUGIXML_NO_EXCEPTIONS)
43#ifndef PUGIXML_DEPRECATED
45#define PUGIXML_DEPRECATED __attribute__((deprecated))
46#elif defined(_MSC_VER) && _MSC_VER >= 1300
47#define PUGIXML_DEPRECATED __declspec(deprecated)
49#define PUGIXML_DEPRECATED
60#define PUGIXML_CLASS PUGIXML_API
64#ifndef PUGIXML_FUNCTION
65#define PUGIXML_FUNCTION PUGIXML_API
70#ifndef PUGIXML_HAS_LONG_LONG
71#if __cplusplus >= 201103
72#define PUGIXML_HAS_LONG_LONG
73#elif defined(_MSC_VER) && _MSC_VER >= 1400
74#define PUGIXML_HAS_LONG_LONG
80#ifndef PUGIXML_HAS_MOVE
81#if __cplusplus >= 201103
82#define PUGIXML_HAS_MOVE
83#elif defined(_MSC_VER) && _MSC_VER >= 1600
84#define PUGIXML_HAS_MOVE
89#ifndef PUGIXML_OVERRIDE
90#if __cplusplus >= 201103
91#define PUGIXML_OVERRIDE override
93#define PUGIXML_OVERRIDE
98#ifdef PUGIXML_WCHAR_MODE
99#define PUGIXML_TEXT(t) L##t
100#define PUGIXML_CHAR wchar_t
102#define PUGIXML_TEXT(t) t
103#define PUGIXML_CHAR char
109typedef PUGIXML_CHAR char_t;
111#ifndef PUGIXML_NO_STL
114typedef std::basic_string<PUGIXML_CHAR, std::char_traits<PUGIXML_CHAR>,
115 std::allocator<PUGIXML_CHAR> >
140const unsigned int parse_minimal = 0x0000;
144const unsigned int parse_pi = 0x0001;
148const unsigned int parse_comments = 0x0002;
152const unsigned int parse_cdata = 0x0004;
157const unsigned int parse_ws_pcdata = 0x0008;
161const unsigned int parse_escapes = 0x0010;
165const unsigned int parse_eol = 0x0020;
169const unsigned int parse_wconv_attribute = 0x0040;
173const unsigned int parse_wnorm_attribute = 0x0080;
177const unsigned int parse_declaration = 0x0100;
181const unsigned int parse_doctype = 0x0200;
187const unsigned int parse_ws_pcdata_single = 0x0400;
191const unsigned int parse_trim_pcdata = 0x0800;
196const unsigned int parse_fragment = 0x1000;
202const unsigned int parse_embed_pcdata = 0x2000;
208const unsigned int parse_default =
209 parse_cdata | parse_escapes | parse_wconv_attribute | parse_eol;
215const unsigned int parse_full = parse_default | parse_pi | parse_comments |
216 parse_declaration | parse_doctype;
237const unsigned int format_indent = 0x01;
241const unsigned int format_write_bom = 0x02;
245const unsigned int format_raw = 0x04;
249const unsigned int format_no_declaration = 0x08;
253const unsigned int format_no_escapes = 0x10;
258const unsigned int format_save_file_text = 0x20;
262const unsigned int format_indent_attributes = 0x40;
266const unsigned int format_no_empty_element_tags = 0x80;
271const unsigned int format_default = format_indent;
289#ifndef PUGIXML_NO_XPATH
297template <
typename It>
298class xml_object_range {
300 typedef It const_iterator;
303 xml_object_range(It b, It e) : _begin(b), _end(e) {}
305 It begin()
const {
return _begin; }
306 It end()
const {
return _end; }
318 virtual void write(
const void* data,
size_t size) = 0;
326 xml_writer_file(
void* file);
328 virtual void write(
const void* data,
size_t size) PUGIXML_OVERRIDE;
334#ifndef PUGIXML_NO_STL
339 xml_writer_stream(std::basic_ostream<
char, std::char_traits<char> >& stream);
341 std::basic_ostream<
wchar_t, std::char_traits<wchar_t> >& stream);
343 virtual void write(
const void* data,
size_t size) PUGIXML_OVERRIDE;
346 std::basic_ostream<char, std::char_traits<char> >* narrow_stream;
347 std::basic_ostream<wchar_t, std::char_traits<wchar_t> >* wide_stream;
352class PUGIXML_CLASS xml_attribute {
353 friend class xml_attribute_iterator;
354 friend class xml_node;
359 typedef void (*unspecified_bool_type)(xml_attribute***);
369 operator unspecified_bool_type()
const;
372 bool operator!()
const;
375 bool operator==(
const xml_attribute& r)
const;
376 bool operator!=(
const xml_attribute& r)
const;
377 bool operator<(
const xml_attribute& r)
const;
378 bool operator>(
const xml_attribute& r)
const;
379 bool operator<=(
const xml_attribute& r)
const;
380 bool operator>=(
const xml_attribute& r)
const;
386 const char_t* name()
const;
387 const char_t* value()
const;
390 const char_t* as_string(
const char_t* def = PUGIXML_TEXT(
""))
const;
394 int as_int(
int def = 0)
const;
395 unsigned int as_uint(
unsigned int def = 0)
const;
396 double as_double(
double def = 0)
const;
397 float as_float(
float def = 0)
const;
399#ifdef PUGIXML_HAS_LONG_LONG
400 long long as_llong(
long long def = 0)
const;
401 unsigned long long as_ullong(
unsigned long long def = 0)
const;
406 bool as_bool(
bool def =
false)
const;
410 bool set_name(
const char_t* rhs);
411 bool set_value(
const char_t* rhs);
415 bool set_value(
int rhs);
416 bool set_value(
unsigned int rhs);
417 bool set_value(
long rhs);
418 bool set_value(
unsigned long rhs);
419 bool set_value(
double rhs);
420 bool set_value(
float rhs);
421 bool set_value(
bool rhs);
423#ifdef PUGIXML_HAS_LONG_LONG
424 bool set_value(
long long rhs);
425 bool set_value(
unsigned long long rhs);
429 xml_attribute& operator=(
const char_t* rhs);
430 xml_attribute& operator=(
int rhs);
431 xml_attribute& operator=(
unsigned int rhs);
432 xml_attribute& operator=(
long rhs);
433 xml_attribute& operator=(
unsigned long rhs);
434 xml_attribute& operator=(
double rhs);
435 xml_attribute& operator=(
float rhs);
436 xml_attribute& operator=(
bool rhs);
438#ifdef PUGIXML_HAS_LONG_LONG
439 xml_attribute& operator=(
long long rhs);
440 xml_attribute& operator=(
unsigned long long rhs);
444 xml_attribute next_attribute()
const;
445 xml_attribute previous_attribute()
const;
448 size_t hash_value()
const;
456bool PUGIXML_FUNCTION operator&&(
const xml_attribute& lhs,
bool rhs);
457bool PUGIXML_FUNCTION operator||(
const xml_attribute& lhs,
bool rhs);
461class PUGIXML_CLASS xml_node {
462 friend class xml_attribute_iterator;
463 friend class xml_node_iterator;
464 friend class xml_named_node_iterator;
469 typedef void (*unspecified_bool_type)(xml_node***);
479 operator unspecified_bool_type()
const;
482 bool operator!()
const;
485 bool operator==(
const xml_node& r)
const;
486 bool operator!=(
const xml_node& r)
const;
487 bool operator<(
const xml_node& r)
const;
488 bool operator>(
const xml_node& r)
const;
489 bool operator<=(
const xml_node& r)
const;
490 bool operator>=(
const xml_node& r)
const;
496 xml_node_type type()
const;
499 const char_t* name()
const;
504 const char_t* value()
const;
511 xml_node first_child()
const;
512 xml_node last_child()
const;
515 xml_node next_sibling()
const;
516 xml_node previous_sibling()
const;
519 xml_node parent()
const;
522 xml_node root()
const;
528 xml_node child(
const char_t* name)
const;
530 xml_node next_sibling(
const char_t* name)
const;
531 xml_node previous_sibling(
const char_t* name)
const;
539 const char_t* child_value()
const;
543 const char_t* child_value(
const char_t* name)
const;
547 bool set_name(
const char_t* rhs);
548 bool set_value(
const char_t* rhs);
570 xml_node append_child(xml_node_type type = node_element);
571 xml_node prepend_child(xml_node_type type = node_element);
572 xml_node insert_child_after(xml_node_type type,
const xml_node& node);
573 xml_node insert_child_before(xml_node_type type,
const xml_node& node);
577 xml_node append_child(
const char_t* name);
578 xml_node prepend_child(
const char_t* name);
579 xml_node insert_child_after(
const char_t* name,
const xml_node& node);
580 xml_node insert_child_before(
const char_t* name,
const xml_node& node);
584 xml_node append_copy(
const xml_node& proto);
585 xml_node prepend_copy(
const xml_node& proto);
586 xml_node insert_copy_after(
const xml_node& proto,
const xml_node& node);
587 xml_node insert_copy_before(
const xml_node& proto,
const xml_node& node);
591 xml_node append_move(
const xml_node& moved);
592 xml_node prepend_move(
const xml_node& moved);
593 xml_node insert_move_after(
const xml_node& moved,
const xml_node& node);
594 xml_node insert_move_before(
const xml_node& moved,
const xml_node& node);
598 bool remove_attribute(
const char_t* name);
601 bool remove_child(
const xml_node& n);
602 bool remove_child(
const char_t* name);
610 unsigned int options = parse_default,
611 xml_encoding encoding = encoding_auto);
615 template <
typename Predicate>
620 attrib = attrib.next_attribute())
621 if (pred(attrib))
return attrib;
628 template <
typename Predicate>
629 xml_node find_child(Predicate pred)
const {
630 if (!_root)
return xml_node();
632 for (xml_node node = first_child(); node; node = node.next_sibling())
633 if (pred(node))
return node;
640 template <
typename Predicate>
641 xml_node find_node(Predicate pred)
const {
642 if (!_root)
return xml_node();
644 xml_node cur = first_child();
646 while (cur._root && cur._root != _root) {
647 if (pred(cur))
return cur;
649 if (cur.first_child())
650 cur = cur.first_child();
651 else if (cur.next_sibling())
652 cur = cur.next_sibling();
654 while (!cur.next_sibling() && cur._root != _root) cur = cur.parent();
656 if (cur._root != _root) cur = cur.next_sibling();
664 xml_node find_child_by_attribute(
const char_t* name,
const char_t* attr_name,
665 const char_t* attr_value)
const;
666 xml_node find_child_by_attribute(
const char_t* attr_name,
667 const char_t* attr_value)
const;
669#ifndef PUGIXML_NO_STL
671 string_t path(char_t delimiter =
'/')
const;
675 xml_node first_element_by_path(
const char_t* path,
676 char_t delimiter =
'/')
const;
681#ifndef PUGIXML_NO_XPATH
695 xpath_node select_single_node(
const char_t* query,
703 unsigned int flags = format_default,
704 xml_encoding encoding = encoding_auto,
705 unsigned int depth = 0)
const;
707#ifndef PUGIXML_NO_STL
709 void print(std::basic_ostream<
char, std::char_traits<char> >& os,
710 const char_t* indent = PUGIXML_TEXT(
"\t"),
711 unsigned int flags = format_default,
712 xml_encoding encoding = encoding_auto,
713 unsigned int depth = 0)
const;
714 void print(std::basic_ostream<
wchar_t, std::char_traits<wchar_t> >& os,
715 const char_t* indent = PUGIXML_TEXT(
"\t"),
716 unsigned int flags = format_default,
unsigned int depth = 0)
const;
720 typedef xml_node_iterator iterator;
722 iterator begin()
const;
723 iterator end()
const;
726 typedef xml_attribute_iterator attribute_iterator;
728 attribute_iterator attributes_begin()
const;
729 attribute_iterator attributes_end()
const;
738 ptrdiff_t offset_debug()
const;
741 size_t hash_value()
const;
749bool PUGIXML_FUNCTION operator&&(
const xml_node& lhs,
bool rhs);
750bool PUGIXML_FUNCTION operator||(
const xml_node& lhs,
bool rhs);
754class PUGIXML_CLASS xml_text {
755 friend class xml_node;
759 typedef void (*unspecified_bool_type)(xml_text***);
771 operator unspecified_bool_type()
const;
774 bool operator!()
const;
780 const char_t* get()
const;
783 const char_t* as_string(
const char_t* def = PUGIXML_TEXT(
""))
const;
787 int as_int(
int def = 0)
const;
788 unsigned int as_uint(
unsigned int def = 0)
const;
789 double as_double(
double def = 0)
const;
790 float as_float(
float def = 0)
const;
792#ifdef PUGIXML_HAS_LONG_LONG
793 long long as_llong(
long long def = 0)
const;
794 unsigned long long as_ullong(
unsigned long long def = 0)
const;
799 bool as_bool(
bool def =
false)
const;
802 bool set(
const char_t* rhs);
807 bool set(
unsigned int rhs);
809 bool set(
unsigned long rhs);
810 bool set(
double rhs);
814#ifdef PUGIXML_HAS_LONG_LONG
815 bool set(
long long rhs);
816 bool set(
unsigned long long rhs);
820 xml_text& operator=(
const char_t* rhs);
821 xml_text& operator=(
int rhs);
822 xml_text& operator=(
unsigned int rhs);
823 xml_text& operator=(
long rhs);
824 xml_text& operator=(
unsigned long rhs);
825 xml_text& operator=(
double rhs);
826 xml_text& operator=(
float rhs);
827 xml_text& operator=(
bool rhs);
829#ifdef PUGIXML_HAS_LONG_LONG
830 xml_text& operator=(
long long rhs);
831 xml_text& operator=(
unsigned long long rhs);
835 xml_node data()
const;
840bool PUGIXML_FUNCTION operator&&(
const xml_text& lhs,
bool rhs);
841bool PUGIXML_FUNCTION operator||(
const xml_text& lhs,
bool rhs);
845class PUGIXML_CLASS xml_node_iterator {
846 friend class xml_node;
849 mutable xml_node _wrap;
856 typedef ptrdiff_t difference_type;
857 typedef xml_node value_type;
858 typedef xml_node* pointer;
859 typedef xml_node& reference;
861#ifndef PUGIXML_NO_STL
862 typedef std::bidirectional_iterator_tag iterator_category;
869 xml_node_iterator(
const xml_node& node);
872 bool operator==(
const xml_node_iterator& rhs)
const;
873 bool operator!=(
const xml_node_iterator& rhs)
const;
875 xml_node& operator*()
const;
876 xml_node* operator->()
const;
878 const xml_node_iterator& operator++();
879 xml_node_iterator operator++(
int);
881 const xml_node_iterator& operator--();
882 xml_node_iterator operator--(
int);
887class PUGIXML_CLASS xml_attribute_iterator {
888 friend class xml_node;
898 typedef ptrdiff_t difference_type;
903#ifndef PUGIXML_NO_STL
904 typedef std::bidirectional_iterator_tag iterator_category;
908 xml_attribute_iterator();
911 xml_attribute_iterator(
const xml_attribute& attr,
const xml_node& parent);
914 bool operator==(
const xml_attribute_iterator& rhs)
const;
915 bool operator!=(
const xml_attribute_iterator& rhs)
const;
920 const xml_attribute_iterator& operator++();
921 xml_attribute_iterator operator++(
int);
923 const xml_attribute_iterator& operator--();
924 xml_attribute_iterator operator--(
int);
928class PUGIXML_CLASS xml_named_node_iterator {
929 friend class xml_node;
933 typedef ptrdiff_t difference_type;
934 typedef xml_node value_type;
935 typedef xml_node* pointer;
936 typedef xml_node& reference;
938#ifndef PUGIXML_NO_STL
939 typedef std::bidirectional_iterator_tag iterator_category;
943 xml_named_node_iterator();
946 xml_named_node_iterator(
const xml_node& node,
const char_t* name);
949 bool operator==(
const xml_named_node_iterator& rhs)
const;
950 bool operator!=(
const xml_named_node_iterator& rhs)
const;
952 xml_node& operator*()
const;
953 xml_node* operator->()
const;
955 const xml_named_node_iterator& operator++();
956 xml_named_node_iterator operator++(
int);
958 const xml_named_node_iterator& operator--();
959 xml_named_node_iterator operator--(
int);
962 mutable xml_node _wrap;
971class PUGIXML_CLASS xml_tree_walker {
972 friend class xml_node;
983 virtual ~xml_tree_walker();
986 virtual bool begin(xml_node& node);
989 virtual bool for_each(xml_node& node) = 0;
992 virtual bool end(xml_node& node);
996enum xml_parse_status {
999 status_file_not_found,
1001 status_out_of_memory,
1002 status_internal_error,
1004 status_unrecognized_tag,
1013 status_bad_start_element,
1015 status_bad_attribute,
1017 status_bad_end_element,
1019 status_end_element_mismatch,
1024 status_append_invalid_root,
1028 status_no_document_element
1033struct PUGIXML_CLASS xml_parse_result {
1035 xml_parse_status status;
1041 xml_encoding encoding;
1047 operator bool()
const;
1050 const char* description()
const;
1054class PUGIXML_CLASS xml_document :
public xml_node {
1061 xml_document(
const xml_document&);
1062 xml_document& operator=(
const xml_document&);
1079 void reset(
const xml_document& proto);
1081#ifndef PUGIXML_NO_STL
1084 std::basic_istream<
char, std::char_traits<char> >& stream,
1085 unsigned int options = parse_default,
1086 xml_encoding encoding = encoding_auto);
1088 std::basic_istream<
wchar_t, std::char_traits<wchar_t> >& stream,
1089 unsigned int options = parse_default);
1095 unsigned int options = parse_default);
1100 unsigned int options = parse_default);
1104 unsigned int options = parse_default,
1105 xml_encoding encoding = encoding_auto);
1107 unsigned int options = parse_default,
1108 xml_encoding encoding = encoding_auto);
1113 unsigned int options = parse_default,
1114 xml_encoding encoding = encoding_auto);
1121 unsigned int options = parse_default,
1122 xml_encoding encoding = encoding_auto);
1129 void* contents,
size_t size,
unsigned int options = parse_default,
1130 xml_encoding encoding = encoding_auto);
1135 unsigned int flags = format_default,
1136 xml_encoding encoding = encoding_auto)
const;
1138#ifndef PUGIXML_NO_STL
1141 void save(std::basic_ostream<
char, std::char_traits<char> >& stream,
1142 const char_t* indent = PUGIXML_TEXT(
"\t"),
1143 unsigned int flags = format_default,
1144 xml_encoding encoding = encoding_auto)
const;
1145 void save(std::basic_ostream<
wchar_t, std::char_traits<wchar_t> >& stream,
1146 const char_t* indent = PUGIXML_TEXT(
"\t"),
1147 unsigned int flags = format_default)
const;
1151 bool save_file(
const char* path,
const char_t* indent = PUGIXML_TEXT(
"\t"),
1152 unsigned int flags = format_default,
1153 xml_encoding encoding = encoding_auto)
const;
1154 bool save_file(
const wchar_t* path,
const char_t* indent = PUGIXML_TEXT(
"\t"),
1155 unsigned int flags = format_default,
1156 xml_encoding encoding = encoding_auto)
const;
1159 xml_node document_element()
const;
1162#ifndef PUGIXML_NO_XPATH
1164enum xpath_value_type {
1166 xpath_type_node_set,
1173struct PUGIXML_CLASS xpath_parse_result {
1181 xpath_parse_result();
1184 operator bool()
const;
1187 const char* description()
const;
1191class PUGIXML_CLASS xpath_variable {
1192 friend class xpath_variable_set;
1195 xpath_value_type _type;
1196 xpath_variable* _next;
1198 xpath_variable(xpath_value_type type);
1201 xpath_variable(
const xpath_variable&);
1202 xpath_variable& operator=(
const xpath_variable&);
1206 const char_t* name()
const;
1209 xpath_value_type type()
const;
1213 bool get_boolean()
const;
1214 double get_number()
const;
1215 const char_t* get_string()
const;
1220 bool set(
bool value);
1221 bool set(
double value);
1222 bool set(
const char_t* value);
1227class PUGIXML_CLASS xpath_variable_set {
1231 void _assign(
const xpath_variable_set& rhs);
1232 void _swap(xpath_variable_set& rhs);
1241 xpath_variable_set();
1242 ~xpath_variable_set();
1245 xpath_variable_set(
const xpath_variable_set& rhs);
1246 xpath_variable_set& operator=(
const xpath_variable_set& rhs);
1248#ifdef PUGIXML_HAS_MOVE
1250 xpath_variable_set(xpath_variable_set&& rhs);
1251 xpath_variable_set& operator=(xpath_variable_set&& rhs);
1259 bool set(
const char_t* name,
bool value);
1260 bool set(
const char_t* name,
double value);
1261 bool set(
const char_t* name,
const char_t* value);
1270class PUGIXML_CLASS xpath_query {
1275 typedef void (*unspecified_bool_type)(xpath_query***);
1278 xpath_query(
const xpath_query&);
1279 xpath_query& operator=(
const xpath_query&);
1293#ifdef PUGIXML_HAS_MOVE
1295 xpath_query(xpath_query&& rhs);
1296 xpath_query& operator=(xpath_query&& rhs);
1300 xpath_value_type return_type()
const;
1305 bool evaluate_boolean(
const xpath_node& n)
const;
1310 double evaluate_number(
const xpath_node& n)
const;
1312#ifndef PUGIXML_NO_STL
1316 string_t evaluate_string(
const xpath_node& n)
const;
1325 size_t evaluate_string(char_t* buffer,
size_t capacity,
1346 operator unspecified_bool_type()
const;
1349 bool operator!()
const;
1352#ifndef PUGIXML_NO_EXCEPTIONS
1354class PUGIXML_CLASS xpath_exception :
public std::exception {
1363 virtual const char* what()
const throw() PUGIXML_OVERRIDE;
1371class PUGIXML_CLASS xpath_node {
1376 typedef void (*unspecified_bool_type)(xpath_node***);
1394 operator unspecified_bool_type()
const;
1397 bool operator!()
const;
1400 bool operator==(
const xpath_node& n)
const;
1401 bool operator!=(
const xpath_node& n)
const;
1406bool PUGIXML_FUNCTION operator&&(
const xpath_node& lhs,
bool rhs);
1407bool PUGIXML_FUNCTION operator||(
const xpath_node& lhs,
bool rhs);
1411class PUGIXML_CLASS xpath_node_set {
1432 xpath_node_set(const_iterator begin, const_iterator end,
1433 type_t type = type_unsorted);
1439 xpath_node_set(
const xpath_node_set& ns);
1440 xpath_node_set& operator=(
const xpath_node_set& ns);
1442#ifdef PUGIXML_HAS_MOVE
1444 xpath_node_set(xpath_node_set&& rhs);
1445 xpath_node_set& operator=(xpath_node_set&& rhs);
1449 type_t type()
const;
1452 size_t size()
const;
1455 const xpath_node& operator[](
size_t index)
const;
1458 const_iterator begin()
const;
1459 const_iterator end()
const;
1462 void sort(
bool reverse =
false);
1478 void _assign(const_iterator begin, const_iterator end, type_t type);
1479 void _move(xpath_node_set& rhs);
1483#ifndef PUGIXML_NO_STL
1485std::basic_string<char, std::char_traits<char>, std::allocator<char> >
1486 PUGIXML_FUNCTION as_utf8(
const wchar_t* str);
1487std::basic_string<char, std::char_traits<char>, std::allocator<char> >
1489 as_utf8(
const std::basic_string<
wchar_t, std::char_traits<wchar_t>,
1490 std::allocator<wchar_t> >& str);
1493std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >
1494 PUGIXML_FUNCTION as_wide(
const char* str);
1495std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >
1497 as_wide(
const std::basic_string<
char, std::char_traits<char>,
1498 std::allocator<char> >& str);
1503typedef void* (*allocation_function)(
size_t size);
1506typedef void (*deallocation_function)(
void* ptr);
1510void PUGIXML_FUNCTION set_memory_management_functions(
1511 allocation_function allocate, deallocation_function deallocate);
1514allocation_function PUGIXML_FUNCTION get_memory_allocation_function();
1515deallocation_function PUGIXML_FUNCTION get_memory_deallocation_function();
1518#if !defined(PUGIXML_NO_STL) && (defined(_MSC_VER) || defined(__ICC))
1522std::bidirectional_iterator_tag PUGIXML_FUNCTION
1524std::bidirectional_iterator_tag PUGIXML_FUNCTION
1526std::bidirectional_iterator_tag PUGIXML_FUNCTION
1531#if !defined(PUGIXML_NO_STL) && defined(__SUNPRO_CC)
1534std::bidirectional_iterator_tag PUGIXML_FUNCTION
1535__iterator_category(
const pugi::xml_node_iterator&);
1536std::bidirectional_iterator_tag PUGIXML_FUNCTION
1537__iterator_category(
const pugi::xml_attribute_iterator&);
1538std::bidirectional_iterator_tag PUGIXML_FUNCTION
1539__iterator_category(
const pugi::xml_named_node_iterator&);
1547#if defined(PUGIXML_HEADER_ONLY) && !defined(PUGIXML_SOURCE)
1548#define PUGIXML_SOURCE "pugixml.cpp"
1549#include PUGIXML_SOURCE