Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add C++20 module #644

Open
wants to merge 9 commits into
base: master
Choose a base branch
from
48 changes: 26 additions & 22 deletions src/pugixml.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,33 +16,35 @@

#include "pugixml.hpp"

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <limits.h>

#ifdef PUGIXML_WCHAR_MODE
# include <wchar.h>
#endif
#ifndef PUGIXML_EXPORT_MODULE
# include <stdlib.h>
# include <stdio.h>
# include <string.h>
# include <assert.h>
# include <limits.h>

# ifdef PUGIXML_WCHAR_MODE
# include <wchar.h>
# endif

#ifndef PUGIXML_NO_XPATH
# include <math.h>
# include <float.h>
#endif
# ifndef PUGIXML_NO_XPATH
# include <math.h>
# include <float.h>
# endif

#ifndef PUGIXML_NO_STL
# include <istream>
# include <ostream>
# include <string>
#endif
# ifndef PUGIXML_NO_STL
# include <istream>
# include <ostream>
# include <string>
# endif

// For placement new
#include <new>
# include <new>

// For load_file
#if defined(__linux__) || defined(__APPLE__)
#include <sys/stat.h>
# if defined(__linux__) || defined(__APPLE__)
# include <sys/stat.h>
# endif
#endif

#ifdef _MSC_VER
Expand Down Expand Up @@ -196,7 +198,9 @@ namespace pugi
typedef unsigned __int32 uint32_t;
}
#else
# include <stdint.h>
# ifndef PUGIXML_EXPORT_MODULE
# include <stdint.h>
# endif
#endif

// Memory allocation
Expand Down
79 changes: 79 additions & 0 deletions src/pugixml.cppm
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
/**
* pugixml parser - version 1.14
* --------------------------------------------------------
* Copyright (C) 2006-2024, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)
* Report bugs and download new versions at https://pugixml.org/
*
* This library is distributed under the MIT License. See notice at the end
* of this file.
*
* This work is based on the pugxml parser, which is:
* Copyright (C) 2003, by Kristen Wegner (kristen@tima.net)
*/

module;

#define PUGIXML_EXPORT_MODULE

#include <pugiconfig.hpp>

#ifndef PUGIXML_USE_STD_MODULE
# include <string_view>
# include <iterator>
# include <istream>
# include <ostream>
# include <string>
# include <new>
# include <exception>
#endif

#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <limits.h>
#include <stdint.h>

#ifdef PUGIXML_WCHAR_MODE
# include <wchar.h>
#endif

#ifndef PUGIXML_NO_XPATH
# include <math.h>
# include <float.h>
#endif

#if defined(__linux__) || defined(__APPLE__)
# include <sys/stat.h>
#endif

export module pugixml;

#ifdef PUGIXML_USE_STD_MODULE
import std.compat;
#endif

#define PUGIXML_MODULE_EXPORT export
#if defined(__clang__)
# pragma clang diagnostic push
# pragma clang diagnostic ignored "-Winclude-angled-in-module-purview"
#endif
#if !defined(PUGIXML_HEADER_ONLY)
extern "C++" {
#endif
#include <pugixml.hpp>
#if !defined(PUGIXML_HEADER_ONLY)
}
#endif
#if defined(__clang__)
# pragma clang diagnostic pop
#endif


module :private;

#if defined(PUGIXML_HEADER_ONLY) && !defined(PUGIXML_SOURCE)
# define PUGIXML_SOURCE "pugixml.cpp"
# include PUGIXML_SOURCE
#endif
115 changes: 73 additions & 42 deletions src/pugixml.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,19 +23,21 @@
#ifndef HEADER_PUGIXML_HPP
#define HEADER_PUGIXML_HPP

#ifndef PUGIXML_EXPORT_MODULE
// Include stddef.h for size_t and ptrdiff_t
#include <stddef.h>
# include <stddef.h>

// Include exception header for XPath
#if !defined(PUGIXML_NO_XPATH) && !defined(PUGIXML_NO_EXCEPTIONS)
# include <exception>
#endif
# if !defined(PUGIXML_NO_XPATH) && !defined(PUGIXML_NO_EXCEPTIONS)
# include <exception>
# endif

// Include STL headers
#ifndef PUGIXML_NO_STL
# include <iterator>
# include <iosfwd>
# include <string>
# ifndef PUGIXML_NO_STL
# include <iterator>
# include <iosfwd>
# include <string>
# endif
#endif

// Check if std::string_view is both requested and available
Expand All @@ -48,8 +50,10 @@
#endif

// Include string_view if appropriate
#ifdef PUGIXML_HAS_STRING_VIEW
# include <string_view>
#ifndef PUGIXML_EXPORT_MODULE
# ifdef PUGIXML_HAS_STRING_VIEW
# include <string_view>
# endif
#endif

