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