Back to home page

EIC code displayed by LXR

 
 

    


Warning, file /include/Geant4/pugixml.hpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /**
0002  * pugixml parser - version 1.13
0003  * --------------------------------------------------------
0004  * Copyright (C) 2006-2022, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)
0005  * Report bugs and download new versions at https://pugixml.org/
0006  *
0007  * This library is distributed under the MIT License. See notice at the end
0008  * of this file.
0009  *
0010  * This work is based on the pugxml parser, which is:
0011  * Copyright (C) 2003, by Kristen Wegner (kristen@tima.net)
0012  */
0013 
0014 // Define version macro; evaluates to major * 1000 + minor * 10 + patch so that it's safe to use in less-than comparisons
0015 // Note: pugixml used major * 100 + minor * 10 + patch format up until 1.9 (which had version identifier 190); starting from pugixml 1.10, the minor version number is two digits
0016 #ifndef PUGIXML_VERSION
0017 #   define PUGIXML_VERSION 1130 // 1.13
0018 #endif
0019 
0020 // Include user configuration file (this can define various configuration macros)
0021 #include "pugiconfig.hpp"
0022 
0023 #ifndef HEADER_PUGIXML_HPP
0024 #define HEADER_PUGIXML_HPP
0025 
0026 // Include stddef.h for size_t and ptrdiff_t
0027 #include <stddef.h>
0028 
0029 // Include exception header for XPath
0030 #if !defined(PUGIXML_NO_XPATH) && !defined(PUGIXML_NO_EXCEPTIONS)
0031 #   include <exception>
0032 #endif
0033 
0034 // Include STL headers
0035 #ifndef PUGIXML_NO_STL
0036 #   include <iterator>
0037 #   include <iosfwd>
0038 #   include <string>
0039 #endif
0040 
0041 // Macro for deprecated features
0042 #ifndef PUGIXML_DEPRECATED
0043 #   if defined(__GNUC__)
0044 #       define PUGIXML_DEPRECATED __attribute__((deprecated))
0045 #   elif defined(_MSC_VER) && _MSC_VER >= 1300
0046 #       define PUGIXML_DEPRECATED __declspec(deprecated)
0047 #   else
0048 #       define PUGIXML_DEPRECATED
0049 #   endif
0050 #endif
0051 
0052 // If no API is defined, assume default
0053 #ifndef PUGIXML_API
0054 #   define PUGIXML_API
0055 #endif
0056 
0057 // If no API for classes is defined, assume default
0058 #ifndef PUGIXML_CLASS
0059 #   define PUGIXML_CLASS PUGIXML_API
0060 #endif
0061 
0062 // If no API for functions is defined, assume default
0063 #ifndef PUGIXML_FUNCTION
0064 #   define PUGIXML_FUNCTION PUGIXML_API
0065 #endif
0066 
0067 // If the platform is known to have long long support, enable long long functions
0068 #ifndef PUGIXML_HAS_LONG_LONG
0069 #   if __cplusplus >= 201103
0070 #       define PUGIXML_HAS_LONG_LONG
0071 #   elif defined(_MSC_VER) && _MSC_VER >= 1400
0072 #       define PUGIXML_HAS_LONG_LONG
0073 #   endif
0074 #endif
0075 
0076 // If the platform is known to have move semantics support, compile move ctor/operator implementation
0077 #ifndef PUGIXML_HAS_MOVE
0078 #   if __cplusplus >= 201103
0079 #       define PUGIXML_HAS_MOVE
0080 #   elif defined(_MSC_VER) && _MSC_VER >= 1600
0081 #       define PUGIXML_HAS_MOVE
0082 #   endif
0083 #endif
0084 
0085 // If C++ is 2011 or higher, add 'noexcept' specifiers
0086 #ifndef PUGIXML_NOEXCEPT
0087 #   if __cplusplus >= 201103
0088 #       define PUGIXML_NOEXCEPT noexcept
0089 #   elif defined(_MSC_VER) && _MSC_VER >= 1900
0090 #       define PUGIXML_NOEXCEPT noexcept
0091 #   else
0092 #       define PUGIXML_NOEXCEPT
0093 #   endif
0094 #endif
0095 
0096 // Some functions can not be noexcept in compact mode
0097 #ifdef PUGIXML_COMPACT
0098 #   define PUGIXML_NOEXCEPT_IF_NOT_COMPACT
0099 #else
0100 #   define PUGIXML_NOEXCEPT_IF_NOT_COMPACT PUGIXML_NOEXCEPT
0101 #endif
0102 
0103 // If C++ is 2011 or higher, add 'override' qualifiers
0104 #ifndef PUGIXML_OVERRIDE
0105 #   if __cplusplus >= 201103
0106 #       define PUGIXML_OVERRIDE override
0107 #   elif defined(_MSC_VER) && _MSC_VER >= 1700
0108 #       define PUGIXML_OVERRIDE override
0109 #   else
0110 #       define PUGIXML_OVERRIDE
0111 #   endif
0112 #endif
0113 
0114 // If C++ is 2011 or higher, use 'nullptr'
0115 #ifndef PUGIXML_NULL
0116 #   if __cplusplus >= 201103
0117 #       define PUGIXML_NULL nullptr
0118 #   elif defined(_MSC_VER) && _MSC_VER >= 1600
0119 #       define PUGIXML_NULL nullptr
0120 #   else
0121 #       define PUGIXML_NULL 0
0122 #   endif
0123 #endif
0124 
0125 // Character interface macros
0126 #ifdef PUGIXML_WCHAR_MODE
0127 #   define PUGIXML_TEXT(t) L ## t
0128 #   define PUGIXML_CHAR wchar_t
0129 #else
0130 #   define PUGIXML_TEXT(t) t
0131 #   define PUGIXML_CHAR char
0132 #endif
0133 
0134 namespace pugi
0135 {
0136     // Character type used for all internal storage and operations; depends on PUGIXML_WCHAR_MODE
0137     typedef PUGIXML_CHAR char_t;
0138 
0139 #ifndef PUGIXML_NO_STL
0140     // String type used for operations that work with STL string; depends on PUGIXML_WCHAR_MODE
0141     typedef std::basic_string<PUGIXML_CHAR, std::char_traits<PUGIXML_CHAR>, std::allocator<PUGIXML_CHAR> > string_t;
0142 #endif
0143 }
0144 
0145 // The PugiXML namespace
0146 namespace pugi
0147 {
0148     // Tree node types
0149     enum xml_node_type
0150     {
0151         node_null,          // Empty (null) node handle
0152         node_document,      // A document tree's absolute root
0153         node_element,       // Element tag, i.e. '<node/>'
0154         node_pcdata,        // Plain character data, i.e. 'text'
0155         node_cdata,         // Character data, i.e. '<![CDATA[text]]>'
0156         node_comment,       // Comment tag, i.e. '<!-- text -->'
0157         node_pi,            // Processing instruction, i.e. '<?name?>'
0158         node_declaration,   // Document declaration, i.e. '<?xml version="1.0"?>'
0159         node_doctype        // Document type declaration, i.e. '<!DOCTYPE doc>'
0160     };
0161 
0162     // Parsing options
0163 
0164     // Minimal parsing mode (equivalent to turning all other flags off).
0165     // Only elements and PCDATA sections are added to the DOM tree, no text conversions are performed.
0166     const unsigned int parse_minimal = 0x0000;
0167 
0168     // This flag determines if processing instructions (node_pi) are added to the DOM tree. This flag is off by default.
0169     const unsigned int parse_pi = 0x0001;
0170 
0171     // This flag determines if comments (node_comment) are added to the DOM tree. This flag is off by default.
0172     const unsigned int parse_comments = 0x0002;
0173 
0174     // This flag determines if CDATA sections (node_cdata) are added to the DOM tree. This flag is on by default.
0175     const unsigned int parse_cdata = 0x0004;
0176 
0177     // This flag determines if plain character data (node_pcdata) that consist only of whitespace are added to the DOM tree.
0178     // This flag is off by default; turning it on usually results in slower parsing and more memory consumption.
0179     const unsigned int parse_ws_pcdata = 0x0008;
0180 
0181     // This flag determines if character and entity references are expanded during parsing. This flag is on by default.
0182     const unsigned int parse_escapes = 0x0010;
0183 
0184     // This flag determines if EOL characters are normalized (converted to #xA) during parsing. This flag is on by default.
0185     const unsigned int parse_eol = 0x0020;
0186 
0187     // This flag determines if attribute values are normalized using CDATA normalization rules during parsing. This flag is on by default.
0188     const unsigned int parse_wconv_attribute = 0x0040;
0189 
0190     // This flag determines if attribute values are normalized using NMTOKENS normalization rules during parsing. This flag is off by default.
0191     const unsigned int parse_wnorm_attribute = 0x0080;
0192 
0193     // This flag determines if document declaration (node_declaration) is added to the DOM tree. This flag is off by default.
0194     const unsigned int parse_declaration = 0x0100;
0195 
0196     // This flag determines if document type declaration (node_doctype) is added to the DOM tree. This flag is off by default.
0197     const unsigned int parse_doctype = 0x0200;
0198 
0199     // This flag determines if plain character data (node_pcdata) that is the only child of the parent node and that consists only
0200     // of whitespace is added to the DOM tree.
0201     // This flag is off by default; turning it on may result in slower parsing and more memory consumption.
0202     const unsigned int parse_ws_pcdata_single = 0x0400;
0203 
0204     // This flag determines if leading and trailing whitespace is to be removed from plain character data. This flag is off by default.
0205     const unsigned int parse_trim_pcdata = 0x0800;
0206 
0207     // This flag determines if plain character data that does not have a parent node is added to the DOM tree, and if an empty document
0208     // is a valid document. This flag is off by default.
0209     const unsigned int parse_fragment = 0x1000;
0210 
0211     // This flag determines if plain character data is be stored in the parent element's value. This significantly changes the structure of
0212     // the document; this flag is only recommended for parsing documents with many PCDATA nodes in memory-constrained environments.
0213     // This flag is off by default.
0214     const unsigned int parse_embed_pcdata = 0x2000;
0215 
0216     // The default parsing mode.
0217     // Elements, PCDATA and CDATA sections are added to the DOM tree, character/reference entities are expanded,
0218     // End-of-Line characters are normalized, attribute values are normalized using CDATA normalization rules.
0219     const unsigned int parse_default = parse_cdata | parse_escapes | parse_wconv_attribute | parse_eol;
0220 
0221     // The full parsing mode.
0222     // Nodes of all types are added to the DOM tree, character/reference entities are expanded,
0223     // End-of-Line characters are normalized, attribute values are normalized using CDATA normalization rules.
0224     const unsigned int parse_full = parse_default | parse_pi | parse_comments | parse_declaration | parse_doctype;
0225 
0226     // These flags determine the encoding of input data for XML document
0227     enum xml_encoding
0228     {
0229         encoding_auto,      // Auto-detect input encoding using BOM or < / <? detection; use UTF8 if BOM is not found
0230         encoding_utf8,      // UTF8 encoding
0231         encoding_utf16_le,  // Little-endian UTF16
0232         encoding_utf16_be,  // Big-endian UTF16
0233         encoding_utf16,     // UTF16 with native endianness
0234         encoding_utf32_le,  // Little-endian UTF32
0235         encoding_utf32_be,  // Big-endian UTF32
0236         encoding_utf32,     // UTF32 with native endianness
0237         encoding_wchar,     // The same encoding wchar_t has (either UTF16 or UTF32)
0238         encoding_latin1
0239     };
0240 
0241     // Formatting flags
0242 
0243     // Indent the nodes that are written to output stream with as many indentation strings as deep the node is in DOM tree. This flag is on by default.
0244     const unsigned int format_indent = 0x01;
0245 
0246     // Write encoding-specific BOM to the output stream. This flag is off by default.
0247     const unsigned int format_write_bom = 0x02;
0248 
0249     // Use raw output mode (no indentation and no line breaks are written). This flag is off by default.
0250     const unsigned int format_raw = 0x04;
0251 
0252     // Omit default XML declaration even if there is no declaration in the document. This flag is off by default.
0253     const unsigned int format_no_declaration = 0x08;
0254 
0255     // Don't escape attribute values and PCDATA contents. This flag is off by default.
0256     const unsigned int format_no_escapes = 0x10;
0257 
0258     // Open file using text mode in xml_document::save_file. This enables special character (i.e. new-line) conversions on some systems. This flag is off by default.
0259     const unsigned int format_save_file_text = 0x20;
0260 
0261     // Write every attribute on a new line with appropriate indentation. This flag is off by default.
0262     const unsigned int format_indent_attributes = 0x40;
0263 
0264     // Don't output empty element tags, instead writing an explicit start and end tag even if there are no children. This flag is off by default.
0265     const unsigned int format_no_empty_element_tags = 0x80;
0266 
0267     // Skip characters belonging to range [0; 32) instead of "&#xNN;" encoding. This flag is off by default.
0268     const unsigned int format_skip_control_chars = 0x100;
0269 
0270     // Use single quotes ' instead of double quotes " for enclosing attribute values. This flag is off by default.
0271     const unsigned int format_attribute_single_quote = 0x200;
0272 
0273     // The default set of formatting flags.
0274     // Nodes are indented depending on their depth in DOM tree, a default declaration is output if document has none.
0275     const unsigned int format_default = format_indent;
0276 
0277     const int default_double_precision = 17;
0278     const int default_float_precision = 9;
0279 
0280     // Forward declarations
0281     struct xml_attribute_struct;
0282     struct xml_node_struct;
0283 
0284     class xml_node_iterator;
0285     class xml_attribute_iterator;
0286     class xml_named_node_iterator;
0287 
0288     class xml_tree_walker;
0289 
0290     struct xml_parse_result;
0291 
0292     class xml_node;
0293 
0294     class xml_text;
0295 
0296     #ifndef PUGIXML_NO_XPATH
0297     class xpath_node;
0298     class xpath_node_set;
0299     class xpath_query;
0300     class xpath_variable_set;
0301     #endif
0302 
0303     // Range-based for loop support
0304     template <typename It> class xml_object_range
0305     {
0306     public:
0307         typedef It const_iterator;
0308         typedef It iterator;
0309 
0310         xml_object_range(It b, It e): _begin(b), _end(e)
0311         {
0312         }
0313 
0314         It begin() const { return _begin; }
0315         It end() const { return _end; }
0316 
0317         bool empty() const { return _begin == _end; }
0318 
0319     private:
0320         It _begin, _end;
0321     };
0322 
0323     // Writer interface for node printing (see xml_node::print)
0324     class PUGIXML_CLASS xml_writer
0325     {
0326     public:
0327         virtual ~xml_writer() {}
0328 
0329         // Write memory chunk into stream/file/whatever
0330         virtual void write(const void* data, size_t size) = 0;
0331     };
0332 
0333     // xml_writer implementation for FILE*
0334     class PUGIXML_CLASS xml_writer_file: public xml_writer
0335     {
0336     public:
0337         // Construct writer from a FILE* object; void* is used to avoid header dependencies on stdio
0338         xml_writer_file(void* file);
0339 
0340         virtual void write(const void* data, size_t size) PUGIXML_OVERRIDE;
0341 
0342     private:
0343         void* file;
0344     };
0345 
0346     #ifndef PUGIXML_NO_STL
0347     // xml_writer implementation for streams
0348     class PUGIXML_CLASS xml_writer_stream: public xml_writer
0349     {
0350     public:
0351         // Construct writer from an output stream object
0352         xml_writer_stream(std::basic_ostream<char, std::char_traits<char> >& stream);
0353         xml_writer_stream(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& stream);
0354 
0355         virtual void write(const void* data, size_t size) PUGIXML_OVERRIDE;
0356 
0357     private:
0358         std::basic_ostream<char, std::char_traits<char> >* narrow_stream;
0359         std::basic_ostream<wchar_t, std::char_traits<wchar_t> >* wide_stream;
0360     };
0361     #endif
0362 
0363     // A light-weight handle for manipulating attributes in DOM tree
0364     class PUGIXML_CLASS xml_attribute
0365     {
0366         friend class xml_attribute_iterator;
0367         friend class xml_node;
0368 
0369     private:
0370         xml_attribute_struct* _attr;
0371 
0372         typedef void (*unspecified_bool_type)(xml_attribute***);
0373 
0374     public:
0375         // Default constructor. Constructs an empty attribute.
0376         xml_attribute();
0377 
0378         // Constructs attribute from internal pointer
0379         explicit xml_attribute(xml_attribute_struct* attr);
0380 
0381         // Safe bool conversion operator
0382         operator unspecified_bool_type() const;
0383 
0384         // Borland C++ workaround
0385         bool operator!() const;
0386 
0387         // Comparison operators (compares wrapped attribute pointers)
0388         bool operator==(const xml_attribute& r) const;
0389         bool operator!=(const xml_attribute& r) const;
0390         bool operator<(const xml_attribute& r) const;
0391         bool operator>(const xml_attribute& r) const;
0392         bool operator<=(const xml_attribute& r) const;
0393         bool operator>=(const xml_attribute& r) const;
0394 
0395         // Check if attribute is empty
0396         bool empty() const;
0397 
0398         // Get attribute name/value, or "" if attribute is empty
0399         const char_t* name() const;
0400         const char_t* value() const;
0401 
0402         // Get attribute value, or the default value if attribute is empty
0403         const char_t* as_string(const char_t* def = PUGIXML_TEXT("")) const;
0404 
0405         // Get attribute value as a number, or the default value if conversion did not succeed or attribute is empty
0406         int as_int(int def = 0) const;
0407         unsigned int as_uint(unsigned int def = 0) const;
0408         double as_double(double def = 0) const;
0409         float as_float(float def = 0) const;
0410 
0411     #ifdef PUGIXML_HAS_LONG_LONG
0412         long long as_llong(long long def = 0) const;
0413         unsigned long long as_ullong(unsigned long long def = 0) const;
0414     #endif
0415 
0416         // Get attribute value as bool (returns true if first character is in '1tTyY' set), or the default value if attribute is empty
0417         bool as_bool(bool def = false) const;
0418 
0419         // Set attribute name/value (returns false if attribute is empty or there is not enough memory)
0420         bool set_name(const char_t* rhs);
0421         bool set_value(const char_t* rhs, size_t sz);
0422         bool set_value(const char_t* rhs);
0423 
0424         // Set attribute value with type conversion (numbers are converted to strings, boolean is converted to "true"/"false")
0425         bool set_value(int rhs);
0426         bool set_value(unsigned int rhs);
0427         bool set_value(long rhs);
0428         bool set_value(unsigned long rhs);
0429         bool set_value(double rhs);
0430         bool set_value(double rhs, int precision);
0431         bool set_value(float rhs);
0432         bool set_value(float rhs, int precision);
0433         bool set_value(bool rhs);
0434 
0435     #ifdef PUGIXML_HAS_LONG_LONG
0436         bool set_value(long long rhs);
0437         bool set_value(unsigned long long rhs);
0438     #endif
0439 
0440         // Set attribute value (equivalent to set_value without error checking)
0441         xml_attribute& operator=(const char_t* rhs);
0442         xml_attribute& operator=(int rhs);
0443         xml_attribute& operator=(unsigned int rhs);
0444         xml_attribute& operator=(long rhs);
0445         xml_attribute& operator=(unsigned long rhs);
0446         xml_attribute& operator=(double rhs);
0447         xml_attribute& operator=(float rhs);
0448         xml_attribute& operator=(bool rhs);
0449 
0450     #ifdef PUGIXML_HAS_LONG_LONG
0451         xml_attribute& operator=(long long rhs);
0452         xml_attribute& operator=(unsigned long long rhs);
0453     #endif
0454 
0455         // Get next/previous attribute in the attribute list of the parent node
0456         xml_attribute next_attribute() const;
0457         xml_attribute previous_attribute() const;
0458 
0459         // Get hash value (unique for handles to the same object)
0460         size_t hash_value() const;
0461 
0462         // Get internal pointer
0463         xml_attribute_struct* internal_object() const;
0464     };
0465 
0466 #ifdef __BORLANDC__
0467     // Borland C++ workaround
0468     bool PUGIXML_FUNCTION operator&&(const xml_attribute& lhs, bool rhs);
0469     bool PUGIXML_FUNCTION operator||(const xml_attribute& lhs, bool rhs);
0470 #endif
0471 
0472     // A light-weight handle for manipulating nodes in DOM tree
0473     class PUGIXML_CLASS xml_node
0474     {
0475         friend class xml_attribute_iterator;
0476         friend class xml_node_iterator;
0477         friend class xml_named_node_iterator;
0478 
0479     protected:
0480         xml_node_struct* _root;
0481 
0482         typedef void (*unspecified_bool_type)(xml_node***);
0483 
0484     public:
0485         // Default constructor. Constructs an empty node.
0486         xml_node();
0487 
0488         // Constructs node from internal pointer
0489         explicit xml_node(xml_node_struct* p);
0490 
0491         // Safe bool conversion operator
0492         operator unspecified_bool_type() const;
0493 
0494         // Borland C++ workaround
0495         bool operator!() const;
0496 
0497         // Comparison operators (compares wrapped node pointers)
0498         bool operator==(const xml_node& r) const;
0499         bool operator!=(const xml_node& r) const;
0500         bool operator<(const xml_node& r) const;
0501         bool operator>(const xml_node& r) const;
0502         bool operator<=(const xml_node& r) const;
0503         bool operator>=(const xml_node& r) const;
0504 
0505         // Check if node is empty.
0506         bool empty() const;
0507 
0508         // Get node type
0509         xml_node_type type() const;
0510 
0511         // Get node name, or "" if node is empty or it has no name
0512         const char_t* name() const;
0513 
0514         // Get node value, or "" if node is empty or it has no value
0515         // Note: For <node>text</node> node.value() does not return "text"! Use child_value() or text() methods to access text inside nodes.
0516         const char_t* value() const;
0517 
0518         // Get attribute list
0519         xml_attribute first_attribute() const;
0520         xml_attribute last_attribute() const;
0521 
0522         // Get children list
0523         xml_node first_child() const;
0524         xml_node last_child() const;
0525 
0526         // Get next/previous sibling in the children list of the parent node
0527         xml_node next_sibling() const;
0528         xml_node previous_sibling() const;
0529 
0530         // Get parent node
0531         xml_node parent() const;
0532 
0533         // Get root of DOM tree this node belongs to
0534         xml_node root() const;
0535 
0536         // Get text object for the current node
0537         xml_text text() const;
0538 
0539         // Get child, attribute or next/previous sibling with the specified name
0540         xml_node child(const char_t* name) const;
0541         xml_attribute attribute(const char_t* name) const;
0542         xml_node next_sibling(const char_t* name) const;
0543         xml_node previous_sibling(const char_t* name) const;
0544 
0545         // Get attribute, starting the search from a hint (and updating hint so that searching for a sequence of attributes is fast)
0546         xml_attribute attribute(const char_t* name, xml_attribute& hint) const;
0547 
0548         // Get child value of current node; that is, value of the first child node of type PCDATA/CDATA
0549         const char_t* child_value() const;
0550 
0551         // Get child value of child with specified name. Equivalent to child(name).child_value().
0552         const char_t* child_value(const char_t* name) const;
0553 
0554         // Set node name/value (returns false if node is empty, there is not enough memory, or node can not have name/value)
0555         bool set_name(const char_t* rhs);
0556         bool set_value(const char_t* rhs, size_t sz);
0557         bool set_value(const char_t* rhs);
0558 
0559         // Add attribute with specified name. Returns added attribute, or empty attribute on errors.
0560         xml_attribute append_attribute(const char_t* name);
0561         xml_attribute prepend_attribute(const char_t* name);
0562         xml_attribute insert_attribute_after(const char_t* name, const xml_attribute& attr);
0563         xml_attribute insert_attribute_before(const char_t* name, const xml_attribute& attr);
0564 
0565         // Add a copy of the specified attribute. Returns added attribute, or empty attribute on errors.
0566         xml_attribute append_copy(const xml_attribute& proto);
0567         xml_attribute prepend_copy(const xml_attribute& proto);
0568         xml_attribute insert_copy_after(const xml_attribute& proto, const xml_attribute& attr);
0569         xml_attribute insert_copy_before(const xml_attribute& proto, const xml_attribute& attr);
0570 
0571         // Add child node with specified type. Returns added node, or empty node on errors.
0572         xml_node append_child(xml_node_type type = node_element);
0573         xml_node prepend_child(xml_node_type type = node_element);
0574         xml_node insert_child_after(xml_node_type type, const xml_node& node);
0575         xml_node insert_child_before(xml_node_type type, const xml_node& node);
0576 
0577         // Add child element with specified name. Returns added node, or empty node on errors.
0578         xml_node append_child(const char_t* name);
0579         xml_node prepend_child(const char_t* name);
0580         xml_node insert_child_after(const char_t* name, const xml_node& node);
0581         xml_node insert_child_before(const char_t* name, const xml_node& node);
0582 
0583         // Add a copy of the specified node as a child. Returns added node, or empty node on errors.
0584         xml_node append_copy(const xml_node& proto);
0585         xml_node prepend_copy(const xml_node& proto);
0586         xml_node insert_copy_after(const xml_node& proto, const xml_node& node);
0587         xml_node insert_copy_before(const xml_node& proto, const xml_node& node);
0588 
0589         // Move the specified node to become a child of this node. Returns moved node, or empty node on errors.
0590         xml_node append_move(const xml_node& moved);
0591         xml_node prepend_move(const xml_node& moved);
0592         xml_node insert_move_after(const xml_node& moved, const xml_node& node);
0593         xml_node insert_move_before(const xml_node& moved, const xml_node& node);
0594 
0595         // Remove specified attribute
0596         bool remove_attribute(const xml_attribute& a);
0597         bool remove_attribute(const char_t* name);
0598 
0599         // Remove all attributes
0600         bool remove_attributes();
0601 
0602         // Remove specified child
0603         bool remove_child(const xml_node& n);
0604         bool remove_child(const char_t* name);
0605 
0606         // Remove all children
0607         bool remove_children();
0608 
0609         // Parses buffer as an XML document fragment and appends all nodes as children of the current node.
0610         // Copies/converts the buffer, so it may be deleted or changed after the function returns.
0611         // Note: append_buffer allocates memory that has the lifetime of the owning document; removing the appended nodes does not immediately reclaim that memory.
0612         xml_parse_result append_buffer(const void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
0613 
0614         // Find attribute using predicate. Returns first attribute for which predicate returned true.
0615         template <typename Predicate> xml_attribute find_attribute(Predicate pred) const
0616         {
0617             if (!_root) return xml_attribute();
0618 
0619             for (xml_attribute attrib = first_attribute(); attrib; attrib = attrib.next_attribute())
0620                 if (pred(attrib))
0621                     return attrib;
0622 
0623             return xml_attribute();
0624         }
0625 
0626         // Find child node using predicate. Returns first child for which predicate returned true.
0627         template <typename Predicate> xml_node find_child(Predicate pred) const
0628         {
0629             if (!_root) return xml_node();
0630 
0631             for (xml_node node = first_child(); node; node = node.next_sibling())
0632                 if (pred(node))
0633                     return node;
0634 
0635             return xml_node();
0636         }
0637 
0638         // Find node from subtree using predicate. Returns first node from subtree (depth-first), for which predicate returned true.
0639         template <typename Predicate> xml_node find_node(Predicate pred) const
0640         {
0641             if (!_root) return xml_node();
0642 
0643             xml_node cur = first_child();
0644 
0645             while (cur._root && cur._root != _root)
0646             {
0647                 if (pred(cur)) return cur;
0648 
0649                 if (cur.first_child()) cur = cur.first_child();
0650                 else if (cur.next_sibling()) cur = cur.next_sibling();
0651                 else
0652                 {
0653                     while (!cur.next_sibling() && cur._root != _root) cur = cur.parent();
0654 
0655                     if (cur._root != _root) cur = cur.next_sibling();
0656                 }
0657             }
0658 
0659             return xml_node();
0660         }
0661 
0662         // Find child node by attribute name/value
0663         xml_node find_child_by_attribute(const char_t* name, const char_t* attr_name, const char_t* attr_value) const;
0664         xml_node find_child_by_attribute(const char_t* attr_name, const char_t* attr_value) const;
0665 
0666     #ifndef PUGIXML_NO_STL
0667         // Get the absolute node path from root as a text string.
0668         string_t path(char_t delimiter = '/') const;
0669     #endif
0670 
0671         // Search for a node by path consisting of node names and . or .. elements.
0672         xml_node first_element_by_path(const char_t* path, char_t delimiter = '/') const;
0673 
0674         // Recursively traverse subtree with xml_tree_walker
0675         bool traverse(xml_tree_walker& walker);
0676 
0677     #ifndef PUGIXML_NO_XPATH
0678         // Select single node by evaluating XPath query. Returns first node from the resulting node set.
0679         xpath_node select_node(const char_t* query, xpath_variable_set* variables = PUGIXML_NULL) const;
0680         xpath_node select_node(const xpath_query& query) const;
0681 
0682         // Select node set by evaluating XPath query
0683         xpath_node_set select_nodes(const char_t* query, xpath_variable_set* variables = PUGIXML_NULL) const;
0684         xpath_node_set select_nodes(const xpath_query& query) const;
0685 
0686         // (deprecated: use select_node instead) Select single node by evaluating XPath query.
0687         PUGIXML_DEPRECATED xpath_node select_single_node(const char_t* query, xpath_variable_set* variables = PUGIXML_NULL) const;
0688         PUGIXML_DEPRECATED xpath_node select_single_node(const xpath_query& query) const;
0689 
0690     #endif
0691 
0692         // Print subtree using a writer object
0693         void print(xml_writer& writer, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto, unsigned int depth = 0) const;
0694 
0695     #ifndef PUGIXML_NO_STL
0696         // Print subtree to stream
0697         void print(std::basic_ostream<char, std::char_traits<char> >& os, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto, unsigned int depth = 0) const;
0698         void print(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& os, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, unsigned int depth = 0) const;
0699     #endif
0700 
0701         // Child nodes iterators
0702         typedef xml_node_iterator iterator;
0703 
0704         iterator begin() const;
0705         iterator end() const;
0706 
0707         // Attribute iterators
0708         typedef xml_attribute_iterator attribute_iterator;
0709 
0710         attribute_iterator attributes_begin() const;
0711         attribute_iterator attributes_end() const;
0712 
0713         // Range-based for support
0714         xml_object_range<xml_node_iterator> children() const;
0715         xml_object_range<xml_named_node_iterator> children(const char_t* name) const;
0716         xml_object_range<xml_attribute_iterator> attributes() const;
0717 
0718         // Get node offset in parsed file/string (in char_t units) for debugging purposes
0719         ptrdiff_t offset_debug() const;
0720 
0721         // Get hash value (unique for handles to the same object)
0722         size_t hash_value() const;
0723 
0724         // Get internal pointer
0725         xml_node_struct* internal_object() const;
0726     };
0727 
0728 #ifdef __BORLANDC__
0729     // Borland C++ workaround
0730     bool PUGIXML_FUNCTION operator&&(const xml_node& lhs, bool rhs);
0731     bool PUGIXML_FUNCTION operator||(const xml_node& lhs, bool rhs);
0732 #endif
0733 
0734     // A helper for working with text inside PCDATA nodes
0735     class PUGIXML_CLASS xml_text
0736     {
0737         friend class xml_node;
0738 
0739         xml_node_struct* _root;
0740 
0741         typedef void (*unspecified_bool_type)(xml_text***);
0742 
0743         explicit xml_text(xml_node_struct* root);
0744 
0745         xml_node_struct* _data_new();
0746         xml_node_struct* _data() const;
0747 
0748     public:
0749         // Default constructor. Constructs an empty object.
0750         xml_text();
0751 
0752         // Safe bool conversion operator
0753         operator unspecified_bool_type() const;
0754 
0755         // Borland C++ workaround
0756         bool operator!() const;
0757 
0758         // Check if text object is empty
0759         bool empty() const;
0760 
0761         // Get text, or "" if object is empty
0762         const char_t* get() const;
0763 
0764         // Get text, or the default value if object is empty
0765         const char_t* as_string(const char_t* def = PUGIXML_TEXT("")) const;
0766 
0767         // Get text as a number, or the default value if conversion did not succeed or object is empty
0768         int as_int(int def = 0) const;
0769         unsigned int as_uint(unsigned int def = 0) const;
0770         double as_double(double def = 0) const;
0771         float as_float(float def = 0) const;
0772 
0773     #ifdef PUGIXML_HAS_LONG_LONG
0774         long long as_llong(long long def = 0) const;
0775         unsigned long long as_ullong(unsigned long long def = 0) const;
0776     #endif
0777 
0778         // Get text as bool (returns true if first character is in '1tTyY' set), or the default value if object is empty
0779         bool as_bool(bool def = false) const;
0780 
0781         // Set text (returns false if object is empty or there is not enough memory)
0782         bool set(const char_t* rhs, size_t sz);
0783         bool set(const char_t* rhs);
0784 
0785         // Set text with type conversion (numbers are converted to strings, boolean is converted to "true"/"false")
0786         bool set(int rhs);
0787         bool set(unsigned int rhs);
0788         bool set(long rhs);
0789         bool set(unsigned long rhs);
0790         bool set(double rhs);
0791         bool set(double rhs, int precision);
0792         bool set(float rhs);
0793         bool set(float rhs, int precision);
0794         bool set(bool rhs);
0795 
0796     #ifdef PUGIXML_HAS_LONG_LONG
0797         bool set(long long rhs);
0798         bool set(unsigned long long rhs);
0799     #endif
0800 
0801         // Set text (equivalent to set without error checking)
0802         xml_text& operator=(const char_t* rhs);
0803         xml_text& operator=(int rhs);
0804         xml_text& operator=(unsigned int rhs);
0805         xml_text& operator=(long rhs);
0806         xml_text& operator=(unsigned long rhs);
0807         xml_text& operator=(double rhs);
0808         xml_text& operator=(float rhs);
0809         xml_text& operator=(bool rhs);
0810 
0811     #ifdef PUGIXML_HAS_LONG_LONG
0812         xml_text& operator=(long long rhs);
0813         xml_text& operator=(unsigned long long rhs);
0814     #endif
0815 
0816         // Get the data node (node_pcdata or node_cdata) for this object
0817         xml_node data() const;
0818     };
0819 
0820 #ifdef __BORLANDC__
0821     // Borland C++ workaround
0822     bool PUGIXML_FUNCTION operator&&(const xml_text& lhs, bool rhs);
0823     bool PUGIXML_FUNCTION operator||(const xml_text& lhs, bool rhs);
0824 #endif
0825 
0826     // Child node iterator (a bidirectional iterator over a collection of xml_node)
0827     class PUGIXML_CLASS xml_node_iterator
0828     {
0829         friend class xml_node;
0830 
0831     private:
0832         mutable xml_node _wrap;
0833         xml_node _parent;
0834 
0835         xml_node_iterator(xml_node_struct* ref, xml_node_struct* parent);
0836 
0837     public:
0838         // Iterator traits
0839         typedef ptrdiff_t difference_type;
0840         typedef xml_node value_type;
0841         typedef xml_node* pointer;
0842         typedef xml_node& reference;
0843 
0844     #ifndef PUGIXML_NO_STL
0845         typedef std::bidirectional_iterator_tag iterator_category;
0846     #endif
0847 
0848         // Default constructor
0849         xml_node_iterator();
0850 
0851         // Construct an iterator which points to the specified node
0852         xml_node_iterator(const xml_node& node);
0853 
0854         // Iterator operators
0855         bool operator==(const xml_node_iterator& rhs) const;
0856         bool operator!=(const xml_node_iterator& rhs) const;
0857 
0858         xml_node& operator*() const;
0859         xml_node* operator->() const;
0860 
0861         xml_node_iterator& operator++();
0862         xml_node_iterator operator++(int);
0863 
0864         xml_node_iterator& operator--();
0865         xml_node_iterator operator--(int);
0866     };
0867 
0868     // Attribute iterator (a bidirectional iterator over a collection of xml_attribute)
0869     class PUGIXML_CLASS xml_attribute_iterator
0870     {
0871         friend class xml_node;
0872 
0873     private:
0874         mutable xml_attribute _wrap;
0875         xml_node _parent;
0876 
0877         xml_attribute_iterator(xml_attribute_struct* ref, xml_node_struct* parent);
0878 
0879     public:
0880         // Iterator traits
0881         typedef ptrdiff_t difference_type;
0882         typedef xml_attribute value_type;
0883         typedef xml_attribute* pointer;
0884         typedef xml_attribute& reference;
0885 
0886     #ifndef PUGIXML_NO_STL
0887         typedef std::bidirectional_iterator_tag iterator_category;
0888     #endif
0889 
0890         // Default constructor
0891         xml_attribute_iterator();
0892 
0893         // Construct an iterator which points to the specified attribute
0894         xml_attribute_iterator(const xml_attribute& attr, const xml_node& parent);
0895 
0896         // Iterator operators
0897         bool operator==(const xml_attribute_iterator& rhs) const;
0898         bool operator!=(const xml_attribute_iterator& rhs) const;
0899 
0900         xml_attribute& operator*() const;
0901         xml_attribute* operator->() const;
0902 
0903         xml_attribute_iterator& operator++();
0904         xml_attribute_iterator operator++(int);
0905 
0906         xml_attribute_iterator& operator--();
0907         xml_attribute_iterator operator--(int);
0908     };
0909 
0910     // Named node range helper
0911     class PUGIXML_CLASS xml_named_node_iterator
0912     {
0913         friend class xml_node;
0914 
0915     public:
0916         // Iterator traits
0917         typedef ptrdiff_t difference_type;
0918         typedef xml_node value_type;
0919         typedef xml_node* pointer;
0920         typedef xml_node& reference;
0921 
0922     #ifndef PUGIXML_NO_STL
0923         typedef std::bidirectional_iterator_tag iterator_category;
0924     #endif
0925 
0926         // Default constructor
0927         xml_named_node_iterator();
0928 
0929         // Construct an iterator which points to the specified node
0930         xml_named_node_iterator(const xml_node& node, const char_t* name);
0931 
0932         // Iterator operators
0933         bool operator==(const xml_named_node_iterator& rhs) const;
0934         bool operator!=(const xml_named_node_iterator& rhs) const;
0935 
0936         xml_node& operator*() const;
0937         xml_node* operator->() const;
0938 
0939         xml_named_node_iterator& operator++();
0940         xml_named_node_iterator operator++(int);
0941 
0942         xml_named_node_iterator& operator--();
0943         xml_named_node_iterator operator--(int);
0944 
0945     private:
0946         mutable xml_node _wrap;
0947         xml_node _parent;
0948         const char_t* _name;
0949 
0950         xml_named_node_iterator(xml_node_struct* ref, xml_node_struct* parent, const char_t* name);
0951     };
0952 
0953     // Abstract tree walker class (see xml_node::traverse)
0954     class PUGIXML_CLASS xml_tree_walker
0955     {
0956         friend class xml_node;
0957 
0958     private:
0959         int _depth;
0960 
0961     protected:
0962         // Get current traversal depth
0963         int depth() const;
0964 
0965     public:
0966         xml_tree_walker();
0967         virtual ~xml_tree_walker();
0968 
0969         // Callback that is called when traversal begins
0970         virtual bool begin(xml_node& node);
0971 
0972         // Callback that is called for each node traversed
0973         virtual bool for_each(xml_node& node) = 0;
0974 
0975         // Callback that is called when traversal ends
0976         virtual bool end(xml_node& node);
0977     };
0978 
0979     // Parsing status, returned as part of xml_parse_result object
0980     enum xml_parse_status
0981     {
0982         status_ok = 0,              // No error
0983 
0984         status_file_not_found,      // File was not found during load_file()
0985         status_io_error,            // Error reading from file/stream
0986         status_out_of_memory,       // Could not allocate memory
0987         status_internal_error,      // Internal error occurred
0988 
0989         status_unrecognized_tag,    // Parser could not determine tag type
0990 
0991         status_bad_pi,              // Parsing error occurred while parsing document declaration/processing instruction
0992         status_bad_comment,         // Parsing error occurred while parsing comment
0993         status_bad_cdata,           // Parsing error occurred while parsing CDATA section
0994         status_bad_doctype,         // Parsing error occurred while parsing document type declaration
0995         status_bad_pcdata,          // Parsing error occurred while parsing PCDATA section
0996         status_bad_start_element,   // Parsing error occurred while parsing start element tag
0997         status_bad_attribute,       // Parsing error occurred while parsing element attribute
0998         status_bad_end_element,     // Parsing error occurred while parsing end element tag
0999         status_end_element_mismatch,// There was a mismatch of start-end tags (closing tag had incorrect name, some tag was not closed or there was an excessive closing tag)
1000 
1001         status_append_invalid_root, // Unable to append nodes since root type is not node_element or node_document (exclusive to xml_node::append_buffer)
1002 
1003         status_no_document_element  // Parsing resulted in a document without element nodes
1004     };
1005 
1006     // Parsing result
1007     struct PUGIXML_CLASS xml_parse_result
1008     {
1009         // Parsing status (see xml_parse_status)
1010         xml_parse_status status;
1011 
1012         // Last parsed offset (in char_t units from start of input data)
1013         ptrdiff_t offset;
1014 
1015         // Source document encoding
1016         xml_encoding encoding;
1017 
1018         // Default constructor, initializes object to failed state
1019         xml_parse_result();
1020 
1021         // Cast to bool operator
1022         operator bool() const;
1023 
1024         // Get error description
1025         const char* description() const;
1026     };
1027 
1028     // Document class (DOM tree root)
1029     class PUGIXML_CLASS xml_document: public xml_node
1030     {
1031     private:
1032         char_t* _buffer;
1033 
1034         char _memory[192];
1035 
1036         // Non-copyable semantics
1037         xml_document(const xml_document&);
1038         xml_document& operator=(const xml_document&);
1039 
1040         void _create();
1041         void _destroy();
1042         void _move(xml_document& rhs) PUGIXML_NOEXCEPT_IF_NOT_COMPACT;
1043 
1044     public:
1045         // Default constructor, makes empty document
1046         xml_document();
1047 
1048         // Destructor, invalidates all node/attribute handles to this document
1049         ~xml_document();
1050 
1051     #ifdef PUGIXML_HAS_MOVE
1052         // Move semantics support
1053         xml_document(xml_document&& rhs) PUGIXML_NOEXCEPT_IF_NOT_COMPACT;
1054         xml_document& operator=(xml_document&& rhs) PUGIXML_NOEXCEPT_IF_NOT_COMPACT;
1055     #endif
1056 
1057         // Removes all nodes, leaving the empty document
1058         void reset();
1059 
1060         // Removes all nodes, then copies the entire contents of the specified document
1061         void reset(const xml_document& proto);
1062 
1063     #ifndef PUGIXML_NO_STL
1064         // Load document from stream.
1065         xml_parse_result load(std::basic_istream<char, std::char_traits<char> >& stream, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
1066         xml_parse_result load(std::basic_istream<wchar_t, std::char_traits<wchar_t> >& stream, unsigned int options = parse_default);
1067     #endif
1068 
1069         // (deprecated: use load_string instead) Load document from zero-terminated string. No encoding conversions are applied.
1070         PUGIXML_DEPRECATED xml_parse_result load(const char_t* contents, unsigned int options = parse_default);
1071 
1072         // Load document from zero-terminated string. No encoding conversions are applied.
1073         xml_parse_result load_string(const char_t* contents, unsigned int options = parse_default);
1074 
1075         // Load document from file
1076         xml_parse_result load_file(const char* path, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
1077         xml_parse_result load_file(const wchar_t* path, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
1078 
1079         // Load document from buffer. Copies/converts the buffer, so it may be deleted or changed after the function returns.
1080         xml_parse_result load_buffer(const void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
1081 
1082         // Load document from buffer, using the buffer for in-place parsing (the buffer is modified and used for storage of document data).
1083         // You should ensure that buffer data will persist throughout the document's lifetime, and free the buffer memory manually once document is destroyed.
1084         xml_parse_result load_buffer_inplace(void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
1085 
1086         // Load document from buffer, using the buffer for in-place parsing (the buffer is modified and used for storage of document data).
1087         // You should allocate the buffer with pugixml allocation function; document will free the buffer when it is no longer needed (you can't use it anymore).
1088         xml_parse_result load_buffer_inplace_own(void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
1089 
1090         // Save XML document to writer (semantics is slightly different from xml_node::print, see documentation for details).
1091         void save(xml_writer& writer, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const;
1092 
1093     #ifndef PUGIXML_NO_STL
1094         // Save XML document to stream (semantics is slightly different from xml_node::print, see documentation for details).
1095         void save(std::basic_ostream<char, std::char_traits<char> >& stream, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const;
1096         void save(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& stream, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default) const;
1097     #endif
1098 
1099         // Save XML to file
1100         bool save_file(const char* path, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const;
1101         bool save_file(const wchar_t* path, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const;
1102 
1103         // Get document element
1104         xml_node document_element() const;
1105     };
1106 
1107 #ifndef PUGIXML_NO_XPATH
1108     // XPath query return type
1109     enum xpath_value_type
1110     {
1111         xpath_type_none,      // Unknown type (query failed to compile)
1112         xpath_type_node_set,  // Node set (xpath_node_set)
1113         xpath_type_number,    // Number
1114         xpath_type_string,    // String
1115         xpath_type_boolean    // Boolean
1116     };
1117 
1118     // XPath parsing result
1119     struct PUGIXML_CLASS xpath_parse_result
1120     {
1121         // Error message (0 if no error)
1122         const char* error;
1123 
1124         // Last parsed offset (in char_t units from string start)
1125         ptrdiff_t offset;
1126 
1127         // Default constructor, initializes object to failed state
1128         xpath_parse_result();
1129 
1130         // Cast to bool operator
1131         operator bool() const;
1132 
1133         // Get error description
1134         const char* description() const;
1135     };
1136 
1137     // A single XPath variable
1138     class PUGIXML_CLASS xpath_variable
1139     {
1140         friend class xpath_variable_set;
1141 
1142     protected:
1143         xpath_value_type _type;
1144         xpath_variable* _next;
1145 
1146         xpath_variable(xpath_value_type type);
1147 
1148         // Non-copyable semantics
1149         xpath_variable(const xpath_variable&);
1150         xpath_variable& operator=(const xpath_variable&);
1151 
1152     public:
1153         // Get variable name
1154         const char_t* name() const;
1155 
1156         // Get variable type
1157         xpath_value_type type() const;
1158 
1159         // Get variable value; no type conversion is performed, default value (false, NaN, empty string, empty node set) is returned on type mismatch error
1160         bool get_boolean() const;
1161         double get_number() const;
1162         const char_t* get_string() const;
1163         const xpath_node_set& get_node_set() const;
1164 
1165         // Set variable value; no type conversion is performed, false is returned on type mismatch error
1166         bool set(bool value);
1167         bool set(double value);
1168         bool set(const char_t* value);
1169         bool set(const xpath_node_set& value);
1170     };
1171 
1172     // A set of XPath variables
1173     class PUGIXML_CLASS xpath_variable_set
1174     {
1175     private:
1176         xpath_variable* _data[64];
1177 
1178         void _assign(const xpath_variable_set& rhs);
1179         void _swap(xpath_variable_set& rhs);
1180 
1181         xpath_variable* _find(const char_t* name) const;
1182 
1183         static bool _clone(xpath_variable* var, xpath_variable** out_result);
1184         static void _destroy(xpath_variable* var);
1185 
1186     public:
1187         // Default constructor/destructor
1188         xpath_variable_set();
1189         ~xpath_variable_set();
1190 
1191         // Copy constructor/assignment operator
1192         xpath_variable_set(const xpath_variable_set& rhs);
1193         xpath_variable_set& operator=(const xpath_variable_set& rhs);
1194 
1195     #ifdef PUGIXML_HAS_MOVE
1196         // Move semantics support
1197         xpath_variable_set(xpath_variable_set&& rhs) PUGIXML_NOEXCEPT;
1198         xpath_variable_set& operator=(xpath_variable_set&& rhs) PUGIXML_NOEXCEPT;
1199     #endif
1200 
1201         // Add a new variable or get the existing one, if the types match
1202         xpath_variable* add(const char_t* name, xpath_value_type type);
1203 
1204         // Set value of an existing variable; no type conversion is performed, false is returned if there is no such variable or if types mismatch
1205         bool set(const char_t* name, bool value);
1206         bool set(const char_t* name, double value);
1207         bool set(const char_t* name, const char_t* value);
1208         bool set(const char_t* name, const xpath_node_set& value);
1209 
1210         // Get existing variable by name
1211         xpath_variable* get(const char_t* name);
1212         const xpath_variable* get(const char_t* name) const;
1213     };
1214 
1215     // A compiled XPath query object
1216     class PUGIXML_CLASS xpath_query
1217     {
1218     private:
1219         void* _impl;
1220         xpath_parse_result _result;
1221 
1222         typedef void (*unspecified_bool_type)(xpath_query***);
1223 
1224         // Non-copyable semantics
1225         xpath_query(const xpath_query&);
1226         xpath_query& operator=(const xpath_query&);
1227 
1228     public:
1229         // Construct a compiled object from XPath expression.
1230         // If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on compilation errors.
1231         explicit xpath_query(const char_t* query, xpath_variable_set* variables = PUGIXML_NULL);
1232 
1233         // Constructor
1234         xpath_query();
1235 
1236         // Destructor
1237         ~xpath_query();
1238 
1239     #ifdef PUGIXML_HAS_MOVE
1240         // Move semantics support
1241         xpath_query(xpath_query&& rhs) PUGIXML_NOEXCEPT;
1242         xpath_query& operator=(xpath_query&& rhs) PUGIXML_NOEXCEPT;
1243     #endif
1244 
1245         // Get query expression return type
1246         xpath_value_type return_type() const;
1247 
1248         // Evaluate expression as boolean value in the specified context; performs type conversion if necessary.
1249         // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors.
1250         bool evaluate_boolean(const xpath_node& n) const;
1251 
1252         // Evaluate expression as double value in the specified context; performs type conversion if necessary.
1253         // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors.
1254         double evaluate_number(const xpath_node& n) const;
1255 
1256     #ifndef PUGIXML_NO_STL
1257         // Evaluate expression as string value in the specified context; performs type conversion if necessary.
1258         // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors.
1259         string_t evaluate_string(const xpath_node& n) const;
1260     #endif
1261 
1262         // Evaluate expression as string value in the specified context; performs type conversion if necessary.
1263         // At most capacity characters are written to the destination buffer, full result size is returned (includes terminating zero).
1264         // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors.
1265         // If PUGIXML_NO_EXCEPTIONS is defined, returns empty  set instead.
1266         size_t evaluate_string(char_t* buffer, size_t capacity, const xpath_node& n) const;
1267 
1268         // Evaluate expression as node set in the specified context.
1269         // If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on type mismatch and std::bad_alloc on out of memory errors.
1270         // If PUGIXML_NO_EXCEPTIONS is defined, returns empty node set instead.
1271         xpath_node_set evaluate_node_set(const xpath_node& n) const;
1272 
1273         // Evaluate expression as node set in the specified context.
1274         // Return first node in document order, or empty node if node set is empty.
1275         // If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on type mismatch and std::bad_alloc on out of memory errors.
1276         // If PUGIXML_NO_EXCEPTIONS is defined, returns empty node instead.
1277         xpath_node evaluate_node(const xpath_node& n) const;
1278 
1279         // Get parsing result (used to get compilation errors in PUGIXML_NO_EXCEPTIONS mode)
1280         const xpath_parse_result& result() const;
1281 
1282         // Safe bool conversion operator
1283         operator unspecified_bool_type() const;
1284 
1285         // Borland C++ workaround
1286         bool operator!() const;
1287     };
1288 
1289     #ifndef PUGIXML_NO_EXCEPTIONS
1290         #if defined(_MSC_VER)
1291           // C4275 can be ignored in Visual C++ if you are deriving
1292           // from a type in the Standard C++ Library
1293           #pragma warning(push)
1294           #pragma warning(disable: 4275)
1295         #endif
1296     // XPath exception class
1297     class PUGIXML_CLASS xpath_exception: public std::exception
1298     {
1299     private:
1300         xpath_parse_result _result;
1301 
1302     public:
1303         // Construct exception from parse result
1304         explicit xpath_exception(const xpath_parse_result& result);
1305 
1306         // Get error message
1307         virtual const char* what() const throw() PUGIXML_OVERRIDE;
1308 
1309         // Get parse result
1310         const xpath_parse_result& result() const;
1311     };
1312         #if defined(_MSC_VER)
1313           #pragma warning(pop)
1314         #endif
1315     #endif
1316 
1317     // XPath node class (either xml_node or xml_attribute)
1318     class PUGIXML_CLASS xpath_node
1319     {
1320     private:
1321         xml_node _node;
1322         xml_attribute _attribute;
1323 
1324         typedef void (*unspecified_bool_type)(xpath_node***);
1325 
1326     public:
1327         // Default constructor; constructs empty XPath node
1328         xpath_node();
1329 
1330         // Construct XPath node from XML node/attribute
1331         xpath_node(const xml_node& node);
1332         xpath_node(const xml_attribute& attribute, const xml_node& parent);
1333 
1334         // Get node/attribute, if any
1335         xml_node node() const;
1336         xml_attribute attribute() const;
1337 
1338         // Get parent of contained node/attribute
1339         xml_node parent() const;
1340 
1341         // Safe bool conversion operator
1342         operator unspecified_bool_type() const;
1343 
1344         // Borland C++ workaround
1345         bool operator!() const;
1346 
1347         // Comparison operators
1348         bool operator==(const xpath_node& n) const;
1349         bool operator!=(const xpath_node& n) const;
1350     };
1351 
1352 #ifdef __BORLANDC__
1353     // Borland C++ workaround
1354     bool PUGIXML_FUNCTION operator&&(const xpath_node& lhs, bool rhs);
1355     bool PUGIXML_FUNCTION operator||(const xpath_node& lhs, bool rhs);
1356 #endif
1357 
1358     // A fixed-size collection of XPath nodes
1359     class PUGIXML_CLASS xpath_node_set
1360     {
1361     public:
1362         // Collection type
1363         enum type_t
1364         {
1365             type_unsorted,          // Not ordered
1366             type_sorted,            // Sorted by document order (ascending)
1367             type_sorted_reverse     // Sorted by document order (descending)
1368         };
1369 
1370         // Constant iterator type
1371         typedef const xpath_node* const_iterator;
1372 
1373         // We define non-constant iterator to be the same as constant iterator so that various generic algorithms (i.e. boost foreach) work
1374         typedef const xpath_node* iterator;
1375 
1376         // Default constructor. Constructs empty set.
1377         xpath_node_set();
1378 
1379         // Constructs a set from iterator range; data is not checked for duplicates and is not sorted according to provided type, so be careful
1380         xpath_node_set(const_iterator begin, const_iterator end, type_t type = type_unsorted);
1381 
1382         // Destructor
1383         ~xpath_node_set();
1384 
1385         // Copy constructor/assignment operator
1386         xpath_node_set(const xpath_node_set& ns);
1387         xpath_node_set& operator=(const xpath_node_set& ns);
1388 
1389     #ifdef PUGIXML_HAS_MOVE
1390         // Move semantics support
1391         xpath_node_set(xpath_node_set&& rhs) PUGIXML_NOEXCEPT;
1392         xpath_node_set& operator=(xpath_node_set&& rhs) PUGIXML_NOEXCEPT;
1393     #endif
1394 
1395         // Get collection type
1396         type_t type() const;
1397 
1398         // Get collection size
1399         size_t size() const;
1400 
1401         // Indexing operator
1402         const xpath_node& operator[](size_t index) const;
1403 
1404         // Collection iterators
1405         const_iterator begin() const;
1406         const_iterator end() const;
1407 
1408         // Sort the collection in ascending/descending order by document order
1409         void sort(bool reverse = false);
1410 
1411         // Get first node in the collection by document order
1412         xpath_node first() const;
1413 
1414         // Check if collection is empty
1415         bool empty() const;
1416 
1417     private:
1418         type_t _type;
1419 
1420         xpath_node _storage[1];
1421 
1422         xpath_node* _begin;
1423         xpath_node* _end;
1424 
1425         void _assign(const_iterator begin, const_iterator end, type_t type);
1426         void _move(xpath_node_set& rhs) PUGIXML_NOEXCEPT;
1427     };
1428 #endif
1429 
1430 #ifndef PUGIXML_NO_STL
1431     // Convert wide string to UTF8
1432     std::basic_string<char, std::char_traits<char>, std::allocator<char> > PUGIXML_FUNCTION as_utf8(const wchar_t* str);
1433     std::basic_string<char, std::char_traits<char>, std::allocator<char> > PUGIXML_FUNCTION as_utf8(const std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >& str);
1434 
1435     // Convert UTF8 to wide string
1436     std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > PUGIXML_FUNCTION as_wide(const char* str);
1437     std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > PUGIXML_FUNCTION as_wide(const std::basic_string<char, std::char_traits<char>, std::allocator<char> >& str);
1438 #endif
1439 
1440     // Memory allocation function interface; returns pointer to allocated memory or NULL on failure
1441     typedef void* (*allocation_function)(size_t size);
1442 
1443     // Memory deallocation function interface
1444     typedef void (*deallocation_function)(void* ptr);
1445 
1446     // Override default memory management functions. All subsequent allocations/deallocations will be performed via supplied functions.
1447     void PUGIXML_FUNCTION set_memory_management_functions(allocation_function allocate, deallocation_function deallocate);
1448 
1449     // Get current memory management functions
1450     allocation_function PUGIXML_FUNCTION get_memory_allocation_function();
1451     deallocation_function PUGIXML_FUNCTION get_memory_deallocation_function();
1452 }
1453 
1454 #if !defined(PUGIXML_NO_STL) && (defined(_MSC_VER) || defined(__ICC))
1455 namespace std
1456 {
1457     // Workarounds for (non-standard) iterator category detection for older versions (MSVC7/IC8 and earlier)
1458     std::bidirectional_iterator_tag PUGIXML_FUNCTION _Iter_cat(const pugi::xml_node_iterator&);
1459     std::bidirectional_iterator_tag PUGIXML_FUNCTION _Iter_cat(const pugi::xml_attribute_iterator&);
1460     std::bidirectional_iterator_tag PUGIXML_FUNCTION _Iter_cat(const pugi::xml_named_node_iterator&);
1461 }
1462 #endif
1463 
1464 #if !defined(PUGIXML_NO_STL) && defined(__SUNPRO_CC)
1465 namespace std
1466 {
1467     // Workarounds for (non-standard) iterator category detection
1468     std::bidirectional_iterator_tag PUGIXML_FUNCTION __iterator_category(const pugi::xml_node_iterator&);
1469     std::bidirectional_iterator_tag PUGIXML_FUNCTION __iterator_category(const pugi::xml_attribute_iterator&);
1470     std::bidirectional_iterator_tag PUGIXML_FUNCTION __iterator_category(const pugi::xml_named_node_iterator&);
1471 }
1472 #endif
1473 
1474 #endif
1475 
1476 // Make sure implementation is included in header-only mode
1477 // Use macro expansion in #include to work around QMake (QTBUG-11923)
1478 #if defined(PUGIXML_HEADER_ONLY) && !defined(PUGIXML_SOURCE)
1479 #   define PUGIXML_SOURCE "pugixml.cpp"
1480 #   include PUGIXML_SOURCE
1481 #endif
1482 
1483 /**
1484  * Copyright (c) 2006-2022 Arseny Kapoulkine
1485  *
1486  * Permission is hereby granted, free of charge, to any person
1487  * obtaining a copy of this software and associated documentation
1488  * files (the "Software"), to deal in the Software without
1489  * restriction, including without limitation the rights to use,
1490  * copy, modify, merge, publish, distribute, sublicense, and/or sell
1491  * copies of the Software, and to permit persons to whom the
1492  * Software is furnished to do so, subject to the following
1493  * conditions:
1494  *
1495  * The above copyright notice and this permission notice shall be
1496  * included in all copies or substantial portions of the Software.
1497  *
1498  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
1499  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
1500  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
1501  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
1502  * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
1503  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
1504  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
1505  * OTHER DEALINGS IN THE SOFTWARE.
1506  */