ViewVC Help
View File | Revision Log | View Changeset | Root Listing
root/Oni2/s10k/CommonLibs/pugixml/pugixml.hpp
(Generate patch)

Comparing s10k/CommonLibs/pugixml/pugixml.hpp (file contents):
Revision 1095 by s10k, Thu Oct 5 17:48:32 2017 UTC vs.
Revision 1096 by s10k, Sat Dec 30 14:40:33 2017 UTC

# Line 1 | Line 1
1 < /**
2 < * pugixml parser - version 1.7
3 < * --------------------------------------------------------
4 < * Copyright (C) 2006-2015, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)
5 < * Report bugs and download new versions at http://pugixml.org/
6 < *
7 < * This library is distributed under the MIT License. See notice at the end
8 < * of this file.
9 < *
10 < * This work is based on the pugxml parser, which is:
11 < * Copyright (C) 2003, by Kristen Wegner (kristen@tima.net)
12 < */
13 <
14 < #ifndef PUGIXML_VERSION
15 < // Define version macro; evaluates to major * 100 + minor so that it's safe to use in less-than comparisons
16 < #       define PUGIXML_VERSION 170
17 < #endif
18 <
19 < // Include user configuration file (this can define various configuration macros)
20 < #include "pugiconfig.hpp"
21 <
22 < #ifndef HEADER_PUGIXML_HPP
23 < #define HEADER_PUGIXML_HPP
24 <
25 < // Include stddef.h for size_t and ptrdiff_t
26 < #include <stddef.h>
27 <
28 < // Include exception header for XPath
29 < #if !defined(PUGIXML_NO_XPATH) && !defined(PUGIXML_NO_EXCEPTIONS)
30 < #       include <exception>
31 < #endif
32 <
33 < // Include STL headers
34 < #ifndef PUGIXML_NO_STL
35 < #       include <iterator>
36 < #       include <iosfwd>
37 < #       include <string>
38 < #endif
39 <
40 < // Macro for deprecated features
41 < #ifndef PUGIXML_DEPRECATED
42 < #       if defined(__GNUC__)
43 < #               define PUGIXML_DEPRECATED __attribute__((deprecated))
44 < #       elif defined(_MSC_VER) && _MSC_VER >= 1300
45 < #               define PUGIXML_DEPRECATED __declspec(deprecated)
46 < #       else
47 < #               define PUGIXML_DEPRECATED
48 < #       endif
49 < #endif
50 <
51 < // If no API is defined, assume default
52 < #ifndef PUGIXML_API
53 < #       define PUGIXML_API
54 < #endif
55 <
56 < // If no API for classes is defined, assume default
57 < #ifndef PUGIXML_CLASS
58 < #       define PUGIXML_CLASS PUGIXML_API
59 < #endif
60 <
61 < // If no API for functions is defined, assume default
62 < #ifndef PUGIXML_FUNCTION
63 < #       define PUGIXML_FUNCTION PUGIXML_API
64 < #endif
65 <
66 < // If the platform is known to have long long support, enable long long functions
67 < #ifndef PUGIXML_HAS_LONG_LONG
68 < #       if __cplusplus >= 201103
69 < #               define PUGIXML_HAS_LONG_LONG
70 < #       elif defined(_MSC_VER) && _MSC_VER >= 1400
71 < #               define PUGIXML_HAS_LONG_LONG
72 < #       endif
73 < #endif
74 <
75 < // Character interface macros
76 < #ifdef PUGIXML_WCHAR_MODE
77 < #       define PUGIXML_TEXT(t) L ## t
78 < #       define PUGIXML_CHAR wchar_t
79 < #else
80 < #       define PUGIXML_TEXT(t) t
81 < #       define PUGIXML_CHAR char
82 < #endif
83 <
84 < namespace pugi
85 < {
86 <        // Character type used for all internal storage and operations; depends on PUGIXML_WCHAR_MODE
87 <        typedef PUGIXML_CHAR char_t;
88 <
89 < #ifndef PUGIXML_NO_STL
90 <        // String type used for operations that work with STL string; depends on PUGIXML_WCHAR_MODE
91 <        typedef std::basic_string<PUGIXML_CHAR, std::char_traits<PUGIXML_CHAR>, std::allocator<PUGIXML_CHAR> > string_t;
92 < #endif
93 < }
94 <
95 < // The PugiXML namespace
96 < namespace pugi
97 < {
98 <        // Tree node types
99 <        enum xml_node_type
100 <        {
101 <                node_null,                      // Empty (null) node handle
102 <                node_document,          // A document tree's absolute root
103 <                node_element,           // Element tag, i.e. '<node/>'
104 <                node_pcdata,            // Plain character data, i.e. 'text'
105 <                node_cdata,                     // Character data, i.e. '<![CDATA[text]]>'
106 <                node_comment,           // Comment tag, i.e. '<!-- text -->'
107 <                node_pi,                        // Processing instruction, i.e. '<?name?>'
108 <                node_declaration,       // Document declaration, i.e. '<?xml version="1.0"?>'
109 <                node_doctype            // Document type declaration, i.e. '<!DOCTYPE doc>'
110 <        };
111 <
112 <        // Parsing options
113 <
114 <        // Minimal parsing mode (equivalent to turning all other flags off).
115 <        // Only elements and PCDATA sections are added to the DOM tree, no text conversions are performed.
116 <        const unsigned int parse_minimal = 0x0000;
117 <
118 <        // This flag determines if processing instructions (node_pi) are added to the DOM tree. This flag is off by default.
119 <        const unsigned int parse_pi = 0x0001;
120 <
121 <        // This flag determines if comments (node_comment) are added to the DOM tree. This flag is off by default.
122 <        const unsigned int parse_comments = 0x0002;
123 <
124 <        // This flag determines if CDATA sections (node_cdata) are added to the DOM tree. This flag is on by default.
125 <        const unsigned int parse_cdata = 0x0004;
126 <
127 <        // This flag determines if plain character data (node_pcdata) that consist only of whitespace are added to the DOM tree.
128 <        // This flag is off by default; turning it on usually results in slower parsing and more memory consumption.
129 <        const unsigned int parse_ws_pcdata = 0x0008;
130 <
131 <        // This flag determines if character and entity references are expanded during parsing. This flag is on by default.
132 <        const unsigned int parse_escapes = 0x0010;
133 <
134 <        // This flag determines if EOL characters are normalized (converted to #xA) during parsing. This flag is on by default.
135 <        const unsigned int parse_eol = 0x0020;
136 <        
137 <        // This flag determines if attribute values are normalized using CDATA normalization rules during parsing. This flag is on by default.
138 <        const unsigned int parse_wconv_attribute = 0x0040;
139 <
140 <        // This flag determines if attribute values are normalized using NMTOKENS normalization rules during parsing. This flag is off by default.
141 <        const unsigned int parse_wnorm_attribute = 0x0080;
142 <        
143 <        // This flag determines if document declaration (node_declaration) is added to the DOM tree. This flag is off by default.
144 <        const unsigned int parse_declaration = 0x0100;
145 <
146 <        // This flag determines if document type declaration (node_doctype) is added to the DOM tree. This flag is off by default.
147 <        const unsigned int parse_doctype = 0x0200;
148 <
149 <        // This flag determines if plain character data (node_pcdata) that is the only child of the parent node and that consists only
150 <        // of whitespace is added to the DOM tree.
151 <        // This flag is off by default; turning it on may result in slower parsing and more memory consumption.
152 <        const unsigned int parse_ws_pcdata_single = 0x0400;
153 <
154 <        // This flag determines if leading and trailing whitespace is to be removed from plain character data. This flag is off by default.
155 <        const unsigned int parse_trim_pcdata = 0x0800;
156 <
157 <        // 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
158 <        // is a valid document. This flag is off by default.
159 <        const unsigned int parse_fragment = 0x1000;
160 <
161 <        // The default parsing mode.
162 <        // Elements, PCDATA and CDATA sections are added to the DOM tree, character/reference entities are expanded,
163 <        // End-of-Line characters are normalized, attribute values are normalized using CDATA normalization rules.
164 <        const unsigned int parse_default = parse_cdata | parse_escapes | parse_wconv_attribute | parse_eol;
165 <
166 <        // The full parsing mode.
167 <        // Nodes of all types are added to the DOM tree, character/reference entities are expanded,
168 <        // End-of-Line characters are normalized, attribute values are normalized using CDATA normalization rules.
169 <        const unsigned int parse_full = parse_default | parse_pi | parse_comments | parse_declaration | parse_doctype;
170 <
171 <        // These flags determine the encoding of input data for XML document
172 <        enum xml_encoding
173 <        {
174 <                encoding_auto,          // Auto-detect input encoding using BOM or < / <? detection; use UTF8 if BOM is not found
175 <                encoding_utf8,          // UTF8 encoding
176 <                encoding_utf16_le,      // Little-endian UTF16
177 <                encoding_utf16_be,      // Big-endian UTF16
178 <                encoding_utf16,         // UTF16 with native endianness
179 <                encoding_utf32_le,      // Little-endian UTF32
180 <                encoding_utf32_be,      // Big-endian UTF32
181 <                encoding_utf32,         // UTF32 with native endianness
182 <                encoding_wchar,         // The same encoding wchar_t has (either UTF16 or UTF32)
183 <                encoding_latin1
184 <        };
185 <
186 <        // Formatting flags
187 <        
188 <        // 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.
189 <        const unsigned int format_indent = 0x01;
190 <        
191 <        // Write encoding-specific BOM to the output stream. This flag is off by default.
192 <        const unsigned int format_write_bom = 0x02;
193 <
194 <        // Use raw output mode (no indentation and no line breaks are written). This flag is off by default.
195 <        const unsigned int format_raw = 0x04;
196 <        
197 <        // Omit default XML declaration even if there is no declaration in the document. This flag is off by default.
198 <        const unsigned int format_no_declaration = 0x08;
199 <
200 <        // Don't escape attribute values and PCDATA contents. This flag is off by default.
201 <        const unsigned int format_no_escapes = 0x10;
202 <
203 <        // 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.
204 <        const unsigned int format_save_file_text = 0x20;
205 <
206 <        // Write every attribute on a new line with appropriate indentation. This flag is off by default.
207 <        const unsigned int format_indent_attributes = 0x40;
208 <
209 <        // The default set of formatting flags.
210 <        // Nodes are indented depending on their depth in DOM tree, a default declaration is output if document has none.
211 <        const unsigned int format_default = format_indent;
212 <
213 <        // Forward declarations
214 <        struct xml_attribute_struct;
215 <        struct xml_node_struct;
216 <
217 <        class xml_node_iterator;
218 <        class xml_attribute_iterator;
219 <        class xml_named_node_iterator;
220 <
221 <        class xml_tree_walker;
222 <
223 <        struct xml_parse_result;
224 <
225 <        class xml_node;
226 <
227 <        class xml_text;
228 <        
229 <        #ifndef PUGIXML_NO_XPATH
230 <        class xpath_node;
231 <        class xpath_node_set;
232 <        class xpath_query;
233 <        class xpath_variable_set;
234 <        #endif
235 <
236 <        // Range-based for loop support
237 <        template <typename It> class xml_object_range
238 <        {
239 <        public:
240 <                typedef It const_iterator;
241 <                typedef It iterator;
242 <
243 <                xml_object_range(It b, It e): _begin(b), _end(e)
244 <                {
245 <                }
246 <
247 <                It begin() const { return _begin; }
248 <                It end() const { return _end; }
249 <
250 <        private:
251 <                It _begin, _end;
252 <        };
253 <
254 <        // Writer interface for node printing (see xml_node::print)
255 <        class PUGIXML_CLASS xml_writer
256 <        {
257 <        public:
258 <                virtual ~xml_writer() {}
259 <
260 <                // Write memory chunk into stream/file/whatever
261 <                virtual void write(const void* data, size_t size) = 0;
262 <        };
263 <
264 <        // xml_writer implementation for FILE*
265 <        class PUGIXML_CLASS xml_writer_file: public xml_writer
266 <        {
267 <        public:
268 <                // Construct writer from a FILE* object; void* is used to avoid header dependencies on stdio
269 <                xml_writer_file(void* file);
270 <
271 <                virtual void write(const void* data, size_t size);
272 <
273 <        private:
274 <                void* file;
275 <        };
276 <
277 <        #ifndef PUGIXML_NO_STL
278 <        // xml_writer implementation for streams
279 <        class PUGIXML_CLASS xml_writer_stream: public xml_writer
280 <        {
281 <        public:
282 <                // Construct writer from an output stream object
283 <                xml_writer_stream(std::basic_ostream<char, std::char_traits<char> >& stream);
284 <                xml_writer_stream(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& stream);
285 <
286 <                virtual void write(const void* data, size_t size);
287 <
288 <        private:
289 <                std::basic_ostream<char, std::char_traits<char> >* narrow_stream;
290 <                std::basic_ostream<wchar_t, std::char_traits<wchar_t> >* wide_stream;
291 <        };
292 <        #endif
293 <
294 <        // A light-weight handle for manipulating attributes in DOM tree
295 <        class PUGIXML_CLASS xml_attribute
296 <        {
297 <                friend class xml_attribute_iterator;
298 <                friend class xml_node;
299 <
300 <        private:
301 <                xml_attribute_struct* _attr;
302 <        
303 <                typedef void (*unspecified_bool_type)(xml_attribute***);
304 <
305 <        public:
306 <                // Default constructor. Constructs an empty attribute.
307 <                xml_attribute();
308 <                
309 <                // Constructs attribute from internal pointer
310 <                explicit xml_attribute(xml_attribute_struct* attr);
311 <
312 <                // Safe bool conversion operator
313 <                operator unspecified_bool_type() const;
314 <
315 <                // Borland C++ workaround
316 <                bool operator!() const;
317 <
318 <                // Comparison operators (compares wrapped attribute pointers)
319 <                bool operator==(const xml_attribute& r) const;
320 <                bool operator!=(const xml_attribute& r) const;
321 <                bool operator<(const xml_attribute& r) const;
322 <                bool operator>(const xml_attribute& r) const;
323 <                bool operator<=(const xml_attribute& r) const;
324 <                bool operator>=(const xml_attribute& r) const;
325 <
326 <                // Check if attribute is empty
327 <                bool empty() const;
328 <
329 <                // Get attribute name/value, or "" if attribute is empty
330 <                const char_t* name() const;
331 <                const char_t* value() const;
332 <
333 <                // Get attribute value, or the default value if attribute is empty
334 <                const char_t* as_string(const char_t* def = PUGIXML_TEXT("")) const;
335 <
336 <                // Get attribute value as a number, or the default value if conversion did not succeed or attribute is empty
337 <                int as_int(int def = 0) const;
338 <                unsigned int as_uint(unsigned int def = 0) const;
339 <                double as_double(double def = 0) const;
340 <                float as_float(float def = 0) const;
341 <
342 <        #ifdef PUGIXML_HAS_LONG_LONG
343 <                long long as_llong(long long def = 0) const;
344 <                unsigned long long as_ullong(unsigned long long def = 0) const;
345 <        #endif
346 <
347 <                // Get attribute value as bool (returns true if first character is in '1tTyY' set), or the default value if attribute is empty
348 <                bool as_bool(bool def = false) const;
349 <
350 <                // Set attribute name/value (returns false if attribute is empty or there is not enough memory)
351 <                bool set_name(const char_t* rhs);
352 <                bool set_value(const char_t* rhs);
353 <
354 <                // Set attribute value with type conversion (numbers are converted to strings, boolean is converted to "true"/"false")
355 <                bool set_value(int rhs);
356 <                bool set_value(unsigned int rhs);
357 <                bool set_value(double rhs);
358 <                bool set_value(float rhs);
359 <                bool set_value(bool rhs);
360 <
361 <        #ifdef PUGIXML_HAS_LONG_LONG
362 <                bool set_value(long long rhs);
363 <                bool set_value(unsigned long long rhs);
364 <        #endif
365 <
366 <                // Set attribute value (equivalent to set_value without error checking)
367 <                xml_attribute& operator=(const char_t* rhs);
368 <                xml_attribute& operator=(int rhs);
369 <                xml_attribute& operator=(unsigned int rhs);
370 <                xml_attribute& operator=(double rhs);
371 <                xml_attribute& operator=(float rhs);
372 <                xml_attribute& operator=(bool rhs);
373 <
374 <        #ifdef PUGIXML_HAS_LONG_LONG
375 <                xml_attribute& operator=(long long rhs);
376 <                xml_attribute& operator=(unsigned long long rhs);
377 <        #endif
378 <
379 <                // Get next/previous attribute in the attribute list of the parent node
380 <                xml_attribute next_attribute() const;
381 <                xml_attribute previous_attribute() const;
382 <
383 <                // Get hash value (unique for handles to the same object)
384 <                size_t hash_value() const;
385 <
386 <                // Get internal pointer
387 <                xml_attribute_struct* internal_object() const;
388 <        };
389 <
390 < #ifdef __BORLANDC__
391 <        // Borland C++ workaround
392 <        bool PUGIXML_FUNCTION operator&&(const xml_attribute& lhs, bool rhs);
393 <        bool PUGIXML_FUNCTION operator||(const xml_attribute& lhs, bool rhs);
394 < #endif
395 <
396 <        // A light-weight handle for manipulating nodes in DOM tree
397 <        class PUGIXML_CLASS xml_node
398 <        {
399 <                friend class xml_attribute_iterator;
400 <                friend class xml_node_iterator;
401 <                friend class xml_named_node_iterator;
402 <
403 <        protected:
404 <                xml_node_struct* _root;
405 <
406 <                typedef void (*unspecified_bool_type)(xml_node***);
407 <
408 <        public:
409 <                // Default constructor. Constructs an empty node.
410 <                xml_node();
411 <
412 <                // Constructs node from internal pointer
413 <                explicit xml_node(xml_node_struct* p);
414 <
415 <                // Safe bool conversion operator
416 <                operator unspecified_bool_type() const;
417 <
418 <                // Borland C++ workaround
419 <                bool operator!() const;
420 <        
421 <                // Comparison operators (compares wrapped node pointers)
422 <                bool operator==(const xml_node& r) const;
423 <                bool operator!=(const xml_node& r) const;
424 <                bool operator<(const xml_node& r) const;
425 <                bool operator>(const xml_node& r) const;
426 <                bool operator<=(const xml_node& r) const;
427 <                bool operator>=(const xml_node& r) const;
428 <
429 <                // Check if node is empty.
430 <                bool empty() const;
431 <
432 <                // Get node type
433 <                xml_node_type type() const;
434 <
435 <                // Get node name, or "" if node is empty or it has no name
436 <                const char_t* name() const;
437 <
438 <                // Get node value, or "" if node is empty or it has no value
439 <                // Note: For <node>text</node> node.value() does not return "text"! Use child_value() or text() methods to access text inside nodes.
440 <                const char_t* value() const;
441 <        
442 <                // Get attribute list
443 <                xml_attribute first_attribute() const;
444 <                xml_attribute last_attribute() const;
445 <
446 <                // Get children list
447 <                xml_node first_child() const;
448 <                xml_node last_child() const;
449 <
450 <                // Get next/previous sibling in the children list of the parent node
451 <                xml_node next_sibling() const;
452 <                xml_node previous_sibling() const;
453 <                
454 <                // Get parent node
455 <                xml_node parent() const;
456 <
457 <                // Get root of DOM tree this node belongs to
458 <                xml_node root() const;
459 <
460 <                // Get text object for the current node
461 <                xml_text text() const;
462 <
463 <                // Get child, attribute or next/previous sibling with the specified name
464 <                xml_node child(const char_t* name) const;
465 <                xml_attribute attribute(const char_t* name) const;
466 <                xml_node next_sibling(const char_t* name) const;
467 <                xml_node previous_sibling(const char_t* name) const;
468 <
469 <                // Get attribute, starting the search from a hint (and updating hint so that searching for a sequence of attributes is fast)
470 <                xml_attribute attribute(const char_t* name, xml_attribute& hint) const;
471 <
472 <                // Get child value of current node; that is, value of the first child node of type PCDATA/CDATA
473 <                const char_t* child_value() const;
474 <
475 <                // Get child value of child with specified name. Equivalent to child(name).child_value().
476 <                const char_t* child_value(const char_t* name) const;
477 <
478 <                // Set node name/value (returns false if node is empty, there is not enough memory, or node can not have name/value)
479 <                bool set_name(const char_t* rhs);
480 <                bool set_value(const char_t* rhs);
481 <                
482 <                // Add attribute with specified name. Returns added attribute, or empty attribute on errors.
483 <                xml_attribute append_attribute(const char_t* name);
484 <                xml_attribute prepend_attribute(const char_t* name);
485 <                xml_attribute insert_attribute_after(const char_t* name, const xml_attribute& attr);
486 <                xml_attribute insert_attribute_before(const char_t* name, const xml_attribute& attr);
487 <
488 <                // Add a copy of the specified attribute. Returns added attribute, or empty attribute on errors.
489 <                xml_attribute append_copy(const xml_attribute& proto);
490 <                xml_attribute prepend_copy(const xml_attribute& proto);
491 <                xml_attribute insert_copy_after(const xml_attribute& proto, const xml_attribute& attr);
492 <                xml_attribute insert_copy_before(const xml_attribute& proto, const xml_attribute& attr);
493 <
494 <                // Add child node with specified type. Returns added node, or empty node on errors.
495 <                xml_node append_child(xml_node_type type = node_element);
496 <                xml_node prepend_child(xml_node_type type = node_element);
497 <                xml_node insert_child_after(xml_node_type type, const xml_node& node);
498 <                xml_node insert_child_before(xml_node_type type, const xml_node& node);
499 <
500 <                // Add child element with specified name. Returns added node, or empty node on errors.
501 <                xml_node append_child(const char_t* name);
502 <                xml_node prepend_child(const char_t* name);
503 <                xml_node insert_child_after(const char_t* name, const xml_node& node);
504 <                xml_node insert_child_before(const char_t* name, const xml_node& node);
505 <
506 <                // Add a copy of the specified node as a child. Returns added node, or empty node on errors.
507 <                xml_node append_copy(const xml_node& proto);
508 <                xml_node prepend_copy(const xml_node& proto);
509 <                xml_node insert_copy_after(const xml_node& proto, const xml_node& node);
510 <                xml_node insert_copy_before(const xml_node& proto, const xml_node& node);
511 <
512 <                // Move the specified node to become a child of this node. Returns moved node, or empty node on errors.
513 <                xml_node append_move(const xml_node& moved);
514 <                xml_node prepend_move(const xml_node& moved);
515 <                xml_node insert_move_after(const xml_node& moved, const xml_node& node);
516 <                xml_node insert_move_before(const xml_node& moved, const xml_node& node);
517 <
518 <                // Remove specified attribute
519 <                bool remove_attribute(const xml_attribute& a);
520 <                bool remove_attribute(const char_t* name);
521 <
522 <                // Remove specified child
523 <                bool remove_child(const xml_node& n);
524 <                bool remove_child(const char_t* name);
525 <
526 <                // Parses buffer as an XML document fragment and appends all nodes as children of the current node.
527 <                // Copies/converts the buffer, so it may be deleted or changed after the function returns.
528 <                // Note: append_buffer allocates memory that has the lifetime of the owning document; removing the appended nodes does not immediately reclaim that memory.
529 <                xml_parse_result append_buffer(const void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
530 <
531 <                // Find attribute using predicate. Returns first attribute for which predicate returned true.
532 <                template <typename Predicate> xml_attribute find_attribute(Predicate pred) const
533 <                {
534 <                        if (!_root) return xml_attribute();
535 <                        
536 <                        for (xml_attribute attrib = first_attribute(); attrib; attrib = attrib.next_attribute())
537 <                                if (pred(attrib))
538 <                                        return attrib;
539 <                
540 <                        return xml_attribute();
541 <                }
542 <
543 <                // Find child node using predicate. Returns first child for which predicate returned true.
544 <                template <typename Predicate> xml_node find_child(Predicate pred) const
545 <                {
546 <                        if (!_root) return xml_node();
547 <        
548 <                        for (xml_node node = first_child(); node; node = node.next_sibling())
549 <                                if (pred(node))
550 <                                        return node;
551 <                
552 <                        return xml_node();
553 <                }
554 <
555 <                // Find node from subtree using predicate. Returns first node from subtree (depth-first), for which predicate returned true.
556 <                template <typename Predicate> xml_node find_node(Predicate pred) const
557 <                {
558 <                        if (!_root) return xml_node();
559 <
560 <                        xml_node cur = first_child();
561 <                        
562 <                        while (cur._root && cur._root != _root)
563 <                        {
564 <                                if (pred(cur)) return cur;
565 <
566 <                                if (cur.first_child()) cur = cur.first_child();
567 <                                else if (cur.next_sibling()) cur = cur.next_sibling();
568 <                                else
569 <                                {
570 <                                        while (!cur.next_sibling() && cur._root != _root) cur = cur.parent();
571 <
572 <                                        if (cur._root != _root) cur = cur.next_sibling();
573 <                                }
574 <                        }
575 <
576 <                        return xml_node();
577 <                }
578 <
579 <                // Find child node by attribute name/value
580 <                xml_node find_child_by_attribute(const char_t* name, const char_t* attr_name, const char_t* attr_value) const;
581 <                xml_node find_child_by_attribute(const char_t* attr_name, const char_t* attr_value) const;
582 <
583 <        #ifndef PUGIXML_NO_STL
584 <                // Get the absolute node path from root as a text string.
585 <                string_t path(char_t delimiter = '/') const;
586 <        #endif
587 <
588 <                // Search for a node by path consisting of node names and . or .. elements.
589 <                xml_node first_element_by_path(const char_t* path, char_t delimiter = '/') const;
590 <
591 <                // Recursively traverse subtree with xml_tree_walker
592 <                bool traverse(xml_tree_walker& walker);
593 <        
594 <        #ifndef PUGIXML_NO_XPATH
595 <                // Select single node by evaluating XPath query. Returns first node from the resulting node set.
596 <                xpath_node select_node(const char_t* query, xpath_variable_set* variables = 0) const;
597 <                xpath_node select_node(const xpath_query& query) const;
598 <
599 <                // Select node set by evaluating XPath query
600 <                xpath_node_set select_nodes(const char_t* query, xpath_variable_set* variables = 0) const;
601 <                xpath_node_set select_nodes(const xpath_query& query) const;
602 <
603 <                // (deprecated: use select_node instead) Select single node by evaluating XPath query.
604 <                xpath_node select_single_node(const char_t* query, xpath_variable_set* variables = 0) const;
605 <                xpath_node select_single_node(const xpath_query& query) const;
606 <
607 <        #endif
608 <                
609 <                // Print subtree using a writer object
610 <                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;
611 <
612 <        #ifndef PUGIXML_NO_STL
613 <                // Print subtree to stream
614 <                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;
615 <                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;
616 <        #endif
617 <
618 <                // Child nodes iterators
619 <                typedef xml_node_iterator iterator;
620 <
621 <                iterator begin() const;
622 <                iterator end() const;
623 <
624 <                // Attribute iterators
625 <                typedef xml_attribute_iterator attribute_iterator;
626 <
627 <                attribute_iterator attributes_begin() const;
628 <                attribute_iterator attributes_end() const;
629 <
630 <                // Range-based for support
631 <                xml_object_range<xml_node_iterator> children() const;
632 <                xml_object_range<xml_named_node_iterator> children(const char_t* name) const;
633 <                xml_object_range<xml_attribute_iterator> attributes() const;
634 <
635 <                // Get node offset in parsed file/string (in char_t units) for debugging purposes
636 <                ptrdiff_t offset_debug() const;
637 <
638 <                // Get hash value (unique for handles to the same object)
639 <                size_t hash_value() const;
640 <
641 <                // Get internal pointer
642 <                xml_node_struct* internal_object() const;
643 <        };
644 <
645 < #ifdef __BORLANDC__
646 <        // Borland C++ workaround
647 <        bool PUGIXML_FUNCTION operator&&(const xml_node& lhs, bool rhs);
648 <        bool PUGIXML_FUNCTION operator||(const xml_node& lhs, bool rhs);
649 < #endif
650 <
651 <        // A helper for working with text inside PCDATA nodes
652 <        class PUGIXML_CLASS xml_text
653 <        {
654 <                friend class xml_node;
655 <
656 <                xml_node_struct* _root;
657 <
658 <                typedef void (*unspecified_bool_type)(xml_text***);
659 <
660 <                explicit xml_text(xml_node_struct* root);
661 <
662 <                xml_node_struct* _data_new();
663 <                xml_node_struct* _data() const;
664 <
665 <        public:
666 <                // Default constructor. Constructs an empty object.
667 <                xml_text();
668 <
669 <                // Safe bool conversion operator
670 <                operator unspecified_bool_type() const;
671 <
672 <                // Borland C++ workaround
673 <                bool operator!() const;
674 <
675 <                // Check if text object is empty
676 <                bool empty() const;
677 <
678 <                // Get text, or "" if object is empty
679 <                const char_t* get() const;
680 <
681 <                // Get text, or the default value if object is empty
682 <                const char_t* as_string(const char_t* def = PUGIXML_TEXT("")) const;
683 <
684 <                // Get text as a number, or the default value if conversion did not succeed or object is empty
685 <                int as_int(int def = 0) const;
686 <                unsigned int as_uint(unsigned int def = 0) const;
687 <                double as_double(double def = 0) const;
688 <                float as_float(float def = 0) const;
689 <
690 <        #ifdef PUGIXML_HAS_LONG_LONG
691 <                long long as_llong(long long def = 0) const;
692 <                unsigned long long as_ullong(unsigned long long def = 0) const;
693 <        #endif
694 <
695 <                // Get text as bool (returns true if first character is in '1tTyY' set), or the default value if object is empty
696 <                bool as_bool(bool def = false) const;
697 <
698 <                // Set text (returns false if object is empty or there is not enough memory)
699 <                bool set(const char_t* rhs);
700 <
701 <                // Set text with type conversion (numbers are converted to strings, boolean is converted to "true"/"false")
702 <                bool set(int rhs);
703 <                bool set(unsigned int rhs);
704 <                bool set(double rhs);
705 <                bool set(float rhs);
706 <                bool set(bool rhs);
707 <
708 <        #ifdef PUGIXML_HAS_LONG_LONG
709 <                bool set(long long rhs);
710 <                bool set(unsigned long long rhs);
711 <        #endif
712 <
713 <                // Set text (equivalent to set without error checking)
714 <                xml_text& operator=(const char_t* rhs);
715 <                xml_text& operator=(int rhs);
716 <                xml_text& operator=(unsigned int rhs);
717 <                xml_text& operator=(double rhs);
718 <                xml_text& operator=(float rhs);
719 <                xml_text& operator=(bool rhs);
720 <
721 <        #ifdef PUGIXML_HAS_LONG_LONG
722 <                xml_text& operator=(long long rhs);
723 <                xml_text& operator=(unsigned long long rhs);
724 <        #endif
725 <
726 <                // Get the data node (node_pcdata or node_cdata) for this object
727 <                xml_node data() const;
728 <        };
729 <
730 < #ifdef __BORLANDC__
731 <        // Borland C++ workaround
732 <        bool PUGIXML_FUNCTION operator&&(const xml_text& lhs, bool rhs);
733 <        bool PUGIXML_FUNCTION operator||(const xml_text& lhs, bool rhs);
734 < #endif
735 <
736 <        // Child node iterator (a bidirectional iterator over a collection of xml_node)
737 <        class PUGIXML_CLASS xml_node_iterator
738 <        {
739 <                friend class xml_node;
740 <
741 <        private:
742 <                mutable xml_node _wrap;
743 <                xml_node _parent;
744 <
745 <                xml_node_iterator(xml_node_struct* ref, xml_node_struct* parent);
746 <
747 <        public:
748 <                // Iterator traits
749 <                typedef ptrdiff_t difference_type;
750 <                typedef xml_node value_type;
751 <                typedef xml_node* pointer;
752 <                typedef xml_node& reference;
753 <
754 <        #ifndef PUGIXML_NO_STL
755 <                typedef std::bidirectional_iterator_tag iterator_category;
756 <        #endif
757 <
758 <                // Default constructor
759 <                xml_node_iterator();
760 <
761 <                // Construct an iterator which points to the specified node
762 <                xml_node_iterator(const xml_node& node);
763 <
764 <                // Iterator operators
765 <                bool operator==(const xml_node_iterator& rhs) const;
766 <                bool operator!=(const xml_node_iterator& rhs) const;
767 <
768 <                xml_node& operator*() const;
769 <                xml_node* operator->() const;
770 <
771 <                const xml_node_iterator& operator++();
772 <                xml_node_iterator operator++(int);
773 <
774 <                const xml_node_iterator& operator--();
775 <                xml_node_iterator operator--(int);
776 <        };
777 <
778 <        // Attribute iterator (a bidirectional iterator over a collection of xml_attribute)
779 <        class PUGIXML_CLASS xml_attribute_iterator
780 <        {
781 <                friend class xml_node;
782 <
783 <        private:
784 <                mutable xml_attribute _wrap;
785 <                xml_node _parent;
786 <
787 <                xml_attribute_iterator(xml_attribute_struct* ref, xml_node_struct* parent);
788 <
789 <        public:
790 <                // Iterator traits
791 <                typedef ptrdiff_t difference_type;
792 <                typedef xml_attribute value_type;
793 <                typedef xml_attribute* pointer;
794 <                typedef xml_attribute& reference;
795 <
796 <        #ifndef PUGIXML_NO_STL
797 <                typedef std::bidirectional_iterator_tag iterator_category;
798 <        #endif
799 <
800 <                // Default constructor
801 <                xml_attribute_iterator();
802 <
803 <                // Construct an iterator which points to the specified attribute
804 <                xml_attribute_iterator(const xml_attribute& attr, const xml_node& parent);
805 <
806 <                // Iterator operators
807 <                bool operator==(const xml_attribute_iterator& rhs) const;
808 <                bool operator!=(const xml_attribute_iterator& rhs) const;
809 <
810 <                xml_attribute& operator*() const;
811 <                xml_attribute* operator->() const;
812 <
813 <                const xml_attribute_iterator& operator++();
814 <                xml_attribute_iterator operator++(int);
815 <
816 <                const xml_attribute_iterator& operator--();
817 <                xml_attribute_iterator operator--(int);
818 <        };
819 <
820 <        // Named node range helper
821 <        class PUGIXML_CLASS xml_named_node_iterator
822 <        {
823 <                friend class xml_node;
824 <
825 <        public:
826 <                // Iterator traits
827 <                typedef ptrdiff_t difference_type;
828 <                typedef xml_node value_type;
829 <                typedef xml_node* pointer;
830 <                typedef xml_node& reference;
831 <
832 <        #ifndef PUGIXML_NO_STL
833 <                typedef std::bidirectional_iterator_tag iterator_category;
834 <        #endif
835 <
836 <                // Default constructor
837 <                xml_named_node_iterator();
838 <
839 <                // Construct an iterator which points to the specified node
840 <                xml_named_node_iterator(const xml_node& node, const char_t* name);
841 <
842 <                // Iterator operators
843 <                bool operator==(const xml_named_node_iterator& rhs) const;
844 <                bool operator!=(const xml_named_node_iterator& rhs) const;
845 <
846 <                xml_node& operator*() const;
847 <                xml_node* operator->() const;
848 <
849 <                const xml_named_node_iterator& operator++();
850 <                xml_named_node_iterator operator++(int);
851 <
852 <                const xml_named_node_iterator& operator--();
853 <                xml_named_node_iterator operator--(int);
854 <
855 <        private:
856 <                mutable xml_node _wrap;
857 <                xml_node _parent;
858 <                const char_t* _name;
859 <
860 <                xml_named_node_iterator(xml_node_struct* ref, xml_node_struct* parent, const char_t* name);
861 <        };
862 <
863 <        // Abstract tree walker class (see xml_node::traverse)
864 <        class PUGIXML_CLASS xml_tree_walker
865 <        {
866 <                friend class xml_node;
867 <
868 <        private:
869 <                int _depth;
870 <        
871 <        protected:
872 <                // Get current traversal depth
873 <                int depth() const;
874 <        
875 <        public:
876 <                xml_tree_walker();
877 <                virtual ~xml_tree_walker();
878 <
879 <                // Callback that is called when traversal begins
880 <                virtual bool begin(xml_node& node);
881 <
882 <                // Callback that is called for each node traversed
883 <                virtual bool for_each(xml_node& node) = 0;
884 <
885 <                // Callback that is called when traversal ends
886 <                virtual bool end(xml_node& node);
887 <        };
888 <
889 <        // Parsing status, returned as part of xml_parse_result object
890 <        enum xml_parse_status
891 <        {
892 <                status_ok = 0,                          // No error
893 <
894 <                status_file_not_found,          // File was not found during load_file()
895 <                status_io_error,                        // Error reading from file/stream
896 <                status_out_of_memory,           // Could not allocate memory
897 <                status_internal_error,          // Internal error occurred
898 <
899 <                status_unrecognized_tag,        // Parser could not determine tag type
900 <
901 <                status_bad_pi,                          // Parsing error occurred while parsing document declaration/processing instruction
902 <                status_bad_comment,                     // Parsing error occurred while parsing comment
903 <                status_bad_cdata,                       // Parsing error occurred while parsing CDATA section
904 <                status_bad_doctype,                     // Parsing error occurred while parsing document type declaration
905 <                status_bad_pcdata,                      // Parsing error occurred while parsing PCDATA section
906 <                status_bad_start_element,       // Parsing error occurred while parsing start element tag
907 <                status_bad_attribute,           // Parsing error occurred while parsing element attribute
908 <                status_bad_end_element,         // Parsing error occurred while parsing end element tag
909 <                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)
910 <
911 <                status_append_invalid_root,     // Unable to append nodes since root type is not node_element or node_document (exclusive to xml_node::append_buffer)
912 <
913 <                status_no_document_element      // Parsing resulted in a document without element nodes
914 <        };
915 <
916 <        // Parsing result
917 <        struct PUGIXML_CLASS xml_parse_result
918 <        {
919 <                // Parsing status (see xml_parse_status)
920 <                xml_parse_status status;
921 <
922 <                // Last parsed offset (in char_t units from start of input data)
923 <                ptrdiff_t offset;
924 <
925 <                // Source document encoding
926 <                xml_encoding encoding;
927 <
928 <                // Default constructor, initializes object to failed state
929 <                xml_parse_result();
930 <
931 <                // Cast to bool operator
932 <                operator bool() const;
933 <
934 <                // Get error description
935 <                const char* description() const;
936 <        };
937 <
938 <        // Document class (DOM tree root)
939 <        class PUGIXML_CLASS xml_document: public xml_node
940 <        {
941 <        private:
942 <                char_t* _buffer;
943 <
944 <                char _memory[192];
945 <                
946 <                // Non-copyable semantics
947 <                xml_document(const xml_document&);
948 <                xml_document& operator=(const xml_document&);
949 <
950 <                void create();
951 <                void destroy();
952 <
953 <        public:
954 <                // Default constructor, makes empty document
955 <                xml_document();
956 <
957 <                // Destructor, invalidates all node/attribute handles to this document
958 <                ~xml_document();
959 <
960 <                // Removes all nodes, leaving the empty document
961 <                void reset();
962 <
963 <                // Removes all nodes, then copies the entire contents of the specified document
964 <                void reset(const xml_document& proto);
965 <
966 <        #ifndef PUGIXML_NO_STL
967 <                // Load document from stream.
968 <                xml_parse_result load(std::basic_istream<char, std::char_traits<char> >& stream, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
969 <                xml_parse_result load(std::basic_istream<wchar_t, std::char_traits<wchar_t> >& stream, unsigned int options = parse_default);
970 <        #endif
971 <
972 <                // (deprecated: use load_string instead) Load document from zero-terminated string. No encoding conversions are applied.
973 <                xml_parse_result load(const char_t* contents, unsigned int options = parse_default);
974 <
975 <                // Load document from zero-terminated string. No encoding conversions are applied.
976 <                xml_parse_result load_string(const char_t* contents, unsigned int options = parse_default);
977 <
978 <                // Load document from file
979 <                xml_parse_result load_file(const char* path, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
980 <                xml_parse_result load_file(const wchar_t* path, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
981 <
982 <                // Load document from buffer. Copies/converts the buffer, so it may be deleted or changed after the function returns.
983 <                xml_parse_result load_buffer(const void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
984 <
985 <                // Load document from buffer, using the buffer for in-place parsing (the buffer is modified and used for storage of document data).
986 <                // You should ensure that buffer data will persist throughout the document's lifetime, and free the buffer memory manually once document is destroyed.
987 <                xml_parse_result load_buffer_inplace(void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
988 <
989 <                // Load document from buffer, using the buffer for in-place parsing (the buffer is modified and used for storage of document data).
990 <                // 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).
991 <                xml_parse_result load_buffer_inplace_own(void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
992 <
993 <                // Save XML document to writer (semantics is slightly different from xml_node::print, see documentation for details).
994 <                void save(xml_writer& writer, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const;
995 <
996 <        #ifndef PUGIXML_NO_STL
997 <                // Save XML document to stream (semantics is slightly different from xml_node::print, see documentation for details).
998 <                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;
999 <                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;
1000 <        #endif
1001 <
1002 <                // Save XML to file
1003 <                bool save_file(const char* path, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const;
1004 <                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;
1005 <
1006 <                // Get document element
1007 <                xml_node document_element() const;
1008 <        };
1009 <
1010 < #ifndef PUGIXML_NO_XPATH
1011 <        // XPath query return type
1012 <        enum xpath_value_type
1013 <        {
1014 <                xpath_type_none,          // Unknown type (query failed to compile)
1015 <                xpath_type_node_set,  // Node set (xpath_node_set)
1016 <                xpath_type_number,        // Number
1017 <                xpath_type_string,        // String
1018 <                xpath_type_boolean        // Boolean
1019 <        };
1020 <
1021 <        // XPath parsing result
1022 <        struct PUGIXML_CLASS xpath_parse_result
1023 <        {
1024 <                // Error message (0 if no error)
1025 <                const char* error;
1026 <
1027 <                // Last parsed offset (in char_t units from string start)
1028 <                ptrdiff_t offset;
1029 <
1030 <                // Default constructor, initializes object to failed state
1031 <                xpath_parse_result();
1032 <
1033 <                // Cast to bool operator
1034 <                operator bool() const;
1035 <
1036 <                // Get error description
1037 <                const char* description() const;
1038 <        };
1039 <
1040 <        // A single XPath variable
1041 <        class PUGIXML_CLASS xpath_variable
1042 <        {
1043 <                friend class xpath_variable_set;
1044 <
1045 <        protected:
1046 <                xpath_value_type _type;
1047 <                xpath_variable* _next;
1048 <
1049 <                xpath_variable(xpath_value_type type);
1050 <
1051 <                // Non-copyable semantics
1052 <                xpath_variable(const xpath_variable&);
1053 <                xpath_variable& operator=(const xpath_variable&);
1054 <                
1055 <        public:
1056 <                // Get variable name
1057 <                const char_t* name() const;
1058 <
1059 <                // Get variable type
1060 <                xpath_value_type type() const;
1061 <
1062 <                // Get variable value; no type conversion is performed, default value (false, NaN, empty string, empty node set) is returned on type mismatch error
1063 <                bool get_boolean() const;
1064 <                double get_number() const;
1065 <                const char_t* get_string() const;
1066 <                const xpath_node_set& get_node_set() const;
1067 <
1068 <                // Set variable value; no type conversion is performed, false is returned on type mismatch error
1069 <                bool set(bool value);
1070 <                bool set(double value);
1071 <                bool set(const char_t* value);
1072 <                bool set(const xpath_node_set& value);
1073 <        };
1074 <
1075 <        // A set of XPath variables
1076 <        class PUGIXML_CLASS xpath_variable_set
1077 <        {
1078 <        private:
1079 <                xpath_variable* _data[64];
1080 <
1081 <                void _assign(const xpath_variable_set& rhs);
1082 <                void _swap(xpath_variable_set& rhs);
1083 <
1084 <                xpath_variable* _find(const char_t* name) const;
1085 <
1086 <                static bool _clone(xpath_variable* var, xpath_variable** out_result);
1087 <                static void _destroy(xpath_variable* var);
1088 <
1089 <        public:
1090 <                // Default constructor/destructor
1091 <                xpath_variable_set();
1092 <                ~xpath_variable_set();
1093 <
1094 <                // Copy constructor/assignment operator
1095 <                xpath_variable_set(const xpath_variable_set& rhs);
1096 <                xpath_variable_set& operator=(const xpath_variable_set& rhs);
1097 <
1098 <        #if __cplusplus >= 201103
1099 <                // Move semantics support
1100 <                xpath_variable_set(xpath_variable_set&& rhs);
1101 <                xpath_variable_set& operator=(xpath_variable_set&& rhs);
1102 <        #endif
1103 <
1104 <                // Add a new variable or get the existing one, if the types match
1105 <                xpath_variable* add(const char_t* name, xpath_value_type type);
1106 <
1107 <                // Set value of an existing variable; no type conversion is performed, false is returned if there is no such variable or if types mismatch
1108 <                bool set(const char_t* name, bool value);
1109 <                bool set(const char_t* name, double value);
1110 <                bool set(const char_t* name, const char_t* value);
1111 <                bool set(const char_t* name, const xpath_node_set& value);
1112 <
1113 <                // Get existing variable by name
1114 <                xpath_variable* get(const char_t* name);
1115 <                const xpath_variable* get(const char_t* name) const;
1116 <        };
1117 <
1118 <        // A compiled XPath query object
1119 <        class PUGIXML_CLASS xpath_query
1120 <        {
1121 <        private:
1122 <                void* _impl;
1123 <                xpath_parse_result _result;
1124 <
1125 <                typedef void (*unspecified_bool_type)(xpath_query***);
1126 <
1127 <                // Non-copyable semantics
1128 <                xpath_query(const xpath_query&);
1129 <                xpath_query& operator=(const xpath_query&);
1130 <
1131 <        public:
1132 <                // Construct a compiled object from XPath expression.
1133 <                // If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on compilation errors.
1134 <                explicit xpath_query(const char_t* query, xpath_variable_set* variables = 0);
1135 <
1136 <                // Constructor
1137 <                xpath_query();
1138 <
1139 <                // Destructor
1140 <                ~xpath_query();
1141 <
1142 <        #if __cplusplus >= 201103
1143 <                // Move semantics support
1144 <                xpath_query(xpath_query&& rhs);
1145 <                xpath_query& operator=(xpath_query&& rhs);
1146 <        #endif
1147 <
1148 <                // Get query expression return type
1149 <                xpath_value_type return_type() const;
1150 <                
1151 <                // Evaluate expression as boolean value in the specified context; performs type conversion if necessary.
1152 <                // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors.
1153 <                bool evaluate_boolean(const xpath_node& n) const;
1154 <                
1155 <                // Evaluate expression as double value in the specified context; performs type conversion if necessary.
1156 <                // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors.
1157 <                double evaluate_number(const xpath_node& n) const;
1158 <                
1159 <        #ifndef PUGIXML_NO_STL
1160 <                // Evaluate expression as string value in the specified context; performs type conversion if necessary.
1161 <                // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors.
1162 <                string_t evaluate_string(const xpath_node& n) const;
1163 <        #endif
1164 <                
1165 <                // Evaluate expression as string value in the specified context; performs type conversion if necessary.
1166 <                // At most capacity characters are written to the destination buffer, full result size is returned (includes terminating zero).
1167 <                // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors.
1168 <                // If PUGIXML_NO_EXCEPTIONS is defined, returns empty  set instead.
1169 <                size_t evaluate_string(char_t* buffer, size_t capacity, const xpath_node& n) const;
1170 <
1171 <                // Evaluate expression as node set in the specified context.
1172 <                // If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on type mismatch and std::bad_alloc on out of memory errors.
1173 <                // If PUGIXML_NO_EXCEPTIONS is defined, returns empty node set instead.
1174 <                xpath_node_set evaluate_node_set(const xpath_node& n) const;
1175 <
1176 <                // Evaluate expression as node set in the specified context.
1177 <                // Return first node in document order, or empty node if node set is empty.
1178 <                // If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on type mismatch and std::bad_alloc on out of memory errors.
1179 <                // If PUGIXML_NO_EXCEPTIONS is defined, returns empty node instead.
1180 <                xpath_node evaluate_node(const xpath_node& n) const;
1181 <
1182 <                // Get parsing result (used to get compilation errors in PUGIXML_NO_EXCEPTIONS mode)
1183 <                const xpath_parse_result& result() const;
1184 <
1185 <                // Safe bool conversion operator
1186 <                operator unspecified_bool_type() const;
1187 <
1188 <                // Borland C++ workaround
1189 <                bool operator!() const;
1190 <        };
1191 <        
1192 <        #ifndef PUGIXML_NO_EXCEPTIONS
1193 <        // XPath exception class
1194 <        class PUGIXML_CLASS xpath_exception: public std::exception
1195 <        {
1196 <        private:
1197 <                xpath_parse_result _result;
1198 <
1199 <        public:
1200 <                // Construct exception from parse result
1201 <                explicit xpath_exception(const xpath_parse_result& result);
1202 <
1203 <                // Get error message
1204 <                virtual const char* what() const throw();
1205 <
1206 <                // Get parse result
1207 <                const xpath_parse_result& result() const;
1208 <        };
1209 <        #endif
1210 <        
1211 <        // XPath node class (either xml_node or xml_attribute)
1212 <        class PUGIXML_CLASS xpath_node
1213 <        {
1214 <        private:
1215 <                xml_node _node;
1216 <                xml_attribute _attribute;
1217 <        
1218 <                typedef void (*unspecified_bool_type)(xpath_node***);
1219 <
1220 <        public:
1221 <                // Default constructor; constructs empty XPath node
1222 <                xpath_node();
1223 <                
1224 <                // Construct XPath node from XML node/attribute
1225 <                xpath_node(const xml_node& node);
1226 <                xpath_node(const xml_attribute& attribute, const xml_node& parent);
1227 <
1228 <                // Get node/attribute, if any
1229 <                xml_node node() const;
1230 <                xml_attribute attribute() const;
1231 <                
1232 <                // Get parent of contained node/attribute
1233 <                xml_node parent() const;
1234 <
1235 <                // Safe bool conversion operator
1236 <                operator unspecified_bool_type() const;
1237 <                
1238 <                // Borland C++ workaround
1239 <                bool operator!() const;
1240 <
1241 <                // Comparison operators
1242 <                bool operator==(const xpath_node& n) const;
1243 <                bool operator!=(const xpath_node& n) const;
1244 <        };
1245 <
1246 < #ifdef __BORLANDC__
1247 <        // Borland C++ workaround
1248 <        bool PUGIXML_FUNCTION operator&&(const xpath_node& lhs, bool rhs);
1249 <        bool PUGIXML_FUNCTION operator||(const xpath_node& lhs, bool rhs);
1250 < #endif
1251 <
1252 <        // A fixed-size collection of XPath nodes
1253 <        class PUGIXML_CLASS xpath_node_set
1254 <        {
1255 <        public:
1256 <                // Collection type
1257 <                enum type_t
1258 <                {
1259 <                        type_unsorted,                  // Not ordered
1260 <                        type_sorted,                    // Sorted by document order (ascending)
1261 <                        type_sorted_reverse             // Sorted by document order (descending)
1262 <                };
1263 <                
1264 <                // Constant iterator type
1265 <                typedef const xpath_node* const_iterator;
1266 <
1267 <                // We define non-constant iterator to be the same as constant iterator so that various generic algorithms (i.e. boost foreach) work
1268 <                typedef const xpath_node* iterator;
1269 <        
1270 <                // Default constructor. Constructs empty set.
1271 <                xpath_node_set();
1272 <
1273 <                // Constructs a set from iterator range; data is not checked for duplicates and is not sorted according to provided type, so be careful
1274 <                xpath_node_set(const_iterator begin, const_iterator end, type_t type = type_unsorted);
1275 <
1276 <                // Destructor
1277 <                ~xpath_node_set();
1278 <                
1279 <                // Copy constructor/assignment operator
1280 <                xpath_node_set(const xpath_node_set& ns);
1281 <                xpath_node_set& operator=(const xpath_node_set& ns);
1282 <
1283 <        #if __cplusplus >= 201103
1284 <                // Move semantics support
1285 <                xpath_node_set(xpath_node_set&& rhs);
1286 <                xpath_node_set& operator=(xpath_node_set&& rhs);
1287 <        #endif
1288 <
1289 <                // Get collection type
1290 <                type_t type() const;
1291 <                
1292 <                // Get collection size
1293 <                size_t size() const;
1294 <
1295 <                // Indexing operator
1296 <                const xpath_node& operator[](size_t index) const;
1297 <                
1298 <                // Collection iterators
1299 <                const_iterator begin() const;
1300 <                const_iterator end() const;
1301 <
1302 <                // Sort the collection in ascending/descending order by document order
1303 <                void sort(bool reverse = false);
1304 <                
1305 <                // Get first node in the collection by document order
1306 <                xpath_node first() const;
1307 <                
1308 <                // Check if collection is empty
1309 <                bool empty() const;
1310 <        
1311 <        private:
1312 <                type_t _type;
1313 <                
1314 <                xpath_node _storage;
1315 <                
1316 <                xpath_node* _begin;
1317 <                xpath_node* _end;
1318 <
1319 <                void _assign(const_iterator begin, const_iterator end, type_t type);
1320 <                void _move(xpath_node_set& rhs);
1321 <        };
1322 < #endif
1323 <
1324 < #ifndef PUGIXML_NO_STL
1325 <        // Convert wide string to UTF8
1326 <        std::basic_string<char, std::char_traits<char>, std::allocator<char> > PUGIXML_FUNCTION as_utf8(const wchar_t* str);
1327 <        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);
1328 <        
1329 <        // Convert UTF8 to wide string
1330 <        std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > PUGIXML_FUNCTION as_wide(const char* str);
1331 <        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);
1332 < #endif
1333 <
1334 <        // Memory allocation function interface; returns pointer to allocated memory or NULL on failure
1335 <        typedef void* (*allocation_function)(size_t size);
1336 <        
1337 <        // Memory deallocation function interface
1338 <        typedef void (*deallocation_function)(void* ptr);
1339 <
1340 <        // Override default memory management functions. All subsequent allocations/deallocations will be performed via supplied functions.
1341 <        void PUGIXML_FUNCTION set_memory_management_functions(allocation_function allocate, deallocation_function deallocate);
1342 <        
1343 <        // Get current memory management functions
1344 <        allocation_function PUGIXML_FUNCTION get_memory_allocation_function();
1345 <        deallocation_function PUGIXML_FUNCTION get_memory_deallocation_function();
1346 < }
1347 <
1348 < #if !defined(PUGIXML_NO_STL) && (defined(_MSC_VER) || defined(__ICC))
1349 < namespace std
1350 < {
1351 <        // Workarounds for (non-standard) iterator category detection for older versions (MSVC7/IC8 and earlier)
1352 <        std::bidirectional_iterator_tag PUGIXML_FUNCTION _Iter_cat(const pugi::xml_node_iterator&);
1353 <        std::bidirectional_iterator_tag PUGIXML_FUNCTION _Iter_cat(const pugi::xml_attribute_iterator&);
1354 <        std::bidirectional_iterator_tag PUGIXML_FUNCTION _Iter_cat(const pugi::xml_named_node_iterator&);
1355 < }
1356 < #endif
1357 <
1358 < #if !defined(PUGIXML_NO_STL) && defined(__SUNPRO_CC)
1359 < namespace std
1360 < {
1361 <        // Workarounds for (non-standard) iterator category detection
1362 <        std::bidirectional_iterator_tag PUGIXML_FUNCTION __iterator_category(const pugi::xml_node_iterator&);
1363 <        std::bidirectional_iterator_tag PUGIXML_FUNCTION __iterator_category(const pugi::xml_attribute_iterator&);
1364 <        std::bidirectional_iterator_tag PUGIXML_FUNCTION __iterator_category(const pugi::xml_named_node_iterator&);
1365 < }
1366 < #endif
1367 <
1368 < #endif
1369 <
1370 < // Make sure implementation is included in header-only mode
1371 < // Use macro expansion in #include to work around QMake (QTBUG-11923)
1372 < #if defined(PUGIXML_HEADER_ONLY) && !defined(PUGIXML_SOURCE)
1373 < #       define PUGIXML_SOURCE "pugixml.cpp"
1374 < #       include PUGIXML_SOURCE
1375 < #endif
1376 <
1377 < /**
1378 < * Copyright (c) 2006-2015 Arseny Kapoulkine
1379 < *
1380 < * Permission is hereby granted, free of charge, to any person
1381 < * obtaining a copy of this software and associated documentation
1382 < * files (the "Software"), to deal in the Software without
1383 < * restriction, including without limitation the rights to use,
1384 < * copy, modify, merge, publish, distribute, sublicense, and/or sell
1385 < * copies of the Software, and to permit persons to whom the
1386 < * Software is furnished to do so, subject to the following
1387 < * conditions:
1388 < *
1389 < * The above copyright notice and this permission notice shall be
1390 < * included in all copies or substantial portions of the Software.
1391 < *
1392 < * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
1393 < * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
1394 < * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
1395 < * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
1396 < * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
1397 < * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
1398 < * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
1399 < * OTHER DEALINGS IN THE SOFTWARE.
1400 < */
1 > /**
2 > * pugixml parser - version 1.7
3 > * --------------------------------------------------------
4 > * Copyright (C) 2006-2015, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)
5 > * Report bugs and download new versions at http://pugixml.org/
6 > *
7 > * This library is distributed under the MIT License. See notice at the end
8 > * of this file.
9 > *
10 > * This work is based on the pugxml parser, which is:
11 > * Copyright (C) 2003, by Kristen Wegner (kristen@tima.net)
12 > */
13 >
14 > #ifndef PUGIXML_VERSION
15 > // Define version macro; evaluates to major * 100 + minor so that it's safe to use in less-than comparisons
16 > #       define PUGIXML_VERSION 170
17 > #endif
18 >
19 > // Include user configuration file (this can define various configuration macros)
20 > #include "pugiconfig.hpp"
21 >
22 > #ifndef HEADER_PUGIXML_HPP
23 > #define HEADER_PUGIXML_HPP
24 >
25 > // Include stddef.h for size_t and ptrdiff_t
26 > #include <stddef.h>
27 >
28 > // Include exception header for XPath
29 > #if !defined(PUGIXML_NO_XPATH) && !defined(PUGIXML_NO_EXCEPTIONS)
30 > #       include <exception>
31 > #endif
32 >
33 > // Include STL headers
34 > #ifndef PUGIXML_NO_STL
35 > #       include <iterator>
36 > #       include <iosfwd>
37 > #       include <string>
38 > #endif
39 >
40 > // Macro for deprecated features
41 > #ifndef PUGIXML_DEPRECATED
42 > #       if defined(__GNUC__)
43 > #               define PUGIXML_DEPRECATED __attribute__((deprecated))
44 > #       elif defined(_MSC_VER) && _MSC_VER >= 1300
45 > #               define PUGIXML_DEPRECATED __declspec(deprecated)
46 > #       else
47 > #               define PUGIXML_DEPRECATED
48 > #       endif
49 > #endif
50 >
51 > // If no API is defined, assume default
52 > #ifndef PUGIXML_API
53 > #       define PUGIXML_API
54 > #endif
55 >
56 > // If no API for classes is defined, assume default
57 > #ifndef PUGIXML_CLASS
58 > #       define PUGIXML_CLASS PUGIXML_API
59 > #endif
60 >
61 > // If no API for functions is defined, assume default
62 > #ifndef PUGIXML_FUNCTION
63 > #       define PUGIXML_FUNCTION PUGIXML_API
64 > #endif
65 >
66 > // If the platform is known to have long long support, enable long long functions
67 > #ifndef PUGIXML_HAS_LONG_LONG
68 > #       if __cplusplus >= 201103
69 > #               define PUGIXML_HAS_LONG_LONG
70 > #       elif defined(_MSC_VER) && _MSC_VER >= 1400
71 > #               define PUGIXML_HAS_LONG_LONG
72 > #       endif
73 > #endif
74 >
75 > // Character interface macros
76 > #ifdef PUGIXML_WCHAR_MODE
77 > #       define PUGIXML_TEXT(t) L ## t
78 > #       define PUGIXML_CHAR wchar_t
79 > #else
80 > #       define PUGIXML_TEXT(t) t
81 > #       define PUGIXML_CHAR char
82 > #endif
83 >
84 > namespace pugi
85 > {
86 >        // Character type used for all internal storage and operations; depends on PUGIXML_WCHAR_MODE
87 >        typedef PUGIXML_CHAR char_t;
88 >
89 > #ifndef PUGIXML_NO_STL
90 >        // String type used for operations that work with STL string; depends on PUGIXML_WCHAR_MODE
91 >        typedef std::basic_string<PUGIXML_CHAR, std::char_traits<PUGIXML_CHAR>, std::allocator<PUGIXML_CHAR> > string_t;
92 > #endif
93 > }
94 >
95 > // The PugiXML namespace
96 > namespace pugi
97 > {
98 >        // Tree node types
99 >        enum xml_node_type
100 >        {
101 >                node_null,                      // Empty (null) node handle
102 >                node_document,          // A document tree's absolute root
103 >                node_element,           // Element tag, i.e. '<node/>'
104 >                node_pcdata,            // Plain character data, i.e. 'text'
105 >                node_cdata,                     // Character data, i.e. '<![CDATA[text]]>'
106 >                node_comment,           // Comment tag, i.e. '<!-- text -->'
107 >                node_pi,                        // Processing instruction, i.e. '<?name?>'
108 >                node_declaration,       // Document declaration, i.e. '<?xml version="1.0"?>'
109 >                node_doctype            // Document type declaration, i.e. '<!DOCTYPE doc>'
110 >        };
111 >
112 >        // Parsing options
113 >
114 >        // Minimal parsing mode (equivalent to turning all other flags off).
115 >        // Only elements and PCDATA sections are added to the DOM tree, no text conversions are performed.
116 >        const unsigned int parse_minimal = 0x0000;
117 >
118 >        // This flag determines if processing instructions (node_pi) are added to the DOM tree. This flag is off by default.
119 >        const unsigned int parse_pi = 0x0001;
120 >
121 >        // This flag determines if comments (node_comment) are added to the DOM tree. This flag is off by default.
122 >        const unsigned int parse_comments = 0x0002;
123 >
124 >        // This flag determines if CDATA sections (node_cdata) are added to the DOM tree. This flag is on by default.
125 >        const unsigned int parse_cdata = 0x0004;
126 >
127 >        // This flag determines if plain character data (node_pcdata) that consist only of whitespace are added to the DOM tree.
128 >        // This flag is off by default; turning it on usually results in slower parsing and more memory consumption.
129 >        const unsigned int parse_ws_pcdata = 0x0008;
130 >
131 >        // This flag determines if character and entity references are expanded during parsing. This flag is on by default.
132 >        const unsigned int parse_escapes = 0x0010;
133 >
134 >        // This flag determines if EOL characters are normalized (converted to #xA) during parsing. This flag is on by default.
135 >        const unsigned int parse_eol = 0x0020;
136 >        
137 >        // This flag determines if attribute values are normalized using CDATA normalization rules during parsing. This flag is on by default.
138 >        const unsigned int parse_wconv_attribute = 0x0040;
139 >
140 >        // This flag determines if attribute values are normalized using NMTOKENS normalization rules during parsing. This flag is off by default.
141 >        const unsigned int parse_wnorm_attribute = 0x0080;
142 >        
143 >        // This flag determines if document declaration (node_declaration) is added to the DOM tree. This flag is off by default.
144 >        const unsigned int parse_declaration = 0x0100;
145 >
146 >        // This flag determines if document type declaration (node_doctype) is added to the DOM tree. This flag is off by default.
147 >        const unsigned int parse_doctype = 0x0200;
148 >
149 >        // This flag determines if plain character data (node_pcdata) that is the only child of the parent node and that consists only
150 >        // of whitespace is added to the DOM tree.
151 >        // This flag is off by default; turning it on may result in slower parsing and more memory consumption.
152 >        const unsigned int parse_ws_pcdata_single = 0x0400;
153 >
154 >        // This flag determines if leading and trailing whitespace is to be removed from plain character data. This flag is off by default.
155 >        const unsigned int parse_trim_pcdata = 0x0800;
156 >
157 >        // 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
158 >        // is a valid document. This flag is off by default.
159 >        const unsigned int parse_fragment = 0x1000;
160 >
161 >        // The default parsing mode.
162 >        // Elements, PCDATA and CDATA sections are added to the DOM tree, character/reference entities are expanded,
163 >        // End-of-Line characters are normalized, attribute values are normalized using CDATA normalization rules.
164 >        const unsigned int parse_default = parse_cdata | parse_escapes | parse_wconv_attribute | parse_eol;
165 >
166 >        // The full parsing mode.
167 >        // Nodes of all types are added to the DOM tree, character/reference entities are expanded,
168 >        // End-of-Line characters are normalized, attribute values are normalized using CDATA normalization rules.
169 >        const unsigned int parse_full = parse_default | parse_pi | parse_comments | parse_declaration | parse_doctype;
170 >
171 >        // These flags determine the encoding of input data for XML document
172 >        enum xml_encoding
173 >        {
174 >                encoding_auto,          // Auto-detect input encoding using BOM or < / <? detection; use UTF8 if BOM is not found
175 >                encoding_utf8,          // UTF8 encoding
176 >                encoding_utf16_le,      // Little-endian UTF16
177 >                encoding_utf16_be,      // Big-endian UTF16
178 >                encoding_utf16,         // UTF16 with native endianness
179 >                encoding_utf32_le,      // Little-endian UTF32
180 >                encoding_utf32_be,      // Big-endian UTF32
181 >                encoding_utf32,         // UTF32 with native endianness
182 >                encoding_wchar,         // The same encoding wchar_t has (either UTF16 or UTF32)
183 >                encoding_latin1
184 >        };
185 >
186 >        // Formatting flags
187 >        
188 >        // 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.
189 >        const unsigned int format_indent = 0x01;
190 >        
191 >        // Write encoding-specific BOM to the output stream. This flag is off by default.
192 >        const unsigned int format_write_bom = 0x02;
193 >
194 >        // Use raw output mode (no indentation and no line breaks are written). This flag is off by default.
195 >        const unsigned int format_raw = 0x04;
196 >        
197 >        // Omit default XML declaration even if there is no declaration in the document. This flag is off by default.
198 >        const unsigned int format_no_declaration = 0x08;
199 >
200 >        // Don't escape attribute values and PCDATA contents. This flag is off by default.
201 >        const unsigned int format_no_escapes = 0x10;
202 >
203 >        // 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.
204 >        const unsigned int format_save_file_text = 0x20;
205 >
206 >        // Write every attribute on a new line with appropriate indentation. This flag is off by default.
207 >        const unsigned int format_indent_attributes = 0x40;
208 >
209 >        // The default set of formatting flags.
210 >        // Nodes are indented depending on their depth in DOM tree, a default declaration is output if document has none.
211 >        const unsigned int format_default = format_indent;
212 >
213 >        // Forward declarations
214 >        struct xml_attribute_struct;
215 >        struct xml_node_struct;
216 >
217 >        class xml_node_iterator;
218 >        class xml_attribute_iterator;
219 >        class xml_named_node_iterator;
220 >
221 >        class xml_tree_walker;
222 >
223 >        struct xml_parse_result;
224 >
225 >        class xml_node;
226 >
227 >        class xml_text;
228 >        
229 >        #ifndef PUGIXML_NO_XPATH
230 >        class xpath_node;
231 >        class xpath_node_set;
232 >        class xpath_query;
233 >        class xpath_variable_set;
234 >        #endif
235 >
236 >        // Range-based for loop support
237 >        template <typename It> class xml_object_range
238 >        {
239 >        public:
240 >                typedef It const_iterator;
241 >                typedef It iterator;
242 >
243 >                xml_object_range(It b, It e): _begin(b), _end(e)
244 >                {
245 >                }
246 >
247 >                It begin() const { return _begin; }
248 >                It end() const { return _end; }
249 >
250 >        private:
251 >                It _begin, _end;
252 >        };
253 >
254 >        // Writer interface for node printing (see xml_node::print)
255 >        class PUGIXML_CLASS xml_writer
256 >        {
257 >        public:
258 >                virtual ~xml_writer() {}
259 >
260 >                // Write memory chunk into stream/file/whatever
261 >                virtual void write(const void* data, size_t size) = 0;
262 >        };
263 >
264 >        // xml_writer implementation for FILE*
265 >        class PUGIXML_CLASS xml_writer_file: public xml_writer
266 >        {
267 >        public:
268 >                // Construct writer from a FILE* object; void* is used to avoid header dependencies on stdio
269 >                xml_writer_file(void* file);
270 >
271 >                virtual void write(const void* data, size_t size);
272 >
273 >        private:
274 >                void* file;
275 >        };
276 >
277 >        #ifndef PUGIXML_NO_STL
278 >        // xml_writer implementation for streams
279 >        class PUGIXML_CLASS xml_writer_stream: public xml_writer
280 >        {
281 >        public:
282 >                // Construct writer from an output stream object
283 >                xml_writer_stream(std::basic_ostream<char, std::char_traits<char> >& stream);
284 >                xml_writer_stream(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& stream);
285 >
286 >                virtual void write(const void* data, size_t size);
287 >
288 >        private:
289 >                std::basic_ostream<char, std::char_traits<char> >* narrow_stream;
290 >                std::basic_ostream<wchar_t, std::char_traits<wchar_t> >* wide_stream;
291 >        };
292 >        #endif
293 >
294 >        // A light-weight handle for manipulating attributes in DOM tree
295 >        class PUGIXML_CLASS xml_attribute
296 >        {
297 >                friend class xml_attribute_iterator;
298 >                friend class xml_node;
299 >
300 >        private:
301 >                xml_attribute_struct* _attr;
302 >        
303 >                typedef void (*unspecified_bool_type)(xml_attribute***);
304 >
305 >        public:
306 >                // Default constructor. Constructs an empty attribute.
307 >                xml_attribute();
308 >                
309 >                // Constructs attribute from internal pointer
310 >                explicit xml_attribute(xml_attribute_struct* attr);
311 >
312 >                // Safe bool conversion operator
313 >                operator unspecified_bool_type() const;
314 >
315 >                // Borland C++ workaround
316 >                bool operator!() const;
317 >
318 >                // Comparison operators (compares wrapped attribute pointers)
319 >                bool operator==(const xml_attribute& r) const;
320 >                bool operator!=(const xml_attribute& r) const;
321 >                bool operator<(const xml_attribute& r) const;
322 >                bool operator>(const xml_attribute& r) const;
323 >                bool operator<=(const xml_attribute& r) const;
324 >                bool operator>=(const xml_attribute& r) const;
325 >
326 >                // Check if attribute is empty
327 >                bool empty() const;
328 >
329 >                // Get attribute name/value, or "" if attribute is empty
330 >                const char_t* name() const;
331 >                const char_t* value() const;
332 >
333 >                // Get attribute value, or the default value if attribute is empty
334 >                const char_t* as_string(const char_t* def = PUGIXML_TEXT("")) const;
335 >
336 >                // Get attribute value as a number, or the default value if conversion did not succeed or attribute is empty
337 >                int as_int(int def = 0) const;
338 >                unsigned int as_uint(unsigned int def = 0) const;
339 >                double as_double(double def = 0) const;
340 >                float as_float(float def = 0) const;
341 >
342 >        #ifdef PUGIXML_HAS_LONG_LONG
343 >                long long as_llong(long long def = 0) const;
344 >                unsigned long long as_ullong(unsigned long long def = 0) const;
345 >        #endif
346 >
347 >                // Get attribute value as bool (returns true if first character is in '1tTyY' set), or the default value if attribute is empty
348 >                bool as_bool(bool def = false) const;
349 >
350 >                // Set attribute name/value (returns false if attribute is empty or there is not enough memory)
351 >                bool set_name(const char_t* rhs);
352 >                bool set_value(const char_t* rhs);
353 >
354 >                // Set attribute value with type conversion (numbers are converted to strings, boolean is converted to "true"/"false")
355 >                bool set_value(int rhs);
356 >                bool set_value(unsigned int rhs);
357 >                bool set_value(double rhs);
358 >                bool set_value(float rhs);
359 >                bool set_value(bool rhs);
360 >
361 >        #ifdef PUGIXML_HAS_LONG_LONG
362 >                bool set_value(long long rhs);
363 >                bool set_value(unsigned long long rhs);
364 >        #endif
365 >
366 >                // Set attribute value (equivalent to set_value without error checking)
367 >                xml_attribute& operator=(const char_t* rhs);
368 >                xml_attribute& operator=(int rhs);
369 >                xml_attribute& operator=(unsigned int rhs);
370 >                xml_attribute& operator=(double rhs);
371 >                xml_attribute& operator=(float rhs);
372 >                xml_attribute& operator=(bool rhs);
373 >
374 >        #ifdef PUGIXML_HAS_LONG_LONG
375 >                xml_attribute& operator=(long long rhs);
376 >                xml_attribute& operator=(unsigned long long rhs);
377 >        #endif
378 >
379 >                // Get next/previous attribute in the attribute list of the parent node
380 >                xml_attribute next_attribute() const;
381 >                xml_attribute previous_attribute() const;
382 >
383 >                // Get hash value (unique for handles to the same object)
384 >                size_t hash_value() const;
385 >
386 >                // Get internal pointer
387 >                xml_attribute_struct* internal_object() const;
388 >        };
389 >
390 > #ifdef __BORLANDC__
391 >        // Borland C++ workaround
392 >        bool PUGIXML_FUNCTION operator&&(const xml_attribute& lhs, bool rhs);
393 >        bool PUGIXML_FUNCTION operator||(const xml_attribute& lhs, bool rhs);
394 > #endif
395 >
396 >        // A light-weight handle for manipulating nodes in DOM tree
397 >        class PUGIXML_CLASS xml_node
398 >        {
399 >                friend class xml_attribute_iterator;
400 >                friend class xml_node_iterator;
401 >                friend class xml_named_node_iterator;
402 >
403 >        protected:
404 >                xml_node_struct* _root;
405 >
406 >                typedef void (*unspecified_bool_type)(xml_node***);
407 >
408 >        public:
409 >                // Default constructor. Constructs an empty node.
410 >                xml_node();
411 >
412 >                // Constructs node from internal pointer
413 >                explicit xml_node(xml_node_struct* p);
414 >
415 >                // Safe bool conversion operator
416 >                operator unspecified_bool_type() const;
417 >
418 >                // Borland C++ workaround
419 >                bool operator!() const;
420 >        
421 >                // Comparison operators (compares wrapped node pointers)
422 >                bool operator==(const xml_node& r) const;
423 >                bool operator!=(const xml_node& r) const;
424 >                bool operator<(const xml_node& r) const;
425 >                bool operator>(const xml_node& r) const;
426 >                bool operator<=(const xml_node& r) const;
427 >                bool operator>=(const xml_node& r) const;
428 >
429 >                // Check if node is empty.
430 >                bool empty() const;
431 >
432 >                // Get node type
433 >                xml_node_type type() const;
434 >
435 >                // Get node name, or "" if node is empty or it has no name
436 >                const char_t* name() const;
437 >
438 >                // Get node value, or "" if node is empty or it has no value
439 >                // Note: For <node>text</node> node.value() does not return "text"! Use child_value() or text() methods to access text inside nodes.
440 >                const char_t* value() const;
441 >        
442 >                // Get attribute list
443 >                xml_attribute first_attribute() const;
444 >                xml_attribute last_attribute() const;
445 >
446 >                // Get children list
447 >                xml_node first_child() const;
448 >                xml_node last_child() const;
449 >
450 >                // Get next/previous sibling in the children list of the parent node
451 >                xml_node next_sibling() const;
452 >                xml_node previous_sibling() const;
453 >                
454 >                // Get parent node
455 >                xml_node parent() const;
456 >
457 >                // Get root of DOM tree this node belongs to
458 >                xml_node root() const;
459 >
460 >                // Get text object for the current node
461 >                xml_text text() const;
462 >
463 >                // Get child, attribute or next/previous sibling with the specified name
464 >                xml_node child(const char_t* name) const;
465 >                xml_attribute attribute(const char_t* name) const;
466 >                xml_node next_sibling(const char_t* name) const;
467 >                xml_node previous_sibling(const char_t* name) const;
468 >
469 >                // Get attribute, starting the search from a hint (and updating hint so that searching for a sequence of attributes is fast)
470 >                xml_attribute attribute(const char_t* name, xml_attribute& hint) const;
471 >
472 >                // Get child value of current node; that is, value of the first child node of type PCDATA/CDATA
473 >                const char_t* child_value() const;
474 >
475 >                // Get child value of child with specified name. Equivalent to child(name).child_value().
476 >                const char_t* child_value(const char_t* name) const;
477 >
478 >                // Set node name/value (returns false if node is empty, there is not enough memory, or node can not have name/value)
479 >                bool set_name(const char_t* rhs);
480 >                bool set_value(const char_t* rhs);
481 >                
482 >                // Add attribute with specified name. Returns added attribute, or empty attribute on errors.
483 >                xml_attribute append_attribute(const char_t* name);
484 >                xml_attribute prepend_attribute(const char_t* name);
485 >                xml_attribute insert_attribute_after(const char_t* name, const xml_attribute& attr);
486 >                xml_attribute insert_attribute_before(const char_t* name, const xml_attribute& attr);
487 >
488 >                // Add a copy of the specified attribute. Returns added attribute, or empty attribute on errors.
489 >                xml_attribute append_copy(const xml_attribute& proto);
490 >                xml_attribute prepend_copy(const xml_attribute& proto);
491 >                xml_attribute insert_copy_after(const xml_attribute& proto, const xml_attribute& attr);
492 >                xml_attribute insert_copy_before(const xml_attribute& proto, const xml_attribute& attr);
493 >
494 >                // Add child node with specified type. Returns added node, or empty node on errors.
495 >                xml_node append_child(xml_node_type type = node_element);
496 >                xml_node prepend_child(xml_node_type type = node_element);
497 >                xml_node insert_child_after(xml_node_type type, const xml_node& node);
498 >                xml_node insert_child_before(xml_node_type type, const xml_node& node);
499 >
500 >                // Add child element with specified name. Returns added node, or empty node on errors.
501 >                xml_node append_child(const char_t* name);
502 >                xml_node prepend_child(const char_t* name);
503 >                xml_node insert_child_after(const char_t* name, const xml_node& node);
504 >                xml_node insert_child_before(const char_t* name, const xml_node& node);
505 >
506 >                // Add a copy of the specified node as a child. Returns added node, or empty node on errors.
507 >                xml_node append_copy(const xml_node& proto);
508 >                xml_node prepend_copy(const xml_node& proto);
509 >                xml_node insert_copy_after(const xml_node& proto, const xml_node& node);
510 >                xml_node insert_copy_before(const xml_node& proto, const xml_node& node);
511 >
512 >                // Move the specified node to become a child of this node. Returns moved node, or empty node on errors.
513 >                xml_node append_move(const xml_node& moved);
514 >                xml_node prepend_move(const xml_node& moved);
515 >                xml_node insert_move_after(const xml_node& moved, const xml_node& node);
516 >                xml_node insert_move_before(const xml_node& moved, const xml_node& node);
517 >
518 >                // Remove specified attribute
519 >                bool remove_attribute(const xml_attribute& a);
520 >                bool remove_attribute(const char_t* name);
521 >
522 >                // Remove specified child
523 >                bool remove_child(const xml_node& n);
524 >                bool remove_child(const char_t* name);
525 >
526 >                // Parses buffer as an XML document fragment and appends all nodes as children of the current node.
527 >                // Copies/converts the buffer, so it may be deleted or changed after the function returns.
528 >                // Note: append_buffer allocates memory that has the lifetime of the owning document; removing the appended nodes does not immediately reclaim that memory.
529 >                xml_parse_result append_buffer(const void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
530 >
531 >                // Find attribute using predicate. Returns first attribute for which predicate returned true.
532 >                template <typename Predicate> xml_attribute find_attribute(Predicate pred) const
533 >                {
534 >                        if (!_root) return xml_attribute();
535 >                        
536 >                        for (xml_attribute attrib = first_attribute(); attrib; attrib = attrib.next_attribute())
537 >                                if (pred(attrib))
538 >                                        return attrib;
539 >                
540 >                        return xml_attribute();
541 >                }
542 >
543 >                // Find child node using predicate. Returns first child for which predicate returned true.
544 >                template <typename Predicate> xml_node find_child(Predicate pred) const
545 >                {
546 >                        if (!_root) return xml_node();
547 >        
548 >                        for (xml_node node = first_child(); node; node = node.next_sibling())
549 >                                if (pred(node))
550 >                                        return node;
551 >                
552 >                        return xml_node();
553 >                }
554 >
555 >                // Find node from subtree using predicate. Returns first node from subtree (depth-first), for which predicate returned true.
556 >                template <typename Predicate> xml_node find_node(Predicate pred) const
557 >                {
558 >                        if (!_root) return xml_node();
559 >
560 >                        xml_node cur = first_child();
561 >                        
562 >                        while (cur._root && cur._root != _root)
563 >                        {
564 >                                if (pred(cur)) return cur;
565 >
566 >                                if (cur.first_child()) cur = cur.first_child();
567 >                                else if (cur.next_sibling()) cur = cur.next_sibling();
568 >                                else
569 >                                {
570 >                                        while (!cur.next_sibling() && cur._root != _root) cur = cur.parent();
571 >
572 >                                        if (cur._root != _root) cur = cur.next_sibling();
573 >                                }
574 >                        }
575 >
576 >                        return xml_node();
577 >                }
578 >
579 >                // Find child node by attribute name/value
580 >                xml_node find_child_by_attribute(const char_t* name, const char_t* attr_name, const char_t* attr_value) const;
581 >                xml_node find_child_by_attribute(const char_t* attr_name, const char_t* attr_value) const;
582 >
583 >        #ifndef PUGIXML_NO_STL
584 >                // Get the absolute node path from root as a text string.
585 >                string_t path(char_t delimiter = '/') const;
586 >        #endif
587 >
588 >                // Search for a node by path consisting of node names and . or .. elements.
589 >                xml_node first_element_by_path(const char_t* path, char_t delimiter = '/') const;
590 >
591 >                // Recursively traverse subtree with xml_tree_walker
592 >                bool traverse(xml_tree_walker& walker);
593 >        
594 >        #ifndef PUGIXML_NO_XPATH
595 >                // Select single node by evaluating XPath query. Returns first node from the resulting node set.
596 >                xpath_node select_node(const char_t* query, xpath_variable_set* variables = 0) const;
597 >                xpath_node select_node(const xpath_query& query) const;
598 >
599 >                // Select node set by evaluating XPath query
600 >                xpath_node_set select_nodes(const char_t* query, xpath_variable_set* variables = 0) const;
601 >                xpath_node_set select_nodes(const xpath_query& query) const;
602 >
603 >                // (deprecated: use select_node instead) Select single node by evaluating XPath query.
604 >                xpath_node select_single_node(const char_t* query, xpath_variable_set* variables = 0) const;
605 >                xpath_node select_single_node(const xpath_query& query) const;
606 >
607 >        #endif
608 >                
609 >                // Print subtree using a writer object
610 >                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;
611 >
612 >        #ifndef PUGIXML_NO_STL
613 >                // Print subtree to stream
614 >                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;
615 >                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;
616 >        #endif
617 >
618 >                // Child nodes iterators
619 >                typedef xml_node_iterator iterator;
620 >
621 >                iterator begin() const;
622 >                iterator end() const;
623 >
624 >                // Attribute iterators
625 >                typedef xml_attribute_iterator attribute_iterator;
626 >
627 >                attribute_iterator attributes_begin() const;
628 >                attribute_iterator attributes_end() const;
629 >
630 >                // Range-based for support
631 >                xml_object_range<xml_node_iterator> children() const;
632 >                xml_object_range<xml_named_node_iterator> children(const char_t* name) const;
633 >                xml_object_range<xml_attribute_iterator> attributes() const;
634 >
635 >                // Get node offset in parsed file/string (in char_t units) for debugging purposes
636 >                ptrdiff_t offset_debug() const;
637 >
638 >                // Get hash value (unique for handles to the same object)
639 >                size_t hash_value() const;
640 >
641 >                // Get internal pointer
642 >                xml_node_struct* internal_object() const;
643 >        };
644 >
645 > #ifdef __BORLANDC__
646 >        // Borland C++ workaround
647 >        bool PUGIXML_FUNCTION operator&&(const xml_node& lhs, bool rhs);
648 >        bool PUGIXML_FUNCTION operator||(const xml_node& lhs, bool rhs);
649 > #endif
650 >
651 >        // A helper for working with text inside PCDATA nodes
652 >        class PUGIXML_CLASS xml_text
653 >        {
654 >                friend class xml_node;
655 >
656 >                xml_node_struct* _root;
657 >
658 >                typedef void (*unspecified_bool_type)(xml_text***);
659 >
660 >                explicit xml_text(xml_node_struct* root);
661 >
662 >                xml_node_struct* _data_new();
663 >                xml_node_struct* _data() const;
664 >
665 >        public:
666 >                // Default constructor. Constructs an empty object.
667 >                xml_text();
668 >
669 >                // Safe bool conversion operator
670 >                operator unspecified_bool_type() const;
671 >
672 >                // Borland C++ workaround
673 >                bool operator!() const;
674 >
675 >                // Check if text object is empty
676 >                bool empty() const;
677 >
678 >                // Get text, or "" if object is empty
679 >                const char_t* get() const;
680 >
681 >                // Get text, or the default value if object is empty
682 >                const char_t* as_string(const char_t* def = PUGIXML_TEXT("")) const;
683 >
684 >                // Get text as a number, or the default value if conversion did not succeed or object is empty
685 >                int as_int(int def = 0) const;
686 >                unsigned int as_uint(unsigned int def = 0) const;
687 >                double as_double(double def = 0) const;
688 >                float as_float(float def = 0) const;
689 >
690 >        #ifdef PUGIXML_HAS_LONG_LONG
691 >                long long as_llong(long long def = 0) const;
692 >                unsigned long long as_ullong(unsigned long long def = 0) const;
693 >        #endif
694 >
695 >                // Get text as bool (returns true if first character is in '1tTyY' set), or the default value if object is empty
696 >                bool as_bool(bool def = false) const;
697 >
698 >                // Set text (returns false if object is empty or there is not enough memory)
699 >                bool set(const char_t* rhs);
700 >
701 >                // Set text with type conversion (numbers are converted to strings, boolean is converted to "true"/"false")
702 >                bool set(int rhs);
703 >                bool set(unsigned int rhs);
704 >                bool set(double rhs);
705 >                bool set(float rhs);
706 >                bool set(bool rhs);
707 >
708 >        #ifdef PUGIXML_HAS_LONG_LONG
709 >                bool set(long long rhs);
710 >                bool set(unsigned long long rhs);
711 >        #endif
712 >
713 >                // Set text (equivalent to set without error checking)
714 >                xml_text& operator=(const char_t* rhs);
715 >                xml_text& operator=(int rhs);
716 >                xml_text& operator=(unsigned int rhs);
717 >                xml_text& operator=(double rhs);
718 >                xml_text& operator=(float rhs);
719 >                xml_text& operator=(bool rhs);
720 >
721 >        #ifdef PUGIXML_HAS_LONG_LONG
722 >                xml_text& operator=(long long rhs);
723 >                xml_text& operator=(unsigned long long rhs);
724 >        #endif
725 >
726 >                // Get the data node (node_pcdata or node_cdata) for this object
727 >                xml_node data() const;
728 >        };
729 >
730 > #ifdef __BORLANDC__
731 >        // Borland C++ workaround
732 >        bool PUGIXML_FUNCTION operator&&(const xml_text& lhs, bool rhs);
733 >        bool PUGIXML_FUNCTION operator||(const xml_text& lhs, bool rhs);
734 > #endif
735 >
736 >        // Child node iterator (a bidirectional iterator over a collection of xml_node)
737 >        class PUGIXML_CLASS xml_node_iterator
738 >        {
739 >                friend class xml_node;
740 >
741 >        private:
742 >                mutable xml_node _wrap;
743 >                xml_node _parent;
744 >
745 >                xml_node_iterator(xml_node_struct* ref, xml_node_struct* parent);
746 >
747 >        public:
748 >                // Iterator traits
749 >                typedef ptrdiff_t difference_type;
750 >                typedef xml_node value_type;
751 >                typedef xml_node* pointer;
752 >                typedef xml_node& reference;
753 >
754 >        #ifndef PUGIXML_NO_STL
755 >                typedef std::bidirectional_iterator_tag iterator_category;
756 >        #endif
757 >
758 >                // Default constructor
759 >                xml_node_iterator();
760 >
761 >                // Construct an iterator which points to the specified node
762 >                xml_node_iterator(const xml_node& node);
763 >
764 >                // Iterator operators
765 >                bool operator==(const xml_node_iterator& rhs) const;
766 >                bool operator!=(const xml_node_iterator& rhs) const;
767 >
768 >                xml_node& operator*() const;
769 >                xml_node* operator->() const;
770 >
771 >                const xml_node_iterator& operator++();
772 >                xml_node_iterator operator++(int);
773 >
774 >                const xml_node_iterator& operator--();
775 >                xml_node_iterator operator--(int);
776 >        };
777 >
778 >        // Attribute iterator (a bidirectional iterator over a collection of xml_attribute)
779 >        class PUGIXML_CLASS xml_attribute_iterator
780 >        {
781 >                friend class xml_node;
782 >
783 >        private:
784 >                mutable xml_attribute _wrap;
785 >                xml_node _parent;
786 >
787 >                xml_attribute_iterator(xml_attribute_struct* ref, xml_node_struct* parent);
788 >
789 >        public:
790 >                // Iterator traits
791 >                typedef ptrdiff_t difference_type;
792 >                typedef xml_attribute value_type;
793 >                typedef xml_attribute* pointer;
794 >                typedef xml_attribute& reference;
795 >
796 >        #ifndef PUGIXML_NO_STL
797 >                typedef std::bidirectional_iterator_tag iterator_category;
798 >        #endif
799 >
800 >                // Default constructor
801 >                xml_attribute_iterator();
802 >
803 >                // Construct an iterator which points to the specified attribute
804 >                xml_attribute_iterator(const xml_attribute& attr, const xml_node& parent);
805 >
806 >                // Iterator operators
807 >                bool operator==(const xml_attribute_iterator& rhs) const;
808 >                bool operator!=(const xml_attribute_iterator& rhs) const;
809 >
810 >                xml_attribute& operator*() const;
811 >                xml_attribute* operator->() const;
812 >
813 >                const xml_attribute_iterator& operator++();
814 >                xml_attribute_iterator operator++(int);
815 >
816 >                const xml_attribute_iterator& operator--();
817 >                xml_attribute_iterator operator--(int);
818 >        };
819 >
820 >        // Named node range helper
821 >        class PUGIXML_CLASS xml_named_node_iterator
822 >        {
823 >                friend class xml_node;
824 >
825 >        public:
826 >                // Iterator traits
827 >                typedef ptrdiff_t difference_type;
828 >                typedef xml_node value_type;
829 >                typedef xml_node* pointer;
830 >                typedef xml_node& reference;
831 >
832 >        #ifndef PUGIXML_NO_STL
833 >                typedef std::bidirectional_iterator_tag iterator_category;
834 >        #endif
835 >
836 >                // Default constructor
837 >                xml_named_node_iterator();
838 >
839 >                // Construct an iterator which points to the specified node
840 >                xml_named_node_iterator(const xml_node& node, const char_t* name);
841 >
842 >                // Iterator operators
843 >                bool operator==(const xml_named_node_iterator& rhs) const;
844 >                bool operator!=(const xml_named_node_iterator& rhs) const;
845 >
846 >                xml_node& operator*() const;
847 >                xml_node* operator->() const;
848 >
849 >                const xml_named_node_iterator& operator++();
850 >                xml_named_node_iterator operator++(int);
851 >
852 >                const xml_named_node_iterator& operator--();
853 >                xml_named_node_iterator operator--(int);
854 >
855 >        private:
856 >                mutable xml_node _wrap;
857 >                xml_node _parent;
858 >                const char_t* _name;
859 >
860 >                xml_named_node_iterator(xml_node_struct* ref, xml_node_struct* parent, const char_t* name);
861 >        };
862 >
863 >        // Abstract tree walker class (see xml_node::traverse)
864 >        class PUGIXML_CLASS xml_tree_walker
865 >        {
866 >                friend class xml_node;
867 >
868 >        private:
869 >                int _depth;
870 >        
871 >        protected:
872 >                // Get current traversal depth
873 >                int depth() const;
874 >        
875 >        public:
876 >                xml_tree_walker();
877 >                virtual ~xml_tree_walker();
878 >
879 >                // Callback that is called when traversal begins
880 >                virtual bool begin(xml_node& node);
881 >
882 >                // Callback that is called for each node traversed
883 >                virtual bool for_each(xml_node& node) = 0;
884 >
885 >                // Callback that is called when traversal ends
886 >                virtual bool end(xml_node& node);
887 >        };
888 >
889 >        // Parsing status, returned as part of xml_parse_result object
890 >        enum xml_parse_status
891 >        {
892 >                status_ok = 0,                          // No error
893 >
894 >                status_file_not_found,          // File was not found during load_file()
895 >                status_io_error,                        // Error reading from file/stream
896 >                status_out_of_memory,           // Could not allocate memory
897 >                status_internal_error,          // Internal error occurred
898 >
899 >                status_unrecognized_tag,        // Parser could not determine tag type
900 >
901 >                status_bad_pi,                          // Parsing error occurred while parsing document declaration/processing instruction
902 >                status_bad_comment,                     // Parsing error occurred while parsing comment
903 >                status_bad_cdata,                       // Parsing error occurred while parsing CDATA section
904 >                status_bad_doctype,                     // Parsing error occurred while parsing document type declaration
905 >                status_bad_pcdata,                      // Parsing error occurred while parsing PCDATA section
906 >                status_bad_start_element,       // Parsing error occurred while parsing start element tag
907 >                status_bad_attribute,           // Parsing error occurred while parsing element attribute
908 >                status_bad_end_element,         // Parsing error occurred while parsing end element tag
909 >                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)
910 >
911 >                status_append_invalid_root,     // Unable to append nodes since root type is not node_element or node_document (exclusive to xml_node::append_buffer)
912 >
913 >                status_no_document_element      // Parsing resulted in a document without element nodes
914 >        };
915 >
916 >        // Parsing result
917 >        struct PUGIXML_CLASS xml_parse_result
918 >        {
919 >                // Parsing status (see xml_parse_status)
920 >                xml_parse_status status;
921 >
922 >                // Last parsed offset (in char_t units from start of input data)
923 >                ptrdiff_t offset;
924 >
925 >                // Source document encoding
926 >                xml_encoding encoding;
927 >
928 >                // Default constructor, initializes object to failed state
929 >                xml_parse_result();
930 >
931 >                // Cast to bool operator
932 >                operator bool() const;
933 >
934 >                // Get error description
935 >                const char* description() const;
936 >        };
937 >
938 >        // Document class (DOM tree root)
939 >        class PUGIXML_CLASS xml_document: public xml_node
940 >        {
941 >        private:
942 >                char_t* _buffer;
943 >
944 >                char _memory[192];
945 >                
946 >                // Non-copyable semantics
947 >                xml_document(const xml_document&);
948 >                xml_document& operator=(const xml_document&);
949 >
950 >                void create();
951 >                void destroy();
952 >
953 >        public:
954 >                // Default constructor, makes empty document
955 >                xml_document();
956 >
957 >                // Destructor, invalidates all node/attribute handles to this document
958 >                ~xml_document();
959 >
960 >                // Removes all nodes, leaving the empty document
961 >                void reset();
962 >
963 >                // Removes all nodes, then copies the entire contents of the specified document
964 >                void reset(const xml_document& proto);
965 >
966 >        #ifndef PUGIXML_NO_STL
967 >                // Load document from stream.
968 >                xml_parse_result load(std::basic_istream<char, std::char_traits<char> >& stream, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
969 >                xml_parse_result load(std::basic_istream<wchar_t, std::char_traits<wchar_t> >& stream, unsigned int options = parse_default);
970 >        #endif
971 >
972 >                // (deprecated: use load_string instead) Load document from zero-terminated string. No encoding conversions are applied.
973 >                xml_parse_result load(const char_t* contents, unsigned int options = parse_default);
974 >
975 >                // Load document from zero-terminated string. No encoding conversions are applied.
976 >                xml_parse_result load_string(const char_t* contents, unsigned int options = parse_default);
977 >
978 >                // Load document from file
979 >                xml_parse_result load_file(const char* path, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
980 >                xml_parse_result load_file(const wchar_t* path, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
981 >
982 >                // Load document from buffer. Copies/converts the buffer, so it may be deleted or changed after the function returns.
983 >                xml_parse_result load_buffer(const void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
984 >
985 >                // Load document from buffer, using the buffer for in-place parsing (the buffer is modified and used for storage of document data).
986 >                // You should ensure that buffer data will persist throughout the document's lifetime, and free the buffer memory manually once document is destroyed.
987 >                xml_parse_result load_buffer_inplace(void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
988 >
989 >                // Load document from buffer, using the buffer for in-place parsing (the buffer is modified and used for storage of document data).
990 >                // 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).
991 >                xml_parse_result load_buffer_inplace_own(void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
992 >
993 >                // Save XML document to writer (semantics is slightly different from xml_node::print, see documentation for details).
994 >                void save(xml_writer& writer, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const;
995 >
996 >        #ifndef PUGIXML_NO_STL
997 >                // Save XML document to stream (semantics is slightly different from xml_node::print, see documentation for details).
998 >                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;
999 >                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;
1000 >        #endif
1001 >
1002 >                // Save XML to file
1003 >                bool save_file(const char* path, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const;
1004 >                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;
1005 >
1006 >                // Get document element
1007 >                xml_node document_element() const;
1008 >        };
1009 >
1010 > #ifndef PUGIXML_NO_XPATH
1011 >        // XPath query return type
1012 >        enum xpath_value_type
1013 >        {
1014 >                xpath_type_none,          // Unknown type (query failed to compile)
1015 >                xpath_type_node_set,  // Node set (xpath_node_set)
1016 >                xpath_type_number,        // Number
1017 >                xpath_type_string,        // String
1018 >                xpath_type_boolean        // Boolean
1019 >        };
1020 >
1021 >        // XPath parsing result
1022 >        struct PUGIXML_CLASS xpath_parse_result
1023 >        {
1024 >                // Error message (0 if no error)
1025 >                const char* error;
1026 >
1027 >                // Last parsed offset (in char_t units from string start)
1028 >                ptrdiff_t offset;
1029 >
1030 >                // Default constructor, initializes object to failed state
1031 >                xpath_parse_result();
1032 >
1033 >                // Cast to bool operator
1034 >                operator bool() const;
1035 >
1036 >                // Get error description
1037 >                const char* description() const;
1038 >        };
1039 >
1040 >        // A single XPath variable
1041 >        class PUGIXML_CLASS xpath_variable
1042 >        {
1043 >                friend class xpath_variable_set;
1044 >
1045 >        protected:
1046 >                xpath_value_type _type;
1047 >                xpath_variable* _next;
1048 >
1049 >                xpath_variable(xpath_value_type type);
1050 >
1051 >                // Non-copyable semantics
1052 >                xpath_variable(const xpath_variable&);
1053 >                xpath_variable& operator=(const xpath_variable&);
1054 >                
1055 >        public:
1056 >                // Get variable name
1057 >                const char_t* name() const;
1058 >
1059 >                // Get variable type
1060 >                xpath_value_type type() const;
1061 >
1062 >                // Get variable value; no type conversion is performed, default value (false, NaN, empty string, empty node set) is returned on type mismatch error
1063 >                bool get_boolean() const;
1064 >                double get_number() const;
1065 >                const char_t* get_string() const;
1066 >                const xpath_node_set& get_node_set() const;
1067 >
1068 >                // Set variable value; no type conversion is performed, false is returned on type mismatch error
1069 >                bool set(bool value);
1070 >                bool set(double value);
1071 >                bool set(const char_t* value);
1072 >                bool set(const xpath_node_set& value);
1073 >        };
1074 >
1075 >        // A set of XPath variables
1076 >        class PUGIXML_CLASS xpath_variable_set
1077 >        {
1078 >        private:
1079 >                xpath_variable* _data[64];
1080 >
1081 >                void _assign(const xpath_variable_set& rhs);
1082 >                void _swap(xpath_variable_set& rhs);
1083 >
1084 >                xpath_variable* _find(const char_t* name) const;
1085 >
1086 >                static bool _clone(xpath_variable* var, xpath_variable** out_result);
1087 >                static void _destroy(xpath_variable* var);
1088 >
1089 >        public:
1090 >                // Default constructor/destructor
1091 >                xpath_variable_set();
1092 >                ~xpath_variable_set();
1093 >
1094 >                // Copy constructor/assignment operator
1095 >                xpath_variable_set(const xpath_variable_set& rhs);
1096 >                xpath_variable_set& operator=(const xpath_variable_set& rhs);
1097 >
1098 >        #if __cplusplus >= 201103
1099 >                // Move semantics support
1100 >                xpath_variable_set(xpath_variable_set&& rhs);
1101 >                xpath_variable_set& operator=(xpath_variable_set&& rhs);
1102 >        #endif
1103 >
1104 >                // Add a new variable or get the existing one, if the types match
1105 >                xpath_variable* add(const char_t* name, xpath_value_type type);
1106 >
1107 >                // Set value of an existing variable; no type conversion is performed, false is returned if there is no such variable or if types mismatch
1108 >                bool set(const char_t* name, bool value);
1109 >                bool set(const char_t* name, double value);
1110 >                bool set(const char_t* name, const char_t* value);
1111 >                bool set(const char_t* name, const xpath_node_set& value);
1112 >
1113 >                // Get existing variable by name
1114 >                xpath_variable* get(const char_t* name);
1115 >                const xpath_variable* get(const char_t* name) const;
1116 >        };
1117 >
1118 >        // A compiled XPath query object
1119 >        class PUGIXML_CLASS xpath_query
1120 >        {
1121 >        private:
1122 >                void* _impl;
1123 >                xpath_parse_result _result;
1124 >
1125 >                typedef void (*unspecified_bool_type)(xpath_query***);
1126 >
1127 >                // Non-copyable semantics
1128 >                xpath_query(const xpath_query&);
1129 >                xpath_query& operator=(const xpath_query&);
1130 >
1131 >        public:
1132 >                // Construct a compiled object from XPath expression.
1133 >                // If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on compilation errors.
1134 >                explicit xpath_query(const char_t* query, xpath_variable_set* variables = 0);
1135 >
1136 >                // Constructor
1137 >                xpath_query();
1138 >
1139 >                // Destructor
1140 >                ~xpath_query();
1141 >
1142 >        #if __cplusplus >= 201103
1143 >                // Move semantics support
1144 >                xpath_query(xpath_query&& rhs);
1145 >                xpath_query& operator=(xpath_query&& rhs);
1146 >        #endif
1147 >
1148 >                // Get query expression return type
1149 >                xpath_value_type return_type() const;
1150 >                
1151 >                // Evaluate expression as boolean value in the specified context; performs type conversion if necessary.
1152 >                // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors.
1153 >                bool evaluate_boolean(const xpath_node& n) const;
1154 >                
1155 >                // Evaluate expression as double value in the specified context; performs type conversion if necessary.
1156 >                // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors.
1157 >                double evaluate_number(const xpath_node& n) const;
1158 >                
1159 >        #ifndef PUGIXML_NO_STL
1160 >                // Evaluate expression as string value in the specified context; performs type conversion if necessary.
1161 >                // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors.
1162 >                string_t evaluate_string(const xpath_node& n) const;
1163 >        #endif
1164 >                
1165 >                // Evaluate expression as string value in the specified context; performs type conversion if necessary.
1166 >                // At most capacity characters are written to the destination buffer, full result size is returned (includes terminating zero).
1167 >                // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors.
1168 >                // If PUGIXML_NO_EXCEPTIONS is defined, returns empty  set instead.
1169 >                size_t evaluate_string(char_t* buffer, size_t capacity, const xpath_node& n) const;
1170 >
1171 >                // Evaluate expression as node set in the specified context.
1172 >                // If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on type mismatch and std::bad_alloc on out of memory errors.
1173 >                // If PUGIXML_NO_EXCEPTIONS is defined, returns empty node set instead.
1174 >                xpath_node_set evaluate_node_set(const xpath_node& n) const;
1175 >
1176 >                // Evaluate expression as node set in the specified context.
1177 >                // Return first node in document order, or empty node if node set is empty.
1178 >                // If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on type mismatch and std::bad_alloc on out of memory errors.
1179 >                // If PUGIXML_NO_EXCEPTIONS is defined, returns empty node instead.
1180 >                xpath_node evaluate_node(const xpath_node& n) const;
1181 >
1182 >                // Get parsing result (used to get compilation errors in PUGIXML_NO_EXCEPTIONS mode)
1183 >                const xpath_parse_result& result() const;
1184 >
1185 >                // Safe bool conversion operator
1186 >                operator unspecified_bool_type() const;
1187 >
1188 >                // Borland C++ workaround
1189 >                bool operator!() const;
1190 >        };
1191 >        
1192 >        #ifndef PUGIXML_NO_EXCEPTIONS
1193 >        // XPath exception class
1194 >        class PUGIXML_CLASS xpath_exception: public std::exception
1195 >        {
1196 >        private:
1197 >                xpath_parse_result _result;
1198 >
1199 >        public:
1200 >                // Construct exception from parse result
1201 >                explicit xpath_exception(const xpath_parse_result& result);
1202 >
1203 >                // Get error message
1204 >                virtual const char* what() const throw();
1205 >
1206 >                // Get parse result
1207 >                const xpath_parse_result& result() const;
1208 >        };
1209 >        #endif
1210 >        
1211 >        // XPath node class (either xml_node or xml_attribute)
1212 >        class PUGIXML_CLASS xpath_node
1213 >        {
1214 >        private:
1215 >                xml_node _node;
1216 >                xml_attribute _attribute;
1217 >        
1218 >                typedef void (*unspecified_bool_type)(xpath_node***);
1219 >
1220 >        public:
1221 >                // Default constructor; constructs empty XPath node
1222 >                xpath_node();
1223 >                
1224 >                // Construct XPath node from XML node/attribute
1225 >                xpath_node(const xml_node& node);
1226 >                xpath_node(const xml_attribute& attribute, const xml_node& parent);
1227 >
1228 >                // Get node/attribute, if any
1229 >                xml_node node() const;
1230 >                xml_attribute attribute() const;
1231 >                
1232 >                // Get parent of contained node/attribute
1233 >                xml_node parent() const;
1234 >
1235 >                // Safe bool conversion operator
1236 >                operator unspecified_bool_type() const;
1237 >                
1238 >                // Borland C++ workaround
1239 >                bool operator!() const;
1240 >
1241 >                // Comparison operators
1242 >                bool operator==(const xpath_node& n) const;
1243 >                bool operator!=(const xpath_node& n) const;
1244 >        };
1245 >
1246 > #ifdef __BORLANDC__
1247 >        // Borland C++ workaround
1248 >        bool PUGIXML_FUNCTION operator&&(const xpath_node& lhs, bool rhs);
1249 >        bool PUGIXML_FUNCTION operator||(const xpath_node& lhs, bool rhs);
1250 > #endif
1251 >
1252 >        // A fixed-size collection of XPath nodes
1253 >        class PUGIXML_CLASS xpath_node_set
1254 >        {
1255 >        public:
1256 >                // Collection type
1257 >                enum type_t
1258 >                {
1259 >                        type_unsorted,                  // Not ordered
1260 >                        type_sorted,                    // Sorted by document order (ascending)
1261 >                        type_sorted_reverse             // Sorted by document order (descending)
1262 >                };
1263 >                
1264 >                // Constant iterator type
1265 >                typedef const xpath_node* const_iterator;
1266 >
1267 >                // We define non-constant iterator to be the same as constant iterator so that various generic algorithms (i.e. boost foreach) work
1268 >                typedef const xpath_node* iterator;
1269 >        
1270 >                // Default constructor. Constructs empty set.
1271 >                xpath_node_set();
1272 >
1273 >                // Constructs a set from iterator range; data is not checked for duplicates and is not sorted according to provided type, so be careful
1274 >                xpath_node_set(const_iterator begin, const_iterator end, type_t type = type_unsorted);
1275 >
1276 >                // Destructor
1277 >                ~xpath_node_set();
1278 >                
1279 >                // Copy constructor/assignment operator
1280 >                xpath_node_set(const xpath_node_set& ns);
1281 >                xpath_node_set& operator=(const xpath_node_set& ns);
1282 >
1283 >        #if __cplusplus >= 201103
1284 >                // Move semantics support
1285 >                xpath_node_set(xpath_node_set&& rhs);
1286 >                xpath_node_set& operator=(xpath_node_set&& rhs);
1287 >        #endif
1288 >
1289 >                // Get collection type
1290 >                type_t type() const;
1291 >                
1292 >                // Get collection size
1293 >                size_t size() const;
1294 >
1295 >                // Indexing operator
1296 >                const xpath_node& operator[](size_t index) const;
1297 >                
1298 >                // Collection iterators
1299 >                const_iterator begin() const;
1300 >                const_iterator end() const;
1301 >
1302 >                // Sort the collection in ascending/descending order by document order
1303 >                void sort(bool reverse = false);
1304 >                
1305 >                // Get first node in the collection by document order
1306 >                xpath_node first() const;
1307 >                
1308 >                // Check if collection is empty
1309 >                bool empty() const;
1310 >        
1311 >        private:
1312 >                type_t _type;
1313 >                
1314 >                xpath_node _storage;
1315 >                
1316 >                xpath_node* _begin;
1317 >                xpath_node* _end;
1318 >
1319 >                void _assign(const_iterator begin, const_iterator end, type_t type);
1320 >                void _move(xpath_node_set& rhs);
1321 >        };
1322 > #endif
1323 >
1324 > #ifndef PUGIXML_NO_STL
1325 >        // Convert wide string to UTF8
1326 >        std::basic_string<char, std::char_traits<char>, std::allocator<char> > PUGIXML_FUNCTION as_utf8(const wchar_t* str);
1327 >        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);
1328 >        
1329 >        // Convert UTF8 to wide string
1330 >        std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > PUGIXML_FUNCTION as_wide(const char* str);
1331 >        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);
1332 > #endif
1333 >
1334 >        // Memory allocation function interface; returns pointer to allocated memory or NULL on failure
1335 >        typedef void* (*allocation_function)(size_t size);
1336 >        
1337 >        // Memory deallocation function interface
1338 >        typedef void (*deallocation_function)(void* ptr);
1339 >
1340 >        // Override default memory management functions. All subsequent allocations/deallocations will be performed via supplied functions.
1341 >        void PUGIXML_FUNCTION set_memory_management_functions(allocation_function allocate, deallocation_function deallocate);
1342 >        
1343 >        // Get current memory management functions
1344 >        allocation_function PUGIXML_FUNCTION get_memory_allocation_function();
1345 >        deallocation_function PUGIXML_FUNCTION get_memory_deallocation_function();
1346 > }
1347 >
1348 > #if !defined(PUGIXML_NO_STL) && (defined(_MSC_VER) || defined(__ICC))
1349 > namespace std
1350 > {
1351 >        // Workarounds for (non-standard) iterator category detection for older versions (MSVC7/IC8 and earlier)
1352 >        std::bidirectional_iterator_tag PUGIXML_FUNCTION _Iter_cat(const pugi::xml_node_iterator&);
1353 >        std::bidirectional_iterator_tag PUGIXML_FUNCTION _Iter_cat(const pugi::xml_attribute_iterator&);
1354 >        std::bidirectional_iterator_tag PUGIXML_FUNCTION _Iter_cat(const pugi::xml_named_node_iterator&);
1355 > }
1356 > #endif
1357 >
1358 > #if !defined(PUGIXML_NO_STL) && defined(__SUNPRO_CC)
1359 > namespace std
1360 > {
1361 >        // Workarounds for (non-standard) iterator category detection
1362 >        std::bidirectional_iterator_tag PUGIXML_FUNCTION __iterator_category(const pugi::xml_node_iterator&);
1363 >        std::bidirectional_iterator_tag PUGIXML_FUNCTION __iterator_category(const pugi::xml_attribute_iterator&);
1364 >        std::bidirectional_iterator_tag PUGIXML_FUNCTION __iterator_category(const pugi::xml_named_node_iterator&);
1365 > }
1366 > #endif
1367 >
1368 > #endif
1369 >
1370 > // Make sure implementation is included in header-only mode
1371 > // Use macro expansion in #include to work around QMake (QTBUG-11923)
1372 > #if defined(PUGIXML_HEADER_ONLY) && !defined(PUGIXML_SOURCE)
1373 > #       define PUGIXML_SOURCE "pugixml.cpp"
1374 > #       include PUGIXML_SOURCE
1375 > #endif
1376 >
1377 > /**
1378 > * Copyright (c) 2006-2015 Arseny Kapoulkine
1379 > *
1380 > * Permission is hereby granted, free of charge, to any person
1381 > * obtaining a copy of this software and associated documentation
1382 > * files (the "Software"), to deal in the Software without
1383 > * restriction, including without limitation the rights to use,
1384 > * copy, modify, merge, publish, distribute, sublicense, and/or sell
1385 > * copies of the Software, and to permit persons to whom the
1386 > * Software is furnished to do so, subject to the following
1387 > * conditions:
1388 > *
1389 > * The above copyright notice and this permission notice shall be
1390 > * included in all copies or substantial portions of the Software.
1391 > *
1392 > * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
1393 > * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
1394 > * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
1395 > * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
1396 > * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
1397 > * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
1398 > * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
1399 > * OTHER DEALINGS IN THE SOFTWARE.
1400 > */

Diff Legend

Removed lines
+ Added lines
< Changed lines (old)
> Changed lines (new)