// Macro for deprecated features
Expand Down Expand Up @@ -136,6 +140,29 @@
# endif
#endif

#ifndef PUGIXML_CONSTEXPR11
# if __cplusplus >= 201103
# define PUGIXML_CONSTEXPR11 constexpr
# elif defined(_MSC_VER) && _MSC_VER >= 1910
# define PUGIXML_CONSTEXPR11 constexpr
# else
# define PUGIXML_CONSTEXPR11
# endif
#endif

// If C++ is 2011 or higher, add 'constexpr' qualifiers to constants
// If C++ is 2017 or higher, add 'inline' qualifiers to constants
// inline constexpr is required for C++20 module
#ifndef PUGIXML_CONSTANT
# if __cplusplus >= 201703
# define PUGIXML_CONSTANT inline PUGIXML_CONSTEXPR11
# elif __cplusplus >= 201103
# define PUGIXML_CONSTANT PUGIXML_CONSTEXPR11
# else
# define PUGIXML_CONSTANT const
# endif
#endif

// Character interface macros
#ifdef PUGIXML_WCHAR_MODE
# define PUGIXML_TEXT(t) L ## t
Expand All @@ -145,6 +172,10 @@
# define PUGIXML_CHAR char
#endif

#ifndef PUGIXML_MODULE_EXPORT
# define PUGIXML_MODULE_EXPORT
#endif

namespace pugi
{
// Character type used for all internal storage and operations; depends on PUGIXML_WCHAR_MODE
Expand All @@ -162,7 +193,7 @@ namespace pugi
}

// The PugiXML namespace
namespace pugi
PUGIXML_MODULE_EXPORT namespace pugi
{
// Tree node types
enum xml_node_type
Expand All @@ -182,69 +213,69 @@ namespace pugi

// Minimal parsing mode (equivalent to turning all other flags off).
// Only elements and PCDATA sections are added to the DOM tree, no text conversions are performed.
const unsigned int parse_minimal = 0x0000;
PUGIXML_CONSTANT unsigned int parse_minimal = 0x0000;

// This flag determines if processing instructions (node_pi) are added to the DOM tree. This flag is off by default.
const unsigned int parse_pi = 0x0001;
PUGIXML_CONSTANT unsigned int parse_pi = 0x0001;

// This flag determines if comments (node_comment) are added to the DOM tree. This flag is off by default.
const unsigned int parse_comments = 0x0002;
PUGIXML_CONSTANT unsigned int parse_comments = 0x0002;

// This flag determines if CDATA sections (node_cdata) are added to the DOM tree. This flag is on by default.
const unsigned int parse_cdata = 0x0004;
PUGIXML_CONSTANT unsigned int parse_cdata = 0x0004;

// This flag determines if plain character data (node_pcdata) that consist only of whitespace are added to the DOM tree.
// This flag is off by default; turning it on usually results in slower parsing and more memory consumption.
const unsigned int parse_ws_pcdata = 0x0008;
PUGIXML_CONSTANT unsigned int parse_ws_pcdata = 0x0008;

// This flag determines if character and entity references are expanded during parsing. This flag is on by default.
const unsigned int parse_escapes = 0x0010;
PUGIXML_CONSTANT unsigned int parse_escapes = 0x0010;

// This flag determines if EOL characters are normalized (converted to #xA) during parsing. This flag is on by default.
const unsigned int parse_eol = 0x0020;
PUGIXML_CONSTANT unsigned int parse_eol = 0x0020;

// This flag determines if attribute values are normalized using CDATA normalization rules during parsing. This flag is on by default.
const unsigned int parse_wconv_attribute = 0x0040;
PUGIXML_CONSTANT unsigned int parse_wconv_attribute = 0x0040;

// This flag determines if attribute values are normalized using NMTOKENS normalization rules during parsing. This flag is off by default.
const unsigned int parse_wnorm_attribute = 0x0080;
PUGIXML_CONSTANT unsigned int parse_wnorm_attribute = 0x0080;

// This flag determines if document declaration (node_declaration) is added to the DOM tree. This flag is off by default.
const unsigned int parse_declaration = 0x0100;
PUGIXML_CONSTANT unsigned int parse_declaration = 0x0100;

// This flag determines if document type declaration (node_doctype) is added to the DOM tree. This flag is off by default.
const unsigned int parse_doctype = 0x0200;
PUGIXML_CONSTANT unsigned int parse_doctype = 0x0200;

// This flag determines if plain character data (node_pcdata) that is the only child of the parent node and that consists only
// of whitespace is added to the DOM tree.
// This flag is off by default; turning it on may result in slower parsing and more memory consumption.
const unsigned int parse_ws_pcdata_single = 0x0400;
PUGIXML_CONSTANT unsigned int parse_ws_pcdata_single = 0x0400;

// This flag determines if leading and trailing whitespace is to be removed from plain character data. This flag is off by default.
const unsigned int parse_trim_pcdata = 0x0800;
PUGIXML_CONSTANT unsigned int parse_trim_pcdata = 0x0800;

// 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
// is a valid document. This flag is off by default.
const unsigned int parse_fragment = 0x1000;
PUGIXML_CONSTANT unsigned int parse_fragment = 0x1000;

// This flag determines if plain character data is be stored in the parent element's value. This significantly changes the structure of
// the document; this flag is only recommended for parsing documents with many PCDATA nodes in memory-constrained environments.
// This flag is off by default.
const unsigned int parse_embed_pcdata = 0x2000;
PUGIXML_CONSTANT unsigned int parse_embed_pcdata = 0x2000;

// This flag determines whether determines whether the the two pcdata should be merged or not, if no intermediatory data are parsed in the document.
// This flag is off by default.
const unsigned int parse_merge_pcdata = 0x4000;
PUGIXML_CONSTANT unsigned int parse_merge_pcdata = 0x4000;

// The default parsing mode.
// Elements, PCDATA and CDATA sections are added to the DOM tree, character/reference entities are expanded,
// End-of-Line characters are normalized, attribute values are normalized using CDATA normalization rules.
const unsigned int parse_default = parse_cdata | parse_escapes | parse_wconv_attribute | parse_eol;
PUGIXML_CONSTANT unsigned int parse_default = parse_cdata | parse_escapes | parse_wconv_attribute | parse_eol;

// The full parsing mode.
// Nodes of all types are added to the DOM tree, character/reference entities are expanded,
// End-of-Line characters are normalized, attribute values are normalized using CDATA normalization rules.
const unsigned int parse_full = parse_default | parse_pi | parse_comments | parse_declaration | parse_doctype;
PUGIXML_CONSTANT unsigned int parse_full = parse_default | parse_pi | parse_comments | parse_declaration | parse_doctype;

// These flags determine the encoding of input data for XML document
enum xml_encoding
Expand All @@ -264,41 +295,41 @@ namespace pugi
// Formatting flags

// 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.
const unsigned int format_indent = 0x01;
PUGIXML_CONSTANT unsigned int format_indent = 0x01;

// Write encoding-specific BOM to the output stream. This flag is off by default.
const unsigned int format_write_bom = 0x02;
PUGIXML_CONSTANT unsigned int format_write_bom = 0x02;

// Use raw output mode (no indentation and no line breaks are written). This flag is off by default.
const unsigned int format_raw = 0x04;
PUGIXML_CONSTANT unsigned int format_raw = 0x04;

// Omit default XML declaration even if there is no declaration in the document. This flag is off by default.
const unsigned int format_no_declaration = 0x08;
PUGIXML_CONSTANT unsigned int format_no_declaration = 0x08;

// Don't escape attribute values and PCDATA contents. This flag is off by default.
const unsigned int format_no_escapes = 0x10;
PUGIXML_CONSTANT unsigned int format_no_escapes = 0x10;

// 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.
const unsigned int format_save_file_text = 0x20;
PUGIXML_CONSTANT unsigned int format_save_file_text = 0x20;

// Write every attribute on a new line with appropriate indentation. This flag is off by default.
const unsigned int format_indent_attributes = 0x40;
PUGIXML_CONSTANT unsigned int format_indent_attributes = 0x40;

// 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.
const unsigned int format_no_empty_element_tags = 0x80;
PUGIXML_CONSTANT unsigned int format_no_empty_element_tags = 0x80;

// Skip characters belonging to range [0; 32) instead of "&#xNN;" encoding. This flag is off by default.
const unsigned int format_skip_control_chars = 0x100;
PUGIXML_CONSTANT unsigned int format_skip_control_chars = 0x100;

// Use single quotes ' instead of double quotes " for enclosing attribute values. This flag is off by default.
const unsigned int format_attribute_single_quote = 0x200;
PUGIXML_CONSTANT unsigned int format_attribute_single_quote = 0x200;

// The default set of formatting flags.
// Nodes are indented depending on their depth in DOM tree, a default declaration is output if document has none.
const unsigned int format_default = format_indent;
PUGIXML_CONSTANT unsigned int format_default = format_indent;

const int default_double_precision = 17;
const int default_float_precision = 9;
PUGIXML_CONSTANT int default_double_precision = 17;
PUGIXML_CONSTANT int default_float_precision = 9;

// Forward declarations
struct xml_attribute_struct;
Expand Down