From d5303ddf0ba893d31f7e464aab3e36bc179e200e Mon Sep 17 00:00:00 2001 From: Sleepy Flower Girl Date: Sun, 27 May 2018 00:24:13 -0400 Subject: [PATCH 1/8] Add Discord Rich Presence support --- Externals/discord-rpc/bin/discord-rpc.dll | Bin 0 -> 400392 bytes .../discord-rpc/include/discord_register.h | 26 ++++++ Externals/discord-rpc/include/discord_rpc.h | 87 ++++++++++++++++++ Externals/discord-rpc/lib/discord-rpc.lib | Bin 0 -> 3622 bytes .../discord-rpc/lib/libdiscord-rpc.dylib | Bin 0 -> 260256 bytes Externals/discord-rpc/lib/libdiscord-rpc.so | Bin 0 -> 661146 bytes Source/Core/Core/Core.vcxproj | 2 +- Source/Core/Core/Core.vcxproj.filters | 2 +- Source/Core/DolphinQt2/DolphinQt2.vcxproj | 4 +- Source/Core/DolphinQt2/MainWindow.cpp | 3 + Source/Core/DolphinWX/DolphinWX.vcxproj | 4 +- Source/Core/DolphinWX/FrameTools.cpp | 3 + Source/Core/UICommon/CMakeLists.txt | 1 + Source/Core/UICommon/DiscordPresence.cpp | 48 ++++++++++ Source/Core/UICommon/DiscordPresence.h | 12 +++ Source/Core/UICommon/UICommon.cpp | 3 + Source/Core/UICommon/UICommon.vcxproj | 12 +++ Source/UnitTests/UnitTests.vcxproj | 4 +- 18 files changed, 203 insertions(+), 8 deletions(-) create mode 100644 Externals/discord-rpc/bin/discord-rpc.dll create mode 100644 Externals/discord-rpc/include/discord_register.h create mode 100644 Externals/discord-rpc/include/discord_rpc.h create mode 100644 Externals/discord-rpc/lib/discord-rpc.lib create mode 100644 Externals/discord-rpc/lib/libdiscord-rpc.dylib create mode 100644 Externals/discord-rpc/lib/libdiscord-rpc.so create mode 100644 Source/Core/UICommon/DiscordPresence.cpp create mode 100644 Source/Core/UICommon/DiscordPresence.h diff --git a/Externals/discord-rpc/bin/discord-rpc.dll b/Externals/discord-rpc/bin/discord-rpc.dll new file mode 100644 index 0000000000000000000000000000000000000000..289d550306073492d7b88fac35e302b1bc1bfab2 GIT binary patch literal 400392 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 hVircj*+6;9g$Z{l;3O*a4l~(j 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 Y)pLkpKVy literal 0 HcmV?d00001 diff --git a/Externals/discord-rpc/include/discord_register.h b/Externals/discord-rpc/include/discord_register.h new file mode 100644 index 0000000000..4c16b68a7f --- /dev/null +++ b/Externals/discord-rpc/include/discord_register.h @@ -0,0 +1,26 @@ +#pragma once + +#if defined(DISCORD_DYNAMIC_LIB) +# if defined(_WIN32) +# if defined(DISCORD_BUILDING_SDK) +# define DISCORD_EXPORT __declspec(dllexport) +# else +# define DISCORD_EXPORT __declspec(dllimport) +# endif +# else +# define DISCORD_EXPORT __attribute__((visibility("default"))) +# endif +#else +# define DISCORD_EXPORT +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +DISCORD_EXPORT void Discord_Register(const char* applicationId, const char* command); +DISCORD_EXPORT void Discord_RegisterSteamGame(const char* applicationId, const char* steamId); + +#ifdef __cplusplus +} +#endif diff --git a/Externals/discord-rpc/include/discord_rpc.h b/Externals/discord-rpc/include/discord_rpc.h new file mode 100644 index 0000000000..3e1441e058 --- /dev/null +++ b/Externals/discord-rpc/include/discord_rpc.h @@ -0,0 +1,87 @@ +#pragma once +#include + +// clang-format off + +#if defined(DISCORD_DYNAMIC_LIB) +# if defined(_WIN32) +# if defined(DISCORD_BUILDING_SDK) +# define DISCORD_EXPORT __declspec(dllexport) +# else +# define DISCORD_EXPORT __declspec(dllimport) +# endif +# else +# define DISCORD_EXPORT __attribute__((visibility("default"))) +# endif +#else +# define DISCORD_EXPORT +#endif + +// clang-format on + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct DiscordRichPresence { + const char* state; /* max 128 bytes */ + const char* details; /* max 128 bytes */ + int64_t startTimestamp; + int64_t endTimestamp; + const char* largeImageKey; /* max 32 bytes */ + const char* largeImageText; /* max 128 bytes */ + const char* smallImageKey; /* max 32 bytes */ + const char* smallImageText; /* max 128 bytes */ + const char* partyId; /* max 128 bytes */ + int partySize; + int partyMax; + const char* matchSecret; /* max 128 bytes */ + const char* joinSecret; /* max 128 bytes */ + const char* spectateSecret; /* max 128 bytes */ + int8_t instance; +} DiscordRichPresence; + +typedef struct DiscordUser { + const char* userId; + const char* username; + const char* discriminator; + const char* avatar; +} DiscordUser; + +typedef struct DiscordEventHandlers { + void (*ready)(const DiscordUser* request); + void (*disconnected)(int errorCode, const char* message); + void (*errored)(int errorCode, const char* message); + void (*joinGame)(const char* joinSecret); + void (*spectateGame)(const char* spectateSecret); + void (*joinRequest)(const DiscordUser* request); +} DiscordEventHandlers; + +#define DISCORD_REPLY_NO 0 +#define DISCORD_REPLY_YES 1 +#define DISCORD_REPLY_IGNORE 2 + +DISCORD_EXPORT void Discord_Initialize(const char* applicationId, + DiscordEventHandlers* handlers, + int autoRegister, + const char* optionalSteamId); +DISCORD_EXPORT void Discord_Shutdown(void); + +/* checks for incoming messages, dispatches callbacks */ +DISCORD_EXPORT void Discord_RunCallbacks(void); + +/* If you disable the lib starting its own io thread, you'll need to call this from your own */ +#ifdef DISCORD_DISABLE_IO_THREAD +DISCORD_EXPORT void Discord_UpdateConnection(void); +#endif + +DISCORD_EXPORT void Discord_UpdatePresence(const DiscordRichPresence* presence); +DISCORD_EXPORT void Discord_ClearPresence(void); + +DISCORD_EXPORT void Discord_Respond(const char* userid, /* DISCORD_REPLY_ */ int reply); + +DISCORD_EXPORT void Discord_UpdateHandlers(DiscordEventHandlers* handlers); + +#ifdef __cplusplus +} /* extern "C" */ +#endif diff --git a/Externals/discord-rpc/lib/discord-rpc.lib b/Externals/discord-rpc/lib/discord-rpc.lib new file mode 100644 index 0000000000000000000000000000000000000000..fdf4abe6d03feb1c232a9fe2a9e7da100a6d4e4d GIT binary patch literal 3622 zcmcImPfrs;6n||g#Vsfi^=48cikb+eu+=7Nij+tL6w;Op2bN`bg^k-k*_N1iz#Av; zd;_8vzJUn`K7b}(ypU+(7vKxvo6gL3ce-sU$RuxP=e;-cn|bqlGc)>9wY8ns(qznA zrsTwQDn1oYCB6DMYs!vcQv!gy0O15c!~z&N1d#Tq44wcqB!@N1&=D1B0PQHzQz}DA z)T2meRH8cSbw$Z8udd{aN@l(=m(Q*iSMrK(*0hSPKeMYEC`xW^X{pr-KDoT8PjO)_ zx2R-hi?fiSBPiLjSvOV7{Al1nW~r+97`Upivs>3IAIgHKqvn43-SV7jSzD_1z9#s3 zOx%C1s;hNl)i!EISrg|W7;)t5 zlQ*`_THUZ)hGuHfuTVGC(p$A8E|rhdwD-!#WSkRqQyN4LB4p25 zC{O!il8^>nn9lunWyEB{AMq(7hI|m4SEmRqw7bW*4RQ>T`#i|>QWnPVeLtW3uk<0} yh241W>s|!?uRGfBLUmpeS4ZSefS5O1#&Mky7ozY;xmH~A+Rdm?Qk3-o literal 0 HcmV?d00001 diff --git a/Externals/discord-rpc/lib/libdiscord-rpc.dylib b/Externals/discord-rpc/lib/libdiscord-rpc.dylib new file mode 100644 index 0000000000000000000000000000000000000000..b48f5616cdb89650f856aa74124ecfd4624d8620 GIT binary patch literal 260256 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 - + \ No newline at end of file diff --git a/Source/Core/Core/Core.vcxproj.filters b/Source/Core/Core/Core.vcxproj.filters index 944dfc1436..1dad1f08f2 100644 --- a/Source/Core/Core/Core.vcxproj.filters +++ b/Source/Core/Core/Core.vcxproj.filters @@ -1584,4 +1584,4 @@ - + \ No newline at end of file diff --git a/Source/Core/DolphinQt2/DolphinQt2.vcxproj b/Source/Core/DolphinQt2/DolphinQt2.vcxproj index decbae647a..2b0698682a 100644 --- a/Source/Core/DolphinQt2/DolphinQt2.vcxproj +++ b/Source/Core/DolphinQt2/DolphinQt2.vcxproj @@ -40,8 +40,8 @@ - $(ExternalsDir)ffmpeg\lib;%(AdditionalLibraryDirectories) - avrt.lib;iphlpapi.lib;winmm.lib;setupapi.lib;opengl32.lib;glu32.lib;rpcrt4.lib;comctl32.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;Shlwapi.lib;%(AdditionalDependencies) + $(ExternalsDir)ffmpeg\lib;$(ExternalsDir)discord-rpc\lib;%(AdditionalLibraryDirectories) + avrt.lib;iphlpapi.lib;winmm.lib;setupapi.lib;opengl32.lib;glu32.lib;rpcrt4.lib;comctl32.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;Shlwapi.lib;discord-rpc.lib;%(AdditionalDependencies) $(ProjectDir)VideoInterface;$(ProjectDir)GameList;$(ProjectDir)Debugger;$(ProjectDir)Settings;$(ProjectDir)Config;$(ProjectDir)Config\Mapping;$(ProjectDir)Config\Graphics;$(ProjectDir)NetPlay;$(ProjectDir)QtUtils;$(ProjectDir)TAS;$(ProjectDir)FIFO;%(AdditionalIncludeDirectories) diff --git a/Source/Core/DolphinQt2/MainWindow.cpp b/Source/Core/DolphinQt2/MainWindow.cpp index 524ec9114b..edd4bb199a 100644 --- a/Source/Core/DolphinQt2/MainWindow.cpp +++ b/Source/Core/DolphinQt2/MainWindow.cpp @@ -79,6 +79,7 @@ #include "InputCommon/ControllerInterface/ControllerInterface.h" +#include "UICommon/DiscordPresence.h" #include "UICommon/UICommon.h" #if defined(HAVE_XRANDR) && HAVE_XRANDR @@ -569,6 +570,7 @@ void MainWindow::OnStopComplete() m_stop_requested = false; HideRenderWidget(); EnableScreenSaver(true); + Discord::UpdateDiscordPresence(); SetFullScreenResolution(false); @@ -719,6 +721,7 @@ void MainWindow::StartGame(std::unique_ptr&& parameters) return; } ShowRenderWidget(); + Discord::UpdateDiscordPresence(); #ifdef Q_OS_WIN // Prevents Windows from sleeping, turning off the display, or idling diff --git a/Source/Core/DolphinWX/DolphinWX.vcxproj b/Source/Core/DolphinWX/DolphinWX.vcxproj index d7d7519f16..1aabf572a2 100644 --- a/Source/Core/DolphinWX/DolphinWX.vcxproj +++ b/Source/Core/DolphinWX/DolphinWX.vcxproj @@ -38,8 +38,8 @@ - $(ExternalsDir)ffmpeg\lib;%(AdditionalLibraryDirectories) - avrt.lib;iphlpapi.lib;winmm.lib;setupapi.lib;opengl32.lib;glu32.lib;rpcrt4.lib;comctl32.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;Shlwapi.lib;%(AdditionalDependencies) + $(ExternalsDir)ffmpeg\lib;$(ExternalsDir)discord-rpc\lib;%(AdditionalLibraryDirectories) + avrt.lib;iphlpapi.lib;winmm.lib;setupapi.lib;opengl32.lib;glu32.lib;rpcrt4.lib;comctl32.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;Shlwapi.lib;discord-rpc.lib;%(AdditionalDependencies) $(ExternalsDir)wxWidgets3\include;%(AdditionalIncludeDirectories) diff --git a/Source/Core/DolphinWX/FrameTools.cpp b/Source/Core/DolphinWX/FrameTools.cpp index ea6f504e7c..63dcdc16c5 100644 --- a/Source/Core/DolphinWX/FrameTools.cpp +++ b/Source/Core/DolphinWX/FrameTools.cpp @@ -91,6 +91,7 @@ #include "InputCommon/ControllerInterface/ControllerInterface.h" +#include "UICommon/DiscordPresence.h" #include "UICommon/GameFile.h" #include "UICommon/UICommon.h" @@ -744,6 +745,7 @@ void CFrame::StartGame(std::unique_ptr boot) else { EnableScreenSaver(false); + Discord::UpdateDiscordPresence(); // We need this specifically to support setting the focus properly when using // the 'render to main window' feature on Windows @@ -930,6 +932,7 @@ void CFrame::OnStopped() wxPostEvent(GetMenuBar(), wxCommandEvent{DOLPHIN_EVT_UPDATE_LOAD_WII_MENU_ITEM}); EnableScreenSaver(true); + Discord::UpdateDiscordPresence(); m_render_frame->SetTitle(StrToWxStr(Common::scm_rev_str)); diff --git a/Source/Core/UICommon/CMakeLists.txt b/Source/Core/UICommon/CMakeLists.txt index ed94341182..8b3976fb0c 100644 --- a/Source/Core/UICommon/CMakeLists.txt +++ b/Source/Core/UICommon/CMakeLists.txt @@ -2,6 +2,7 @@ add_library(uicommon AutoUpdate.cpp CommandLineParse.cpp Disassembler.cpp + DiscordPresence.cpp GameFile.cpp GameFileCache.cpp UICommon.cpp diff --git a/Source/Core/UICommon/DiscordPresence.cpp b/Source/Core/UICommon/DiscordPresence.cpp new file mode 100644 index 0000000000..0ec4cdb5b8 --- /dev/null +++ b/Source/Core/UICommon/DiscordPresence.cpp @@ -0,0 +1,48 @@ +// Copyright 2018 Dolphin Emulator Project +// Licensed under GPLv2+ +// Refer to the license.txt file included. + +#ifdef USE_DISCORD_PRESENCE + +#include "UICommon/DiscordPresence.h" + +#include +#include + +#include "Core/ConfigManager.h" + +#endif + +namespace Discord +{ +void Init() +{ +#ifdef USE_DISCORD_PRESENCE + DiscordEventHandlers handlers = {}; + // The number is the client ID for Dolphin, it's used for images and the appication name + Discord_Initialize("450033159212630028", &handlers, 1, nullptr); + UpdateDiscordPresence(); +#endif +} + +void UpdateDiscordPresence() +{ +#ifdef USE_DISCORD_PRESENCE + const std::string& title = SConfig::GetInstance().GetTitleDescription(); + + DiscordRichPresence discord_presence = {}; + discord_presence.largeImageKey = "dolphin_logo"; + discord_presence.largeImageText = "Dolphin is an emulator for the GameCube and the Wii."; + discord_presence.details = title.empty() ? "Not in-game" : title.c_str(); + discord_presence.startTimestamp = std::time(nullptr); + Discord_UpdatePresence(&discord_presence); +#endif +} + +void Shutdown() +{ +#ifdef USE_DISCORD_PRESENCE + Discord_Shutdown(); +#endif +} +} // namespace Discord diff --git a/Source/Core/UICommon/DiscordPresence.h b/Source/Core/UICommon/DiscordPresence.h new file mode 100644 index 0000000000..dc516fd655 --- /dev/null +++ b/Source/Core/UICommon/DiscordPresence.h @@ -0,0 +1,12 @@ +// Copyright 2018 Dolphin Emulator Project +// Licensed under GPLv2+ +// Refer to the license.txt file included. + +#pragma once + +namespace Discord +{ +void Init(); +void UpdateDiscordPresence(); +void Shutdown(); +} // namespace Discord diff --git a/Source/Core/UICommon/UICommon.cpp b/Source/Core/UICommon/UICommon.cpp index 16fd08bad0..24a60b27a8 100644 --- a/Source/Core/UICommon/UICommon.cpp +++ b/Source/Core/UICommon/UICommon.cpp @@ -33,6 +33,7 @@ #include "InputCommon/GCAdapter.h" +#include "UICommon/DiscordPresence.h" #include "UICommon/UICommon.h" #include "UICommon/USBUtils.h" @@ -75,6 +76,7 @@ void Init() Config::AddConfigChangedCallback(InitCustomPaths); Config::AddLayer(ConfigLoaders::GenerateBaseConfigLoader()); SConfig::Init(); + Discord::Init(); LogManager::Init(); VideoBackendBase::PopulateList(); WiimoteReal::LoadSettings(); @@ -90,6 +92,7 @@ void Shutdown() WiimoteReal::Shutdown(); VideoBackendBase::ClearList(); LogManager::Shutdown(); + Discord::Shutdown(); SConfig::Shutdown(); Config::Shutdown(); } diff --git a/Source/Core/UICommon/UICommon.vcxproj b/Source/Core/UICommon/UICommon.vcxproj index 4ee5a357c0..1a650b3a0c 100644 --- a/Source/Core/UICommon/UICommon.vcxproj +++ b/Source/Core/UICommon/UICommon.vcxproj @@ -35,6 +35,16 @@ + + + USE_DISCORD_PRESENCE;%(PreprocessorDefinitions) + + + + + USE_DISCORD_PRESENCE;%(PreprocessorDefinitions) + + @@ -49,6 +59,7 @@ + @@ -61,6 +72,7 @@ + diff --git a/Source/UnitTests/UnitTests.vcxproj b/Source/UnitTests/UnitTests.vcxproj index d356803905..cb5c37b863 100644 --- a/Source/UnitTests/UnitTests.vcxproj +++ b/Source/UnitTests/UnitTests.vcxproj @@ -45,8 +45,8 @@ The following libs are needed since we pull in pretty much the entire dolphin codebase. --> - $(ExternalsDir)ffmpeg\lib;%(AdditionalLibraryDirectories) - avrt.lib;iphlpapi.lib;winmm.lib;setupapi.lib;opengl32.lib;glu32.lib;rpcrt4.lib;comctl32.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;Shlwapi.lib;%(AdditionalDependencies) + $(ExternalsDir)ffmpeg\lib;$(ExternalsDir)discord-rpc\lib;%(AdditionalLibraryDirectories) + avrt.lib;iphlpapi.lib;winmm.lib;setupapi.lib;opengl32.lib;glu32.lib;rpcrt4.lib;comctl32.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;Shlwapi.lib;discord-rpc.lib;%(AdditionalDependencies) Console From 678f8da95b47a7749afc7a9cb556d435a4be38df Mon Sep 17 00:00:00 2001 From: Sleepy Flower Girl Date: Mon, 28 May 2018 17:39:58 -0400 Subject: [PATCH 2/8] Moved Discord RPC library's source code to external --- Externals/discord-rpc/CMakeLists.txt | 56 + Externals/discord-rpc/LICENSE | 19 + Externals/discord-rpc/README.md | 91 + Externals/discord-rpc/bin/discord-rpc.dll | Bin 400392 -> 0 bytes Externals/discord-rpc/build.py | 304 ++ .../discord-rpc/include/discord_register.h | 20 +- Externals/discord-rpc/lib/discord-rpc.lib | Bin 3622 -> 0 bytes .../discord-rpc/lib/libdiscord-rpc.dylib | Bin 260256 -> 0 bytes Externals/discord-rpc/lib/libdiscord-rpc.so | Bin 661146 -> 0 bytes Externals/discord-rpc/src/CMakeLists.txt | 142 + Externals/discord-rpc/src/backoff.h | 40 + Externals/discord-rpc/src/connection.h | 19 + Externals/discord-rpc/src/connection_unix.cpp | 122 + Externals/discord-rpc/src/connection_win.cpp | 128 + Externals/discord-rpc/src/discord-rpc.vcxproj | 93 + .../src/discord_register_linux.cpp | 100 + .../discord-rpc/src/discord_register_osx.m | 80 + .../discord-rpc/src/discord_register_win.cpp | 185 ++ Externals/discord-rpc/src/discord_rpc.cpp | 499 ++++ Externals/discord-rpc/src/dllmain.cpp | 8 + Externals/discord-rpc/src/msg_queue.h | 36 + Externals/discord-rpc/src/rpc_connection.cpp | 141 + Externals/discord-rpc/src/rpc_connection.h | 59 + Externals/discord-rpc/src/serialization.cpp | 245 ++ Externals/discord-rpc/src/serialization.h | 215 ++ .../thirdparty/include/rapidjson/allocators.h | 271 ++ .../thirdparty/include/rapidjson/document.h | 2575 +++++++++++++++++ .../include/rapidjson/encodedstream.h | 299 ++ .../thirdparty/include/rapidjson/encodings.h | 716 +++++ .../thirdparty/include/rapidjson/error/en.h | 74 + .../include/rapidjson/error/error.h | 155 + .../include/rapidjson/filereadstream.h | 99 + .../include/rapidjson/filewritestream.h | 104 + .../thirdparty/include/rapidjson/fwd.h | 151 + .../include/rapidjson/internal/biginteger.h | 290 ++ .../include/rapidjson/internal/diyfp.h | 258 ++ .../include/rapidjson/internal/dtoa.h | 245 ++ .../include/rapidjson/internal/ieee754.h | 78 + .../include/rapidjson/internal/itoa.h | 304 ++ .../include/rapidjson/internal/meta.h | 181 ++ .../include/rapidjson/internal/pow10.h | 55 + .../include/rapidjson/internal/regex.h | 701 +++++ .../include/rapidjson/internal/stack.h | 230 ++ .../include/rapidjson/internal/strfunc.h | 55 + .../include/rapidjson/internal/strtod.h | 269 ++ .../include/rapidjson/internal/swap.h | 46 + .../include/rapidjson/istreamwrapper.h | 115 + .../include/rapidjson/memorybuffer.h | 70 + .../include/rapidjson/memorystream.h | 71 + .../include/rapidjson/msinttypes/inttypes.h | 316 ++ .../include/rapidjson/msinttypes/stdint.h | 300 ++ .../include/rapidjson/ostreamwrapper.h | 81 + .../thirdparty/include/rapidjson/pointer.h | 1358 +++++++++ .../include/rapidjson/prettywriter.h | 255 ++ .../thirdparty/include/rapidjson/rapidjson.h | 615 ++++ .../thirdparty/include/rapidjson/reader.h | 1879 ++++++++++++ .../thirdparty/include/rapidjson/schema.h | 2006 +++++++++++++ .../thirdparty/include/rapidjson/stream.h | 179 ++ .../include/rapidjson/stringbuffer.h | 117 + .../thirdparty/include/rapidjson/writer.h | 610 ++++ Source/Core/DolphinQt2/DolphinQt2.vcxproj | 2 +- Source/Core/DolphinWX/DolphinWX.vcxproj | 2 +- Source/Core/UICommon/CMakeLists.txt | 2 +- Source/Core/UICommon/UICommon.vcxproj | 13 +- Source/UnitTests/UnitTests.vcxproj | 2 +- Source/VSProps/Base.props | 1 + Source/dolphin-emu.sln | 7 + 67 files changed, 17735 insertions(+), 24 deletions(-) create mode 100644 Externals/discord-rpc/CMakeLists.txt create mode 100644 Externals/discord-rpc/LICENSE create mode 100644 Externals/discord-rpc/README.md delete mode 100644 Externals/discord-rpc/bin/discord-rpc.dll create mode 100644 Externals/discord-rpc/build.py delete mode 100644 Externals/discord-rpc/lib/discord-rpc.lib delete mode 100644 Externals/discord-rpc/lib/libdiscord-rpc.dylib delete mode 100644 Externals/discord-rpc/lib/libdiscord-rpc.so create mode 100644 Externals/discord-rpc/src/CMakeLists.txt create mode 100644 Externals/discord-rpc/src/backoff.h create mode 100644 Externals/discord-rpc/src/connection.h create mode 100644 Externals/discord-rpc/src/connection_unix.cpp create mode 100644 Externals/discord-rpc/src/connection_win.cpp create mode 100644 Externals/discord-rpc/src/discord-rpc.vcxproj create mode 100644 Externals/discord-rpc/src/discord_register_linux.cpp create mode 100644 Externals/discord-rpc/src/discord_register_osx.m create mode 100644 Externals/discord-rpc/src/discord_register_win.cpp create mode 100644 Externals/discord-rpc/src/discord_rpc.cpp create mode 100644 Externals/discord-rpc/src/dllmain.cpp create mode 100644 Externals/discord-rpc/src/msg_queue.h create mode 100644 Externals/discord-rpc/src/rpc_connection.cpp create mode 100644 Externals/discord-rpc/src/rpc_connection.h create mode 100644 Externals/discord-rpc/src/serialization.cpp create mode 100644 Externals/discord-rpc/src/serialization.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/allocators.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/document.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/encodedstream.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/encodings.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/error/en.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/error/error.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/filereadstream.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/filewritestream.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/fwd.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/internal/biginteger.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/internal/diyfp.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/internal/dtoa.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/internal/ieee754.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/internal/itoa.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/internal/meta.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/internal/pow10.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/internal/regex.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/internal/stack.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/internal/strfunc.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/internal/strtod.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/internal/swap.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/istreamwrapper.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/memorybuffer.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/memorystream.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/msinttypes/inttypes.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/msinttypes/stdint.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/ostreamwrapper.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/pointer.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/prettywriter.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/rapidjson.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/reader.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/schema.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/stream.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/stringbuffer.h create mode 100644 Externals/discord-rpc/thirdparty/include/rapidjson/writer.h diff --git a/Externals/discord-rpc/CMakeLists.txt b/Externals/discord-rpc/CMakeLists.txt new file mode 100644 index 0000000000..5dad9e9f6d --- /dev/null +++ b/Externals/discord-rpc/CMakeLists.txt @@ -0,0 +1,56 @@ +cmake_minimum_required (VERSION 3.2.0) +project (DiscordRPC) + +include(GNUInstallDirs) + +option(BUILD_EXAMPLES "Build example apps" ON) + +# format +file(GLOB_RECURSE ALL_SOURCE_FILES + examples/*.cpp examples/*.h examples/*.c + include/*.h + src/*.cpp src/*.h src/*.c +) + +# Set CLANG_FORMAT_SUFFIX if you are using custom clang-format, e.g. clang-format-5.0 +find_program(CLANG_FORMAT_CMD clang-format${CLANG_FORMAT_SUFFIX}) + +if (CLANG_FORMAT_CMD) + add_custom_target( + clangformat + COMMAND ${CLANG_FORMAT_CMD} + -i -style=file -fallback-style=none + ${ALL_SOURCE_FILES} + DEPENDS + ${ALL_SOURCE_FILES} + ) +endif(CLANG_FORMAT_CMD) + +# thirdparty stuff +execute_process( + COMMAND mkdir ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty + ERROR_QUIET +) + +find_file(RAPIDJSONTEST NAMES rapidjson rapidjson-1.1.0 PATHS ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty CMAKE_FIND_ROOT_PATH_BOTH) +if (NOT RAPIDJSONTEST) + message("no rapidjson, download") + set(RJ_TAR_FILE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/v1.1.0.tar.gz) + file(DOWNLOAD https://github.com/miloyip/rapidjson/archive/v1.1.0.tar.gz ${RJ_TAR_FILE}) + execute_process( + COMMAND ${CMAKE_COMMAND} -E tar xzf ${RJ_TAR_FILE} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty + ) + file(REMOVE ${RJ_TAR_FILE}) +endif(NOT RAPIDJSONTEST) + +find_file(RAPIDJSON NAMES rapidjson rapidjson-1.1.0 PATHS ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty CMAKE_FIND_ROOT_PATH_BOTH) + +add_library(rapidjson STATIC IMPORTED ${RAPIDJSON}) + +# add subdirs + +add_subdirectory(src) +if (BUILD_EXAMPLES) + add_subdirectory(examples/send-presence) +endif(BUILD_EXAMPLES) diff --git a/Externals/discord-rpc/LICENSE b/Externals/discord-rpc/LICENSE new file mode 100644 index 0000000000..17fca3d50f --- /dev/null +++ b/Externals/discord-rpc/LICENSE @@ -0,0 +1,19 @@ +Copyright 2017 Discord, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Externals/discord-rpc/README.md b/Externals/discord-rpc/README.md new file mode 100644 index 0000000000..011c961755 --- /dev/null +++ b/Externals/discord-rpc/README.md @@ -0,0 +1,91 @@ +# Discord RPC + +This is a library for interfacing your game with a locally running Discord desktop client. It's known to work on Windows, macOS, and Linux. You can use the lib directly if you like, or use it as a guide to writing your own if it doesn't suit your game as is. PRs/feedback welcome if you have an improvement everyone might want, or can describe how this doesn't meet your needs. + +Included here are some quick demos that implement the very minimal subset to show current status, and +have callbacks for where a more complete game would do more things (joining, spectating, etc). + +## Documentation + +The most up to date documentation for Rich Presence can always be found on our [developer site](https://discordapp.com/developers/docs/rich-presence/how-to)! If you're interested in rolling your own native implementation of Rich Presence via IPC sockets instead of using our SDK—hey, you've got free time, right?—check out the ["Hard Mode" documentation](https://github.com/discordapp/discord-rpc/blob/master/documentation/hard-mode.md). + +## Basic Usage + +Zeroith, you should be set up to build things because you are a game developer, right? + +First, head on over to the [Discord developers site](https://discordapp.com/developers/applications/me) and make yourself an app. Keep track of `Client ID` -- you'll need it here to pass to the init function. + +### From package + +Download a release package for your platform(s) -- they have subdirs with various prebuilt options, select the one you need add `/include` to your compile includes, `/lib` to your linker paths, and link with `discord-rpc`. For the dynamically linked builds, you'll need to ship the associated file along with your game. + +### From repo + +First-eth, you'll want `CMake`. There's a few different ways to install it on your system, and you should refer to [their website](https://cmake.org/install/). Many package managers provide ways of installing CMake as well. + +To make sure it's installed correctly, type `cmake --version` into your flavor of terminal/cmd. If you get a response with a version number, you're good to go! + +There's a [CMake](https://cmake.org/download/) file that should be able to generate the lib for you; Sometimes I use it like this: +```sh + cd + mkdir build + cd build + cmake .. -DCMAKE_INSTALL_PREFIX= + cmake --build . --config Release --target install +``` +There is a wrapper build script `build.py` that runs `cmake` with a few different options. + +Usually, I run `build.py` to get things started, then use the generated project files as I work on things. It does depend on `click` library, so do a quick `pip install click` to make sure you have it if you want to run `build.py`. + +There are some CMake options you might care about: + +| flag | default | does | +|------|---------|------| +| `ENABLE_IO_THREAD` | `ON` | When enabled, we start up a thread to do io processing, if disabled you should call `Discord_UpdateConnection` yourself. +| `USE_STATIC_CRT` | `OFF` | (Windows) Enable to statically link the CRT, avoiding requiring users install the redistributable package. (The prebuilt binaries enable this option) +| [`BUILD_SHARED_LIBS`](https://cmake.org/cmake/help/v3.7/variable/BUILD_SHARED_LIBS.html) | `OFF` | Build library as a DLL +| `WARNINGS_AS_ERRORS` | `OFF` | When enabled, compiles with `-Werror` (on *nix platforms). | + +## Continuous Builds + +Why do we have three of these? Three times the fun! + +| CI | badge | +|----|-------| +| TravisCI | [![Build status](https://travis-ci.org/discordapp/discord-rpc.svg?branch=master)](https://travis-ci.org/discordapp/discord-rpc) +| AppVeyor | [![Build status](https://ci.appveyor.com/api/projects/status/qvkoc0w1c4f4b8tj?svg=true)](https://ci.appveyor.com/project/crmarsh/discord-rpc) +| Buildkite (internal) | [![Build status](https://badge.buildkite.com/e103d79d247f6776605a15246352a04b8fd83d69211b836111.svg)](https://buildkite.com/discord/discord-rpc) + +## Sample: send-presence + +This is a text adventure "game" that inits/deinits the connection to Discord, and sends a presence update on each command. + +## Sample: button-clicker + +This is a sample [Unity](https://unity3d.com/) project that wraps a DLL version of the library, and sends presence updates when you click on a button. Run `python build.py unity` in the root directory to build the correct library files and place them in their respective folders. + +## Sample: unrealstatus + +This is a sample [Unreal](https://www.unrealengine.com) project that wraps the DLL version of the library with an Unreal plugin, exposes a blueprint class for interacting with it, and uses that to make a very simple UI. Run `python build.py unreal` in the root directory to build the correct library files and place them in their respective folders. + +## Wrappers and Implementations + +Below is a table of unofficial, community-developed wrappers for and implementations of Rich Presence in various languages. If you would like to have yours added, please make a pull request adding your repository to the table. The repository should include: + +- The code +- A brief ReadMe of how to use it +- A working example + +###### Rich Presence Wrappers and Implementations + +| Name | Language | +|------|----------| +| [DerelictDiscordRPC](https://github.com/voidblaster/DerelictDiscordRPC) | [D](https://dlang.org/) | +| [discord-rpc.jar](https://github.com/Vatuu/discord-rpc "Discord-RPC.jar") | Java | +| [java-discord-rpc](https://github.com/MinnDevelopment/java-discord-rpc) | Java | +| [Discord-IPC](https://github.com/jagrosh/DiscordIPC) | Java | +| [Discord Rich Presence](https://npmjs.org/discord-rich-presence) | JavaScript | +| [drpc4k](https://github.com/Bluexin/drpc4k) | [Kotlin](https://kotlinlang.org/) | +| [lua-discordRPC](https://github.com/pfirsich/lua-discordRPC) | LuaJIT (FFI) | +| [pypresence](https://github.com/qwertyquerty/pypresence) | [Python](https://python.org/) | +| [SwordRPC](https://github.com/Azoy/SwordRPC) | [Swift](https://swift.org) | diff --git a/Externals/discord-rpc/bin/discord-rpc.dll b/Externals/discord-rpc/bin/discord-rpc.dll deleted file mode 100644 index 289d550306073492d7b88fac35e302b1bc1bfab2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 400392 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 hVircj*+6;9g$Z{l;3O*a4l~(j zD!%xYm(=ig?yX8bG$!Fx2-WpK+^IE@-hr$CezY1cN((ASjUkmyve$Ny<=Z{~OB&&8 z?`~K=Fo|}#Yi6eBWXhKle6XomGcG13OdP$`9bO3&gmRTE*A(KDj8>a!Q5i4Oznam` zSjXs*Anm;vy&3%(Ll~nN;~3Kz^BDE5q@Kl07cs73T+3L@xPfsa<0i%u#!|+ej1`Rg z7%Lf%Fjg@hW2|O8#b{?d$5_jFiLs9HI-_Eg@oCQJ!Pth;ld&VC7h^X@4P!4xZ^r(N zT1G!cf5t}{^^8%B35;osd5lGj#f+tlRg86vUWqb3{)};q1&qav6^wR9&m`$i%cy4z zVT@u-U|h^t#8}K&!dS^z%jlIX_3Iha7}qeCGFCHsm^dDcX^cx5)pEFo=@Q0DMmwWN ziqsPypNQADlhrL)N_>1$vMDJOXf|50^rx_ikGI;AL92}Tcv~8d1a>gu<5N)UT8aWLri5xs0i~_`YPj$= z1ua-8Bf!wIgsMd^I(l<#TCHBBGL^#!|MKSlBJ!A1AD9>nFN>x*+^ z6s0#Vs8Sw<4u~r{V1J-D9$52$({Rnf^&lM0!A)P-_rv9bYXGj^xO8yzC=@)1`#HF# z;Yyg9Vxt+xhv1e>!puZBniA8O=_;uk}T{JDABT0 zopLiNKancn=h7lB+a$>BkjX_SWVlHrB%4x<^d?DC4o<+5PQ`h5xfT)D1j=iprE&MH z-_wqn|SrXrP}lRXoz2r9vY}uG%;u|G$DMB zn4{V&njmTpf-`Zho{O!QZ;GhCOQpm z6md2;6r|hC#fqTs{KS@)-ziLwtDCbf%A@*5f+U5 z*LFeoi`Xepd+RHK%ih^7>?e)eBj`OB_X_&Ts(pfP_0WESURw?jmi2nAQrJ&PJt*kF zK8FN-(k@UR{>EX!FEkzz{CB&2EAaD!0+osdpu(81!P5pjVIjUfB1% zD6rt%+8>D4UkUkSqNe zH2q#+^{V?$3B83zf%>`)0+p)Y1ZsTxo)-33GX(1O?+Pq#`n$mDpof1I{*vFS`SD`@ zoPr02=qgg1t|_;s>DKL9`pV>8({wKk*ca2kX`D_Q-C_9b9f`VU=UCIAfR#>u1m2vTgZf-LcmvKG)MPM>ngBH}j5+rEmOdWIY+WapPZGzA83DcYVwIGb)A|b;R`FzQlTqQ^M(we^( zc4#$7cj$`?JA%(9=oU};=v>S9<8^8AAC36+LZt5X8D0Jgetx9xx!6ek@ot&AX^B7F z`SxnP?%Xdoo(uQM*7>b^tLEEFiMlVQ?91Mhnyj02ZbYTtoUI%3^TMDnzev>ugPeBn7ZN%!p8&WBH|&C&(!eCyu66Owe{9)>^PJsG2$y{BTz z=@n6&4qDxp4>kQvSCXY$Q?j;X@~1{!kK6{a$OY9c-!o`nFy7AGMC+afdbR9OG zIMd%SPWNd3;Pb<-W$Q9?QU|JK0kg!-zWA*6o+*94*45scTH#mlXuvCvU1-%aEHNN( z)c21B0i|p~z|Yg3z{#=80*>t3D)85s@h~3;#1a6doTv{I=wEo@jZrn7$(Sil+d+RZJ2x{EeMZ%^K>ehpN7dX1y17aKpL3&Ef`%Us z^OPIC%8f2^qn~!8pK+s~b)z>ot?%E*ZZs{Il4&MEoSj3rG*6+ZDai^?Z>n#SHbbxz^L+3^pvK!)bzV2v%GU=`Gf!!+Y7TG zKt)lk$A1-|qV!LeZ$+tQ{_74@lxsJG9)9A>VUMia_TrUppC8&b`=@?ApD2^=6a|%! z?Ddu3pFciQ|76)?TAyz{!=5a=xv-yURHszbZ{tQ7orZnyBeQNOgji*HK@@IZmjzqO4IZqcTV#BD{lXvFp%k;FYPe}8Lq?bZMJat*0miCF?o%w^Arht=NFw;>$ax)GW@uL}O_X+8rh>QHr z#6|X5xHP!TxVqu8;G(b=;G(cDU|a|!{vuqYXE82vk9sRwkabMI3Z!suz(xMNiHqbu z#YN%TkBjV&;v#!5BnG8Vlv$4R)%nLFrYjjWGo*b1VdDYoUb*}U8+|xX1ri(k8GM^U0srso%fWoE6}l<3bh53h4_b#0f2UubSDXa* zbP}-*^Sg99G0ig9pC?w+;P3R24h!O*jnmT95K-EzA^Lmw`S6+Cryy>s24|}MoqIX+ zZ9ynhx30ebeR}7KRFGweG)SNSF8t)5`ZV)F*ll>G(|$|~LLozxjM&U-AWRL%hukJX z2c@J9Gw(joM(INNoQ0I3v!|0l$+A^Hr__{|MZkp9k|{0fuM5-U*(fGf~! zmhU5A;~;l#V(8Fdd4y7g$(ELrOm0Y)jH|rd0_51wE7mn=_)czR&XOkgxKE@fQ9 zSi-oIaUWw9V=bfC9O5t%bn2{9!J#c+eU`FwI`5jWt%eNq|_I?}0s2pyuXLyrh0bmiie3}K)X?=Cpc zF^2veqTq)soBVUoff4BE;UW_eF(5g4Kt9JFXP?6K*F?Z*=q4XV$Qca7v$BTM33Adz zi}n}p(I#hu6$6?A8H-~CNFclaL zcV^&N@f=o^NTkC|(Da=J%2}yDS7;?Y(jR(ikv}r-V6(rpt}c!ApZcKENdHCl3x*7b z)4dE2J?&(Hkl~X31i9WX^~i8ipOJbcYIvzPp>m|041axoAVNtdijnRk@HYTyN?%RL zcZm;i=&!$`5i%sFad1ddN*i#B)NuHog#>=!fU$^iI?~ez zsU5}gv&9aDVC0818ORqOWsDey5l7m`pq#pz+5lt0EZvL!YXfXcIvp;VSQ}9BQm$9% zleGcumR-$^`?xk>{lUWn&;3#x@Yv)Il}+xx5K!&&)_X4oT?lymvAK_yS}p|Sew}l6 z@@p3Y-rkbt`{a=e0pG1iT>41MKLY#{bF*jr{}J%hoRg-|j6VWS{QSV5FR%L}pmnoT zZ!9_VM?j}feeb;4@?yZP&dDEoJbE$U>$ipveRIaefGe+@_WSY8ivd0SI)uOR^TmL^ z4`1niXXi@+KFf>=9+8&NQX0v_r+&J`_~igw{5gB>16Km}qy|km8-FF>$tGv59bdf?kQjMj$i)9M0#Ebbe0dQ)A%kXfBxc<(}8!0E5PDH%HSYCu%v&#x?;do`e__O*pi z@4OmdIz9FAls4A_ruNo-*lhf@fG=<4kIz_lE#Te5lU{hmel6gyPGd{g5Be)$)U?0; zm^uHifJ5bDitgX{SHRkFOMZIk-s=Hl4#qxwA@zDddeQk~noq9>%vsiIv`?!W0Z(rD z>zG&EjesQse{A;aTQ>sYUwVAd^Ve?#Tn;Gw?cu1K0Y4ONSpWWpn*k3^GXCE6+RXrc zX!hipQMUrBiq@^JnDU?al>fkL z%73CM|A7UR|G)&we?rQCU@hf8u$b~6s8Id`N+|zfj= z%737S@}FqRf1sZ7pJ>W|phEc%&{F;bt1171#gzX^DF1;4&iq%Dt3MwrSI%eZ z`s$9p+HaFV_r(+Ki-uzU+~WJy{T(i*>+Tuu>A7;qHoMQ&t&S>*8IzMaapV` z^!bv-kI#?M<@Qp1+7wOJy>oDK-|VDho%U4nwNEv{x|qk-_I>lr6kV^JjX%zRE?Ub>@bMBO75O}_8FECuQH(+@4j2kIiVv6;X3P1HTvZ27uvrG0e0M%?qt+HE&u=~Ukffx4ni?QUHDZM-i1uFogE`EjD|)%pMav)?+bSBw}x z^p77#=|GjusYtDjr{ex~mER(%g?j;HHF@9%P@L%U>M>&;{C z3cHf7Yn!mR-|FupbrVK@{pSzI#^}N?t*yG%f12*)$NTSlqF1PHL%{Emo404`?s#Q? z!SZ7%x_NijENojdOlQiYr}+PG)D+O*XdP;{ zT&MciMEPfbt{N8N+#k zUHz};o?r9Ai!ZHxdEG0;udaV>!|QLnx$&*H-`Vu;d+(Qg@Zm?BKmO#?(k)v*+xGbv zUzU|`-?8(nUArsx?EQM*H~SA%9z1mT$hY4et@{3lACLX?^YQ8vCx1D0`q$s=HD}JA z`}gnXYcKq9@zS4{uhd<=_Sf|rH*YCTnl@|RqGcA#7Q#!8@K=8BK;M&){j~_wf*yM!0z@|@PD8MY_h=d*W@1>wFM(w*u?qQw8=mF zQ{B79=by#b)dk&qG|>KcXhQn64x5g6HP%y+Tu->Bg|s%^8YNhPAN~tc`xsp zG{Ig2Uv(ao)^dE5P{()_Ukn2stW4r31kEb=VAMaxLDNc12wX@bXRAj!#-FsliC$}2Z)Yg`)n~g9_etOjq$w?M#E#- z-Yo2+9QJ16KFHxeeZA5Llqyd%7DTK5)A|sFM-8tPJO6zU8a4h_e9guOvm|Qxt(X-d zdo?|1g~4VTsV0-!+Cedp8(Kj;5KQ%lvMSe|i%qOH_{(|Di(`S&LE$B%? z3(axStP-s+P`WwGO_m6Egd<)g=YvwD#v@Opi<6!$+&gI_R()LMGekH?IpQT(%SJl# zElq?w%n|M^5zh!mJZXi=wOq*cp$JDhW{B{Pag_565$`d|C{8!4Sj`&a@IP0i!+6M3 zYC6-wCj51lpF|OFXSmFq-s*f!s))DKo>q@2KU90U(&?l#-1KFM{CC=CiSp#6t#10V zg!>4G{v;94Q7BQ;qzZk`e5Cm#D)FjDT9=~|8_g+4YiU%%BDjRjKzyi#1aZz}i~8%# z*DR4wk&bkx*+J6&82eA_UDV#F^+nE)Im1WuqU2i~%ggp8$dNCyeQ>&$?Ss=kTg2bB zeW3afFru>T-~YZ7AkgB(E1&P zBh*p;?thv(v5J&lu{zo|40o8wJ zdr1B}%bWB+*wNle|DEBbJqA>I1Myow|7AGToR#5-aD-E)f0&~jN`Imp_R^mS&RzQE z8Rc)o{!j~`mQd+WjHCQWf1LG6`V-=azpLK*`AT0gc0QS;-m#8$UFsd}LQ^_SaKr~+ z1{W!#mJI2BqQhRg4|cR8YC5aWRdP=`QQy7ViqP|eY=a#6s-~a%9FzWycEnT4$2iK7 zln->|tCSCS2@mO?)RL?dy9=Ut-#0 zgG`SMri)m~`X*=5=WV(*&pP2S| zL#7YydnDt<^j=9S-b{bYv_I43OdFU!!gL(d8<?M(m7bRE;*Gwt!FjQ=jCi@84bWcvSN?ac#Yy59fsJCS9w z$z)%I1VIoCf>?6zSQ}eKY*8(PAl43oP_58KR1r$4H53hsRI80vi9J*a-J-M|q{P}u zY_b2I=bYyxC-Y7|{r>TLxOv^zd7kr}<(_-)S?GKKKqRN*w8XajKM3{HDYcNk5gimEyY-PbU3x;;F>95Kkw*i})(yV!oC|{2S8e z5Z^ES(fvj*BrAEOPba;J^lgY2kbVyFBFe9a;G`Gx7lq^0(fWWRuT0r7ssgUG%G@gmZTH!`xxe?8Kdl70;FEYe31*Kgz3cQo-J;){t}$-Xi1 zNYYOv9z*kv^694C3j;rx9O8d;swv z%D)fsEYg2MJcoFH;(5eZ5)Y^NzQhYizleAY<+nBQBGSJ@Jd)!35iceEK;lNy`xDo1 z=htHp@gU->h({9tht{0Q+<;@QOYJ9vHO5Dy~$ zBk@S$Cx|Cf`XR()NdG$VRm-`*tHk3-f0($L_z%QWiEkyILHtu;PwCYlo<;iA#B+$h zK|GwUM@!;)q@P7Ro%AN+1*HFwcpT|th!>GQjd(oi+Y&D&{aoV7l;2R|`Y(8W3?&{! zd=haB+1DfLjg($1;xVM3O+20AhZBz@{RrZzq_0Ihk@RNbk>o#`crxkN6Hg=l z7V%v2*MRsc(vKycMf^?TImD|G&m(??cmeSY;zh(a5-%mbhq!(xug~qogNSz{9!cCn zoUhB`Cq20EdG2tSugZKx+53H5p9E`yvVIhMrw~K9ek}V<_;NlDRvo!;{dib?mH7nr z4kLze{RCKnll8dPA@et3^+D#7?ew@xD(i8TQ|4loTckHrDle{f^3}kR(mEgy;eRK9 zUU=Z^_an;uk6@o0!M|MidNF<;L~xwvJb^>g9-G$YIE8S~Nvyoz?q z_id73Etd;lCqsWSFMltS>+!Fw$4~iG3>vUbV!xLPl#hwqijyu6)r`&nh} zkgvC3>l60;I*E46^&_DcWIcXnrXsHxA3rrC>-oF27{dLPUvJLGNcqR~lgru-*H45` zeaQYMm0drs$K427Z;|Q~{qc8$(L&gZ`+{>^6_?{rD{I$WKV9;N>+GW>j{8Mu#f9%f zjV-HBzHf+sg&z0maMwq0TtCITN#^D4hp)Gmw`b1ruWUb|tUYr5MD{K-TJU|4^8E3A zn)3US?^~9?x6JpSWIfNHs9(OWjeoh|+v0e=#Qnhc*@l<3U%n5Bf4T5|Q2Z-6)@OP7 z_`V1J<-*?+9>?C<#t^=LHm0n;_1gET=+gU{^i2=`O5Rd_i@VaAI{6m!#VyH@o|?Acee${>w%w46rArL2oJcP zkIy9G0Xgo|$a>_m9&1$ONbDz+bKFPAPvwd9#QlS<9QPc#hVO6u@AHs{PlfhgnLQ7e zpPzg`Po$3fF}RB@hjmFq_im&?od^{1EJPkjHqJU@KD0Q(c(!<2L0 zVg(oX8|TSo`QaQtvB-t@b#gK873#jD&|>cvKRBBWa46-P0Y)}DZZFT)h3=s_H~G-6R%4=gLnk-RmAHN&m>-- zcouOnugWIgkn}mk8xhYX-k5kE@hIZ?#G4Q=Al{6)m3V97Ma0_>w-Fcf;8NmkNiWt( zRpNS@M~Zbiu?}b=y;zs)NLF*A)}7Lbzef6W;-de}AU=omtBC8U1IQ%qKs=jxHR8D+ z^8Ue*xcEGk6Y+e~I}^7OcOh;gt|zW6W@o?hd#Eryj6E_jBLp+{%UE*fq5yUOT>k&^QUY~dd@dm^*i8myk zO}r8DT;h$1=M#@2ZYAD?cq#E_#Py4K`CAYVA|6dVl6WiPF~nOFk0aiOcp~u_;>pC@ z5>F-Gj(9rp_QY2aSBYm4*NEp3HxbVx-jR3#@y^7Hh<72bEav6yO58xa8}V@BuMjs9 z?@ruAya(}k;ysC*iT5IIA^s}yG~#`TXAqAko=H4`csB8Y#B+%cBA!qDHR4v{qlnvx zk0-7y;pLw|+(3LT@o?fg8h{vyI}#V4|Aa5jVqzk_EAe>ZZp6*RJw$xs2I6VNeTiof z_amN3Jb-vM@ety<#A^~SARa}$hr#u0ZUo=Dt< zcrtNU;;F>lh^G_xAij!t2=Of9?TP0SA5T1=IK0Ts#7f+exQ)0Aab+nluPbo_aW~@O z#65@`iH8t35pPdCp16(%cxK{`#4W^Kh^G;EC7watjd&(;58~OxLx|@RZ%@2{xQ+&l zMZ{f+mlAg)u3yH>??F6>cnI-G;_Zo>i0eXm{l*h_C2l6}M%+R?gm@b9_QY2a*M)O` zS;Sq5=MZ-zo+siHFA(t~c>E#}pLnT=Ph9^oFK>I|LBw^DJbol`SK=|m-H68t`zUUo zDC~(R3wz?J!rsX3(}g|pRl=TlmavcJ_Bq0yc%HB)ULfpaxP6h(6E79|4qUHa&dcvc zJczi?#PyLvPdrBOE?gfccpT@6g7@M)S@3wyQ;9py<~*Hv2=P_K#fq$0Q5P$MeEx~= z!}VhhaJ?J_*Tp&VktVKNqu_ckM{Xxp3d9N`uK%Hk6+E#rCsyEa{S5`z%}~V3l2{)R zD@9^ONUZFL6#%hPC{|?fa|S44#Z{~6lEgSFRnA9;CdknuB)KnIt7YY zffp;$xX#MMxnEpYLBaJ&6nwuOMeNv!6+&FEMd9m~sK@mhyuSE;db#lZqJCxXUGn{x zPG#>eD~0a;`I>`aWRsyM#yjz-rki(Cy5+Bp+TekF_=9~r4sL$^NO8lFHJLtX@AGJ< zqvz+3UiR3({RC>_h6@>^mPd6O@w={Toz;Q$8}!)#wkC%aE{7Hjj0pYw$+0mL^QK;! zxbxN&9XdI5CaJ-uk*9(-|6A{^b3a-B{d;_vdUM?{zTiBW(s#(C@?-6E`Q(`pV~ zU#nMoe)7N`hmZUL3mS$cO|$f!_iUdXQhTxK%!l{f&m4WPf%~o5N0!&y+1&>d4f*qr z{u@po96tEcjvcR`@aW?7U`)XNa|ye@ecEu*67%v#n7&fmukFaYv}O9lzaayP4OR` z>$$b&?Fkne8GgP7-VE>88Zx}kq_K_O3JSdv@7Or{&t`WU#E<-R^2x0MH+n3NY^o1@ zb5i$^N$l5JOfBl0b~?sSsrC5RbITik|I?7spEPa1>Ehc@Mt#xmuNiALg=hDBeDL^= zddqwEzUrvVZF1!4{rox!@sVEN-YfAP!KI-w%aq^zzWQL_j4iW< zzxdW?+;DgJ(Prc6gWNsGz8 zed7+C+4N7>ggLkhV)#CF`6Gwilo}r?Z`iV@9lyBEZ{LM0e^2om)vIUZi~#GyiHDbV z?tAv+iUtFAT=}iRwXC&Uzl_CtH1){8eczT|ch0eiZi#O?9_)PNjV7gWdhffTgEOB* z+V20PZD|^uIr+E!^Sg|FTQ}*kVco!xnbS5eQIyMj_H~$+KJViI?WghWzFzRx{Pp^7 zU3({cY`yq=>BkX&``%7AHt6#8r*}Kf{pQFihs5H($rm=&oBsBq$*)2SN_u+j-PcOI zb`DzZy*Eu6y|-cb+4IMKe|w^~CA9aqKmBD{_eX5UfNx(tl|OlvZ{hD5?M!{HXgeOi zIiq*|YrEaBl^L23*x`CU(PQh6^@k6f|8D5GL-*%Tn_ko<>g+3-9oIYQPpZz}WftX~ zy*?oK$>lv=bpK|*6CN?O-js85ALkVAa`JaEjc7ls&l{W1wCs4L&%}vdwM$wK{AZx= zp?WKSzZLo3txtZQ(Y|}FT}{GX36I(N$+=9S8)Nq@=-?AEx$D~o z_{N#g20a2N4cay0_VxvJ{{8dmrf&-Wy&PEb!|0Z2>0h@|qjC-|{p*WhebW73ULE(c zRrPTL$N25LXgbxtQEKv<7UM4*+x=kw*d$yAD!e}|?dk4w1MXyn_gGUpXyp#K7rS(C zZH?+NcE!P34MUHf*na-kg6St(pYs^-$Hy7#POQ%Qv1h%Y={8T-^sGlIhOlkqbP45`z$<=Sa3vwAMQ@k)~!k0-6ZZgLMeTDr``U>jEA zJ>f{bP75EOT({JH>h9Suo!)QKIeYB1#!aH$8?@E%Z&H~ zSBJBSFT2(8pFJpR@U-jo`;D0qIP%+Tw}!brzdE*UQOj1DPFeH!HGkOIE3Ed#&aV}G z@}S0!O~G2SBUE70i?^Wx`?X0u_jjjrhyJRg`Vabh_lLv&c`#$)sq3E&NoZCrw$JrW zZs1oj{CPjYwd)&~JAJ*YY4lg0z4_Ts+N4>LUq700sAqoO`7zegtX*T;pWOM?z`P0W z>(;GM4#f?L{qR7K`>ih|^e(zM`B?4H$F6g`_83>N{rB0uF6-BBSu;&Z?@$ z;gW8%SB*$n;#E8N;;wH#Yr4lTe*2;wZEtpp{$%C0zyH>~`1#)XG>4g)xR$3|vo^kX z=cN--J7Z(o^gcc{f6T<2&RJ{vmX=gIy6JL4X1ltE-?vSDzsq+Qe9l%2nr~Ut?ovWg z!k&L#eH!S}Y-{fWmw(^k*5}TMkKVey?@Vpe=wFm~{Wo5lcJ*{g!)EWz#q1Xb&PaOt z;OEJ)(=%^0^Lu-Aulp^V7U$es?CIq@c6qOlwu_4v05P7CvLbWT@h-&vV(boh}G+YA1f|JTiyIm44}%YRsX+IQTqhZZ$q4aVSG z)OyzO^$i2=yJ_9;o!z=+#%Fa8Y@Rn{)9GeY46WvLS$81E_i)y$Eqa~Y*>e5G7BMjc|r~8=gHT#7%cT_p(!d`>8$`wWb?ByRvT2@GF-_Hrnr4fBBkU zEyF*lclGeTY3_ctqiTkk$NA=LYJYyg)VGVxfB$~!c;mmvI=7jh6LH7+;D@0d z2DX`THRiJ)WBaT>KR0Uqqs=KN9v@kGJ#<`5;jk~(F1+XR{ zn`FeDo%oJpVZ^62=EjnOIKZW>2IC+{S4HROspy=16rFRB;^16Mad4@pIOv-w)%2~D zYObnM%`HxGbW2bi-QQ3gJ;o|d9@7*j&v}Yd^$f+yYlGtKwM%g}98jFS&nhn7R>j4q zL~-$T(&>GJbb9|LI()=Ngo*a|_DUxdrdjxrO|!bE|Pz=U&6r!9BE| zgL_TvN0Q(uf+v>&7Wp$j&?%-)UP{_0tKd2Mz)3l^x;;*Xn%Bi|j702b0@!;kC>J*bRnW` z-1mzSGv9SvifG-tcNt=QpJB@pm3}UtAm$(0xf0Q~IpI^p@W&5UBU+BET#K0L9J3xV z``B+A7}tH5i5Px){zk-HhXI=yj;Z|_Vutq}hH1K-&B(1W^R^%w_VwI~XnNO={ccI_ zs!I&>pL~{u;knz#Z9~l8X55Yl`CzE5{%!~Ij79H!foS-(<4(lP$&R}aElI~2X78HM zeg`EtGJ;)yTmAPKW}Lsu&=}SEOSCsdZ(?Y^rR-t;5{5CfCjY=N-dN)+47X;bGBp1D zE5pp)ExyL^e02%K@VU1b8fUz+7sJi9KVxW0d%R+CZ8}3^&{>A2YYp~cc*evuhMBtx7()GghvAvS(ivLv|7Mu|to8R8o?p0# zp>aVWL(|Q6`!U?2U&_!>c#UD^+Z}$u@U&l-GE{C~W0-lU{Q(Tm9+<%}b4MY=+}xOh z%>I*)7#f>c8D<_1&Sn1lbY^J&VFJT6k53pXu?HC%`V=v=b@D!h_L)KL7^dZqV3;v( zAw$FUuNWG;UE)05@i5w3zldU(|8;+cwhglxrcK(+FgyG-!;Ek4F@)=Q1mlG-?!+;F zEW@;i84S(39EMigUkr`MoQ|?`yc5MRKeQj`nKL=MW-?R~k25rWbeo}RtIsivXWSaY zF#e;V3^NknV`y^U&d{>?Eawpq80LQ%avbBu7ibLgJw`E1i~Nvdl!F!#YohStOL87eb( zFogEUFf+4+p~WYF^~c#0+cHes^E&UJFVA5Z|9BHa%hO{Fv#%F1wEf_I3e!t_rzt~o z!@dkN4@_lfQ9og5%gSLG{^AdYM)f(zv0*=AeAAqc3@vFR8QLbi&oH~o=bXEoWSINS zO@_w49_;su;(u?#v3nnerq3-5jm1kjZ}1hvwC=w!G$cM?sPqf?3DY&VYs0a6B17eD zDnrZcPZ?$ge8(_<-5(5X-cK1Cr`9-w@!>vV82@|-Lv#Jv46Pm3ay0E{nAYMF!+h^& zJp8X3?Dv)OKW)!2v(pfUX%}WOvIrU&@O&!e8b~TxyrCTb)w9NSo4JDs2G`8Q$(Dv3|hVfq?WoRz^nd?2SGR$pU z!qCuJcaB}R1OvyxVGNClO&KbEVj1Sg_F|YBF@&L|+Bk;sf21-rZJW=~Z25#?X0t5} zp?_eQ`^jO3+3Golw!i*nXqj=Bp;`Z&Vdhfz^O&D_-w=kDMUe~*N*jj8@m(3_pXtX? zX*`1SITnVdpWb0;_Fcp$`VYv2!p{0ul z8-HbY3Snq%8_Cens5Qe1<1@%NlO^GM>g;#h6Z?y2)0ShszKk7o{+%Mv6=!0{P8`v` z%e|jt2dS;M+(Km3uiu+NQHe`BYA z3(^&J=gh`ieI51c(Vy?;2Cj5c9lHOrb4HJyvDJ-jY})kd>XC=eulzpZa;)F}-eIS8 z&g#K`9`?1~yBT}yUPvwXS+42{hg{2o&vIk?o`5$rni|yVlYY9Z4DnZY@2zHO_`%l8=z^EVn?Ut+1LUf(x)#`?d*RI{_&=LZ|;Ri2Lkb;!_hhKFsO)t)0}7yFL$ zQQM73JF`c1RsUMyL#9$a-Q|(yto%`DP0czv@TZiiOFJmW+IsQ}ZHx1RO z9Y^;^IW$(gjQaEK{J_Vt>)TWtWH$M$<{Gn>FFfa=zO!w1gHbyJ)osHz9P6F#t^EJ2Z7|rnbA>`06pgKy`JWsn0+EzP|eId)B>6?mv%R;okeinr3xXUyqq_ zMN=QgPD(tk-+#K6x~fOQ;~W09)tu(d2b%($sjXs?>McB5LruH0ux8e>J)^p@=;x{I({7I-bj5hYU_@Hy~EUzeOm`-c+^%~HyHdP)vGl2RA^qk^aO)C zE@k4|{Z?3GdHn>b9X{@QJ1g5+-FERojndZ)s{gM8>OZ*>s2(ibb@29JPxUh``HyA` zYpQM9w0r(%PK4^{vupS}^L*6}UN^eG^-+{sbMQ)k+s%e*>$jRu+PXbh9pF60b>Nhy zYX2{0J!=_SUrpFF{A}aV4OL@}Y?It&3$336pd2OVo`i<;+q57Jpsz<94!5MWMs&j{?#-zX5LfyS}N3U^1+N+_{ z7hf7z#}<1hq+Rphdvs6(7fqdAl;p1ljsCFs_L7$B=;<>atX~$Z=439iwU2A7)=%7i zxB8#$)$iIk4F2rj`2LzDE60`m|O1e~`YSL9~l%>v`2( zdCh~aV*|DHqdQ;MQ|hUi=S$8kJO|~Q=H}5fvbK8a^T93eSv=KxrYzrg<}_AoEvS8D zlCh;4KW!mCKGmd}zkk#!TUAq*zh5VBdOP*%2Y)3TuO6%JPW-@ndUG>%y<6`2P4Bf= z&kZ?TlD#Ed{q*6GI_BSE)i$;@?|XfzS19;i<_yg0~Zf|(66l;cXVLsn}=Gf_lK8w)%h_(-PAAk z*YL}&)PW@nhR;c8r+TgZ<>j-1G3p<`N6u^NVN|VucUhkATO7M}@XhKY4fRy--&=U4 zHm$FoEj5H(Q18UP|5ML*dW@>8*4~-cJ#~nanl$OlUz#+lt$I9Ydtv9%HtMsq$s^ti zj8unrzkFgu-R}TWrHC!`;K))zsblU5>5{DUIF!?T?`oB31Qcw>sV3M@FizM{PRf z@BT8jn``LxuKio7?@x3tHC}74ww-Xn_V=gt)VbM9zI^{Q{JvdQEoI^>(Q4Sw0qfJX zHtPIFGd&H1TB;9q!*|U**IvEy@W?>JXCCTP{n`NS1%x|65dtMNbo(8WoKQ7?}(*FU_pvHEx8Z|eU&tC4zg(!9Jr(}Pr7 zve!SceZthMD`rkRWquUWZ_RYV?1wU-rMjijIde87}Gu79S^xdTNwra>n zyYrL#J&m2*a8Zr1AGLyfOsq3%`HR?gO9`Ypw@IBwN`tW_3v$U(bU@g zmlqz4?x4CGJ65-S8KaJ@@!NZyI%{g{l(s`%N48V{3f?#HgHF-v)(d-d%TBdcLqBfR zZeC0S)wnFMdb)Q9^+m$OMVDfmtARJ_Eco>+;ro(z)^i+?wa&A<- zr8qXaLsYu0Q#WEzi^)%Ee!hd1b@4mtZ!t4hb@qtZw;QUy+xI_y{mXFm&*^7Jh7W13#x>Y}@7lW! z)#W!{-cRbKsa~%Y&HnB{H#KMLtIx--ZLjXwJnY>q;~J~y?s&~Sa=No>?PEIHE4QJ# zu3*}%o>NV#Pk{BPW0xB0^0+gHM;$Y%Kef8h(eFe{_0{&{2Q1q>CARaWj@4YBgsb;2 zTy?c9X{vVp&~f3z8a>s4+n)TLa934-7*(jaj_*qSLvPi5rOgMMCdH|?O&-O&M|D$E zZpZC@?%hm1ac=VmH4gMrM@`RqF(kX5TC+!p+u<`E)eUP*Zo_`+s9NId=M8M#RW;X% zY*p}18}h?pC&xDg*RR6kHKMszHRXfca=3Dzj9rf*$KYFXH8>o#x?>Kft>9g48`eKLA zyVq7PPMbTs=gwDEx9cNc7{|V!>ax({d5x2ssIxa;OfPn6r#_r=s7dr= zlUmjKOt>`+{=L*}F3)sxa$jmbPjuTuH@?)uOXr4_&V8xvy_orhVdP6~a;F~aM|A=2 zR=3N;dM`D7*lgP&mzSEu;;yA9ZoJTPZ|lBtIsHPrrTcDH+O8Mcm~U-6nlF8!6~?dJ z5|Z*lOZi84vfZE;+SHIsGnck|q19pnXw||07uts(lwSSqpXb`Cnwgh$r=DvU=kA+s z-t}Dja89kdCCi>`(NQ`5znSq|+cRZa+83`s*J}RK5&l2dLWVs1EULkCEhTr-lD!_! zwc`i7ygsSqndZKx+Jb=v&$R15>OPrx;F-4c@=&L*Hb2ukefadX`U{_Fp(iH8|7Y3< z-967OPkg4?N{{H4Xb_&+wC&#d&opc9+-fe>pJ@vheQ@{P2T!#}&dV1x{`0B!mYP25 z`O&9Z{&$D`9)IyvtNSvjajg|kwS_JJh@J5EQ_bn_fvZ4ZlCu95xoddhYOJ?GM9%n-RMnYkYm|vGy`| zv1haQA8S)`JW2~KkF{MhuDXB!`eV&{3%NN+P#E<)WK41`@QjA`{4V_*DlaK%>A@f z>yf>~_Rj~U+P-DE`x~T`YC#_ihySITpL6PArBA8$=Yc)5R(2@WGB?lD^=JfoCZ(El zkU34~T&kJo=$<>>f27sy^IG3}@O|m`o!;&^EdP-kX41YLDym9d~>9 zL+!I3?ceW{@K8&t?LIiK(?jjA+z)dGwtT3WM(Acdsryh{zN>liSAGvQ=YT}>T&IWH zvnCCrlO8_MuKVZb41w>N-*V;lkue1iv_XcC8>gRqpe=p!%JKc*JmF!#66YGvFMgnzof35e(;jH;#>aQKGx>pbC1Lh=D@Q({-zj{cy_om?wR*2S z&~AC%k8^GNK89 zTmQMQ^@_T5pmV`}ZPM;~^K(w!*Df#F`ltHCeQn6Wgv{S|-`9HRrth4y>Ap55f6vvn zEADG)ak@HA>G!p_{C2%^dDeYxw0Us!nThwc)n^}^_|be{J2m~pl?(muYfmqX7**Qs zzSjHh4r7CM_qF+9zt$VwgVRUfW2?Frh9r%bJ@M6(~`UQ zG>2`4`=hSh(~eKuzVyPc_q6Lf-rBt4I=5c|qvrO0da^|G zZu8pW#|KI@Q)Asu$FEB?r$hIag>Ea+*83DT>VSP8}FsqBZi#tfOmGqNP5qJ@?zN67AZ6xU`x6CEA7DF&?kDmuNoWI{06rS;7vz z?f9rz>yITHrjXSktw57QZN|So3T!ZCI@##oEbVpMSQmZ?V??C%5Xu;)=D1 zSE3hH*NQdoyjJkPSox-H2Hzi89it#383%XypD{*V2ACZDuv zlRGZ_;PYJgU6Xb7ZeRP>rtQ7mbV{?`HtlmmvfJFPHqHF*?yVQs*|h$yy0+R1n|5W? zw6Au2WYgX=bkf&;5BSZTh8y0pX~!SE;#PmEO?&DybM4-7HtpHA;`6;n*t8F(P073q zznkG0{rjVpeQnyYq=3`iyW2E_V@LQ8cCXC)_IQj<3mF==cd5~)-Do)DSyH4;(>prM zHHF)>HnaM+jtByKCN?b%zKGgUZ^LyA5P^zP$LVAChD>I(lft%Q-f&WIOT+|7uM)Cw zd%Lw{R{%(_@RixIB&0v+H)g1l5>8?G&J+5>a0`SB!99&s;Qv>;Uw|HC6iEKi5BkIS zk;BUU;kK;_xV=BL`v}4@-ey3w%df-^_gSLN<^J%Ug*f2hfG8M0$JZ$hF=e|$1m{kUDx-#q+lLPtBhY&*NzRoG$rLb9&>!ammG2?1-Na8dqFN)+y>f-Gl$ z|NsA!xty2B-g8bhM^@fkLVLY}m4%Yw%Ix%n*#VrVI`a73$XI5M+`8UL3HrxTu@&N# zs9ey!5p0B*q;m{IA40^wnh65XuPh>)ENp|5k^%Z;I~&;^+e((C&xLdQw1qF>TTUPS zS0>E%TDi_3ouhp|_c~T{P2Atccjdtiu_?FX0 z|FQ@h46{HSE9i6VY-D>(zf{s2u2-Hu`Vzk7^wGa8!Un@~vHajK29BzPm0!|lRFOXV z629g1(SK!vw)v9IDxIUfVPoajGsn(Oq=|9N5XV^LsOaISO0Ya}lHLsG_Gx2W^d)@D zeo1eJ z^UBg!z?bkXr;q++5jGf>3vseRpKfPkZ=WaW3#4=5L)gpdqF-6$bXP&TkvBn)M-_tQ zHc9$KIJZw5qoOb2TTY+(mwXEw3@U;+S>P{C@-LaPQ?$>O^!d^`8lVp$a=PeO7CBuD z#0kIUsFd2-$oBY*j{zGYiEv(3+0h1lVqKxg`M`8!k@FFU5 zUNAoT#xkJD`N8yLk@FMu8H~klLq7>eRf1)Vm-NYSZhuWMF8UI_<@C|NEW!rE;vr5B z=rinWWP40MU(y%Bd1dVpeF@)k`siO4VS`~=SpGXuemJTUR(?sJ4Cj@lkG_O&Ieqjm zi?G44R4hN}Gwf_+d%ULklHLaARpmkWtgKyPInI3g`b< zKG0`n`M`8!k@Hasaq>W)X=fwbV?M01{@?#QALz5Pd|*1V$oUB0?4-nl-$*#B60}d2 z^r_N0#z7xKy^d)@D>7##HgbjuzLY%k~C_fxk3AR78q)&tMs`7w7&}U`s57UuF&PN8s$p?Lw zosDdd`6!a~`g{L(KG0`n`M`8!k@JxUaT39=5ss<^^I?(n8E{@zn?N7vv$A|(IeS59o93Z0zkzCB6QBMSti+h}<5~uPk!97KoDwevEd$WP2=&Mbf9kd8PdT_!7S5 z^wGa8!Un@~Ax;74v+ZnTd#rz(q&GZ(aW(MD@*sRxR{xleEOI{dpTqnQ{Kmjhm7vd5 zNuL4dmE{3_3Ey%(pnq9}4ThN@jurGdb~ds-re7-Q4G$|%AAJema{B0B7GZ;7X;^;n z7XwFC!pbk{Gpa}*eF@)k`siO4VS{10Sbosw*xAVTto)MR@Tl_gqc7oGP9OctB5YV# z7L*_S#lTUOu<}d#j4IMsz?bkXr;q++5jGeW197aN&#|+S?OFLHy`i-7@}n=|TTUPS z%OY$rEE&rW{$k*$N?7?NeMS}Oqc7oGP9OctB5W`$8_N&+96KA?o|RwH8y;6)e)J`L z%ju(kS%eJ>+Xm$ae=%@WC9M3CKBJ2C74Ri|%ju(kS%eLS#X}q`=yU9BWP4VANpE;k zdHK+S4>Z}ex8bZOE#+7wjbFVW6UlmX)y zcEI=#^jUT`s1t(qQzYx3!#G9eWQe|mZ@GTZzbwKA!^{vT9{feZQI%l&$&x+|&h5*N zanYCXEvJwED--maE9naG{Kfy;W>w)gONxvBi@;8ZoPJ~_KG6>IYLa#GIqA_3CHxB~ zB^C7Xb~aqg|Kj*8L(*r%c~xb?80Zu007cF(rX!1}Qw&RnILb@#YiA?dV?KhwMo0|W zS5dcUgFY+E2c{#7oR2JslMZ^bosDddJ~JhK4xC#hE^N`4@GaK^`j^FuWhasC^h$ZS z&?BPHa7kyMwqa*^JlS8O6vy75Mba6ibCI5~$Gl>`((G*P?Xb;a`^@?eJIpKQEB`<2 z;=nFk=cJTYVkh#3*ChsQgv7(SeOXY4zAC#e=wB9LgJEe9ClmCkb~ds-rVpQ$E(^+s z^HPZm1^N=cxZ#kdnUlw75VaX832KqcZ8`&Py*H9f}IfA z&Qgg_v_qfilFmMDktW)rZ}hWDvd3@~*)AXKiohnf5<70q_hA*s^1KGYd1d1U^d)@D z1+V;M?c|&muUg5-d-gq&LHPy2M31^d)@Dp+9FM~k3-*jxX&ef;YT1F|A38<7&te>kt2l(9U}UytbJlS zvZRBZ$ctRAbUQl{2YqHrx~lS!TSa|YrMSW;BIcn~(%F|w(F|SJGSIT<-?s94Sn;N1v5lCrn3{G_VtS zsgPgrU74`rmGGYF+|HCdG%kBlwze?=TFZ#sN1%Zu_I5_`*y|*zArXgnD za{XeuvdHBW`LfvApuJqq4Dg)`HmfSJ6TYzx6iE6~I1e{eKE}d0=(DnRjOoad4|XCi za=GHbcV&V;&62LFJP4oY!?4#$$%HtmQapR#ShqQn-U{dcRYu{vvik$mlSR%Cj#+Sg zqW7+7gZ8qW8Suh(k<-t|>ks~na8xDO_AHV<1J0|=1K6TZ%ri=bdXRje zPR>U>)pnWIU>-%z{KYpP9td zfqg7!G)>1Q4Nn;!(F()hGZ1Xd)zoMlIeHAt`+(zDt~KqP&_5!vb4Rqvhp?dXu+A7( z1YvRIVFNJC=vW~x`u{5$Pg!N}>~=#OdQXF@s{g-rze5@-Az41OMl$BURXYgW<-xExAe5VR@4rc+WzMs)AU(#@|B z_8LpKKo0BA?W_>S%8POPb2}S^<-Y>{QhEMz&9MFlUm(bNL@MUbINnL=rGv0h+-CL! z{<$P-H!aX+Glcm8Qdmn2%YiVdeMMuK#RB&c6oBmbPXeVup8`LQ)RentpK~!m17jSj zBm7$@rEn^=`4Ln37mgcUl}k|arWT5j=Bn6SfsYwIHfd@E|1#|iS2jj!nlgdKag=xj z3iT^>|mz7*m8Uv#J z2;#GdKO*i$`FfpdC55=RmxJOw#ewBN2J&Kno(26(Vm*watS9d6=Lq?BLtB<_Gvzy% z>Y+R3dpMPY`Q5|)rh{z;)k7+4S#UoCVmjA|zaSnQ>a2K9akaTvo${+$9L!yQfHn=~ zuN~&BgdO!(eEJ&{r|9ZRS_4H1g^nmS#7U_Q`U>31L2*iPR;=))<`3WqkK{HLIN6xs z%Xa(0A#7wG?5R^6NAPx#P31L!E#^D8ucu;4i4KlQY8h;dZV?=&iwbtL>8;NBj=2u; zuoeUPE`T@*C%L^1`goLQfEeH7I>+RL_#}e13-=U;*9c=&=?w@?Ss4I`;okzH<$WkD za)&ycXTlAFd~$uhmb?HE`9H*;6Ax~T?avq5pATF|Z`S@WkBYM+`)yi`W2L-do(!Sf z&wM~8P>+}&KR~qg#=4ou>n0L>V3;TiVkSJpFl;9v%3eT>{}b_PrCiV3m0od9;O#0N zd@*T6F_x{ljnXRD*7TD$`^q}q7h?|Ud#=(CF9$P0zG zp@(}I?oH&rA#mL=3~L+0WIMS{XNr7699B+1lw-toZjOpuw5#Hl;B2Yt-p`|Y!{0|<;oC3u9v{Lv}Kx`j<{kYv|K=k@4aa}FFQY+m-@lUO$xFR!R-DozfLwPe?0Yz_WB?fejPId zcz%8aL~*41N9X0NcqQo-ul_EIR||IwyDrhrN?LzK*$Rib7SBTkj@J%s3O#GpZH`t43-1?_Ay4Pic{*v7 z9}|3+FSertfGD^6a30*qNeR}ug+u!_V!wj@p$T%z+H9eBcp8MAgCm{g1^U4X99o3E z4QuO$@HGjF@)VAv6i?>fHJp_iNq$OTw6Ee`!k<$aRF5XgZ!f~!PCTEkoq4`J0kIx? z5FZMNQ)!gt{iHZu3F`2u-cNFCj9Ql+7nd_=KDAmjk@wJ=lmFD;1x)s8BF~t$?y=qEknxgzU z7oKA*o-?#Bm&byXsxYv}@Y@Qv6u*8hS>-u^Anm+aAF?%>%DBVeq@vw$dV z-{73b4~O_6{}X=|#6Jb`F<+m2TmOp+n=U!8}J{Az|hXbO#3yA3lw{lS;qC<4Px&R&Aqh)2xg*()Ne6VY~#bnb)tupQnv> znNjG}#XB7s4wS`7yEc%Bl`(%>Z;UCI;pD}ou{j*JFJ5~!{QEY z0rRO;R}^m_o#G1hg?(L42=70hQF};U#;>;x5XJRlYF~Ar|4Qa>nmj3@fP5*UO;xSU-Saw;{{~C?o>DbUy}& zNdy26p|FoO@U)%+qIhL;j&V?$1ESBifS5*a3Qq<^i(oeg#jOSJvoZfVf4$f~ zxhnq94*e70i)q549q!@n5Xa()V29lxmNAX|eMIQDk%zwmh%y-v(|?cnPk};THg8sEP+v(dP-o7He+zG`@OL#A?tw#apHTgHi}57b;doNm zxgCb}XgE%gook4*5)$pDgiHyr`dNI@(S#MRP|b z=?wStAt1^c;_{q12JCV~c(|Jqp5&o~_IHOma#K7K_^1H=Wq{r0Ke#`>4il)@ufybk z4YqI3o4mf28{GalAj%Em!5ypDYnc+NL?zWw>P3er0d>7$HK%-Lj&0uxzE(pV^ml{m zvrFDMwQ!u7|*+jyV4}Oxl&sfsRY=dzsfh{R<~eZ&-*NW3!dMu zl;6IDskeCi#kaY??*Y+&&pVtC2Sk31xa}^tx1V1b!9PmUf7Dwd^qWlN_!~OIHM0rS@_m^I9?^lO=!&C8J=56I+(05AxK^6Uv%{xr5g!T7?cI2*j zCAeE%EqYd-d@9dpaJ{iS$LYF%QNZ)zb%E!j4InEoAeLtoaX!`npU{Tkxn^Pg)h4jP zIU=m11;e*ox#)VcXK%a%g~J?DzAs8!IVux$I_6&&3ikv&|3do%LS92#1lgcx%J<1N zSiFOrp-=IE``KO5!#$7JBfK?lSH@dB|6m<*Lq6`9rVk+Z_zXOQ&^7@bk{6}=>;c0*< zD~QW>tE93e*X8y{0Z}dzm+f=GzA&8InQBvh05N^mE}##CXO+#@>YeYE>uK>YyT|kP z2z^k0H>g)vHV(vkEdpOCUE+BB8GtBj0P$=yh4cHw1MU-d#XX_?J~6=f64UjtyDrHc zxW9FPD20G{c89`we%v5Gyx$gmYz+8A34Mjfe-4P^BJvU8p+vy=EWCepXg8jUA;H7u zX4U6A=kj)9ru+oi<;M`q{S5*{@l$zzY64>Z!vIk%6h4!}y=%KEwNu>T`M}2kIEHae zaI#|Er9)cF>ADBH@%Xg?(O=nhXi@Px=mOl70BG|8P>%sEd~615^?Vq$n)&*TJA2ll z?`$f^8`LHz5>9x*@6Rs*QSJa@%5THy5Yr82>kSp3g$3X%8mv%1jakE56Y+0|UnS1( z<7VtWHiP5fNL;`0f;LlKao*!#VQZ%`u)YgvqQ5lCS4uVR{}UL;p!^1idR-7)V~88n zf{hLGtLI{A-QxK(+r7dwI}-e2oOR@L8(@T<`*{NpWdb0cEue7TkMQSfDD+KoKcZ{l zqqKmvzece37Xjn#a99Tphjrj^m|KM}3$=wN zCnc~ytc$^1AIAl(&x3VD)`sC);yrAuCK+%>>Y0~LYu<%9k_0_5<+Z2 z)_{D!TsAX_*M+z$A@eFe`Q6dpAI7UGFrG_tRQ&r_gJ&14xmuz9NP7u!ZDEbFAC=z; z*EDsCcci-#nN(AW=pPE#rG^6Q2@1QTEqpv-fjC%S9pHXOi37yzp9qNkZ!#ciQUS5& zNC$KRTm$F~xC_t)@DLzOU6o$|T>-BHq7?Pu`3dOB+gBq%JZlSx{<{LAJ%H%{ARzkh4x5nZ{~bU#z_akvo|u38am*?x7fNIT)dw5L8{qj`UGdrj^Fi1T z3QfW>qbrUX*)uSg>H_1TPedV@XFQHZJF)cfy8uv@+~#vVWfD)v?M+_JhJfe;^(bor zQS&8nc^-%9vN3^ZeciL}@sM zbM`!kaR%OZhIWq1?T>hPn?>C2RX{AKH=F;sDb*9)EUspKJle;AJ?f&t|3~Aw-EKe> zHs0wE_Z`eta9&l}9K#Ipdky6Awg95+CSI9+I@pJQ$nD<*M43sP*Dv&k?7oHmI|1sK z%`u^0f<7S_`h;NU6N0DsTjjApHuyv-8p8dyd!74D2V~`z#ybU6UK~TA;25fO3AgK+ z!Q%}B#Iu>i*8nm<^`Jk}1uNb*FRN$1doGSEU5tF5ue9g&cnRteZEN1)ZK)w)cR(S9 zQ@OucDLlO|05Q&uX*}J!Gx&X{0-{APK#VYqz!Z@npcsY~u zHx}w1%l!degO6tM{9OY?aes^R4uBYvOq@MKU``M1u);^;+hlxk6=JERgqWG@i*Qp^OKA+wKWd2!xUCZ{9 zlgaO8@^kbvZdZ3R_tO%P#S4Wo6YLL#!aOx}Sy}(h)^N~&`WCQ*;|2M73Go8A>XcBZ z2Nd3~x>x8|Gbrs}Ar7X2b(EUP)7t}xGIS#^$5=qL;d5LAj2~d`3vJ7PkGHk5J~Rh> zqx9dv6d=Z?W(%2 zkzj}AN}zhWy@%U(`iiIDRm5la3~#?>{Sn0-0dYHg&*NPNM0rF!xVd}1x+y;J?1g76 zjAy;-y6s_mt?_&>Bo%y!HPz3+&+J3o&vihQYlkWSZ2jYZ=XIHshdB@z%OTo%<^dk> zXF!zbgZw(GfM_SLx#y9O-QXkR2-oieM9CvA*S`(y^F_S`IJ2=T?N_kpbx37uv4` zj*>y;&j&>5lgs^%1Vp=|fOtP$qwpsbuJeL@0O;#+jG^;$!2Z@4%+?G8;GXnX4CgD( zZ!@~^_J?U;N_ga`PKpUo$VJE#uJ5Bn{>alG3y2bTnsc;4DFQ@|Jl?}Jf`jor4p@6# z#`ls;V51B7P{QHefJ)cJeVrBGR0nv+0><629;9pTrZfjz`?Y^IuYfsO0L;k@FemeX z=NRsD$?d?<73S3!>3Xnn8`!`YSnLJIfFA3#+P}OEzJOT;-2Mh2O5Pv5{;vU|v=aWx zu5We4eOdYSHIvW5;0t|=_8xwj`~4gcrNI^M*9eGqRXxAb$zKP`W44vs7XqTZB(8&B zLaqs8=bC%iTrb}@*V|$+d(r&3;ygZ^e2xO2ag_dSK$K-7KmV~lQb0b8cIC|ZljrXt zAj-DCcscg~vT|aZg!OS8%X=oU_tbL5d{^nlug4C_XWnfduiqW+Zyz9@9R@^y!A;=3 zoai9MyM(P#m+j9)g0CrHhc@3z{^IWPco~2wb^hi48Uvy&zYhPqz7NhN=xedJ%|_8*gz3Q=TIiZ&Ar6!yHY*( zp?c@`700D{l-6R%`>Ja^-f2LTLgH+F1=gl;9W4m@5n5-l1mn1$=0!H}6G!cz@457V zJ(oDX=i-9vw%*cSGT%okug{9>bE~@ZYyC6i3FXpbo-eN_JYO9FS^fFKK45|~o0sKM zoFfp&T*~ze08y3_uWa3_2;!|JJs*FUk8cb;cs?Rve2D3Z>rqPSH+ahZ#{lA4M?jV@ zPngGV;%f^ry|@n>MB!aE=+3jvYK^{DUdsJssQ`54aUYo0J)DKK9% zz?dEO5e&=t3I_I9e4Yzqbr?(fB+xvU&Fw3W1Jl4a`h7S5#cyBVGd82&dPN=`PGor$5E#4W{X>i_a2D^`%aJ$fE+;2TV<`3&<1h-2E zJEaZ}XYcjEIKy{}hgH0n!{-0+ZfaPH0mdO-um(_F3FBkPcsXC$;OA&<$`{^O@Q#A_ zp7Q%1^Hcyfn0_RcJ1Uafrvsv76X)aoifhNQN0}j#CkeQ91(N;Hz3wb35B1g`m5W8r_%)xa}`Tp05Nz ztmn#}+Zp|!eT?M#^MEK9iC1Qy1NP5Gar!baizc?5k)e|RRrnA&d{JdfCWBs8an_Ri+i(zqZG;$xaaAkCCX zJiS$bC|Sh$bGQ7x3LC{)LHP`QlgEn#L>WTdK3>oOo>nTw%O?L9C_N7m&!_yIt^bd` zcY%wt%>VxHnL)!-;-N&-oYIm~b5t@kwNX5vVU3DPn*|7ikO%;py7uWeb z_gwcqo<%CmlZ1)%s&r;Rd8zo1ovAI{tlzh<_Zl5;j}G^mrZZcG zUk2rME0l4%Rl5gUhZ=QU9}|bvtE@wjIVzr1C@&wBc&^j#z0C77YA+BNQ-QNK+g5OH z4OzZabDw#Zmo=p2`?7ez_$>(VEyOdshuI9SPE4-KQ zAeq0z85`k@jc~6zr=-RV``b9a*Wfz8`JILtw$-^j^Saux{%^lb)r&7*l|!Y~h3lc_ zcXWJ)Coax4^yPZJT$42Sh30;syZKpKUB6{7$p3nKIRj;0<8O6+Uwv<1)8fuGL-V?S zz+JwRWUtka@!Zebr>R#%&$=Epd|xz-d64V#J(^hK>&!FWiGj0lRn)J{?|m(t4Q>5@ zeI_xV|F>CR0{bEJI~=~dp**KiZ>OnxbE)qt)pz29_}noll0DrReP$}i_4PdJOxpY| z+EggxqO45S-+NGAUqI;x&DvenBY7r%IoBoMhp2r~+kJDHj=Mznmjhc>yeDl_@!FxJ z*(V zv~rDROwX3{d0$XBKcZOj_cQDg=!K3nAKf2PgoW!Yt(o0R>CpXo=9 zJI>CsM>fwRnd6RiuhqCS>swXwD&A^FD=Z-lsfh=EtSJPY>hzJm0A^wg!5S zT?_AGjyZK-NWTYmUO zTkbPjog8Snm!^Sf%&bGc&+Vztj;eNIUSfY2XeTvys_WqLc_e(Eo;%GsO_*P;qb^7ExHZ=V=6LeRISfx1IrBC~%^y@w*cSE6?8tFt4HPKzwqK4)OJw*XlE?xkj=!GJfQoYD+u!wyJfio5kox zS%SrX>kyl97Yf85%+Fl@e|alEmhM(Q+jepV^V|Den{h1))PFBo-I_h2=)UFtJqZ|ask)g3LLpA!3@ z&F7mm_R^Nq4eponbWZH#kb6v|pVdhkX5a5@ex@|X+8tJxNiXN7gY>7rPPQ3a(TVD( z|3x-q6grWgB>sQ3q~GElVdpNBTHt)9RW;VD6Y5YcpO%+jRZ4?}w*fYBSD9 z&j$Ll%|7|3-JIp?GHV0~yO?lXHu&USNdoio*^FqiVVgYzsl z<77*C%N$-M^=Pg)J^9?mXKVIm{b`&2cbw9s=HgaqymD+VR{KBV#Q!PyH_yk)d^e_( z!#rCuRX!VVK85SHfqg@uyggHG#!Pe|P~KjlMlbTqy(&%J>blfOO9%Xp=X;Ey={Dn= zfZrhPx{J8>qClHjP6$z$tDu(43|dz*0- zmFj%-l07EpTjad*X=C~|ozl>!u2;>mJ<99r*n8c?eUgEE%UaC-reC{z1p7yHCGX+J zfFRc|a_MXRM|Lqziz~367WpUZX_i~8Y8RsF)!CQ-kM3p+j=R%3IC6t^u;owIW3z$s zlZYR4Khm2s%@Lu-fP<$P1AKj{vp$k$%RMLN8t)@5`oU@RgVV+x#j$o&_nEZ0 zH>W9(?o)+)kN4MOW555%9t#Fj-qR?roR#l0|73LqSKs$9{V(3EXZpP5hqj+H^gTH> z^d-yXCmWX^i8ki%o^D+1n_)!9%`~DSV|ez&ES^EqInlgVbpJHNb3f}}k>zfB&;9-l{slJQG@&i;hWn2Q2^u0Qt*_psbz zbZ!W#v(~8o5XS!H4EkKekv|xA-#R{D-eiQu!_ zl09KJx#ykVn|_A>1)pmh`u92ZJ&o%<3Z-ANuOT}|Uw(gD&NIsI1ee2Kpk`MX*nePVWte$xdIX6h& zs@ml(CrI9&)Nb`}seJql<#j;k^B|Ph8lA5yD6g0F`_}oAJOulm%8&cdH&y(6RzH7; z?=05Hp{!3sjFZQ9vDjJlq`jMn*L-dY*Z<7x;)IjBIhQ&(qU$N5L8U(t%K!Rz@I7Qx zyZVqithut2;e>(L5?ywAf9QaU?*d)^+jM=1A9-a3DX*kq-V@K<%y+)#PRP7o{=Uk0 ze;sz54m%Y#*Q<2K{!7Ih4JB_2q4cMv+I<;pDIfbX*>m!JNmEFJx<}rr(~!K$>qF)+ z@vq*|pD`ppVRb^=a$Ctqpg(5l{8T`BJpd(4t#%i`^6CjCzSiw6c~Ivw^mn52EEd+x zKJz#O$z2sv7il`5PwF{#kLID*RelHSbZ6>xFW2d+>*j6N|CV)O{6U+s1dY>Uq)V&) zW?+7Pi~omxz~^NA2+jH9OtUEb&W2(`q8hX6o%$;yJT!@Cl%aT(hdO%6Z=}jAQ121g zyEmFnZT`q_yUMGzzvg?|cro9|Z{W%+;4d6|ZIJln_kP>^iw)v0P|n&QWstUP2vWW< z+yir2>wLuQGLvlcClG(c5|y9U|CC-6gS!WHREP3=rSfW>PFaw2T1xbZYY_ zke})f@>Bl{`H|lkZJ$o$3DU7A2QRl1_Y;*{enYf%Imh(F97JpU262df|X zEhTxij(`0L;`ekAe|`t?%WvPckKb{r%-(HZf&ABX5PxF_@jHXW-^BeI?O%cT9jU?V zCkFRm^&`I>C$HA^lgRnT_OC$v1s%j+)vU;bZPMX%Wu!g zt9ATGUhFu27xA=znf-koaWu%I8HE?{gZvE%kiaTt;}q3SRl^;b;l%S zrewIi$NVYhmK>^Qky1eO^*qlYl_xSanq^jQ`B$@V$1T|Fdec93sp;3;sVUDiZT;G> z-@m8%x#stpp`<0RaLowK37Rg=R86nuotkBuHJY`W2Q-^BJ9||+12iKwV>MGWuh+a& zbF=0@G~d?zM6+45bGC{6tI zk7|bHs(jcr$7oL0oUOT7GgC8PvsiPN=JT5MnvI&@Yo5GHr8ht`LNiL!>@57b+{$bd zospI8zSzCWNHO1e-Aos}ou0eMST8P@dfb`%{a@w%+#I)e)xxBV9JhEewu;+)x9^zC zlxYj6xMqzVV@`<19wXX}az=WFdy(M@ndeSQ5u2+Wofmo2eQxv3I>XF{nx>3o>rA&V zHYwXT-RsTbK>q0=F1LHxB}|4Xu5^#v_@L9Gq;y})dvY;QLPY0yz3xn(%bS(#&d#2d zVyqC?Iaw(=8D=UH0KYRkXJq@l8SYH%Pi=E@GJNS%SNYs=S&PzB+|g-CUgP5F^Ddbl z8z{j@%d{L%MtX9~G-|wKravRgJ3l>hX@>jKC0DtVebaM|8#~R5hNlx*oMVi{d+{3k9wd6`PexJG=cmR5a;^d1m5=?qg+Qdo(3CSa$|fhLa2 zYH4?4pp?(dBv)QT=J_(BlRUm0FEvcX=K73R#4R=}YgvwGMoy+#z0{v~m0|o#{&r>XSdh6goyFO>&NeH1ntMsk(xq;_0q_|+J1xjeGgsi0>AA^nkF*d)k>)e9CG`&f zz0a%xUlK`pW@V;kEi%>;zwY5#-Wd#5a;lbbpK(X0IJb9sdL}(pd*PaAtJazy%U&Z! zy56_CZKN{2bgdl5;|-nWr!UP+%23^zrj$Wu+}dgW%5-0HT3lA3*ER*h>Ry~IB~br# zdDFA#h^vecvwchtEpE%CEU{TjrJJ^tKng{NR(-ZP5OYhe%={U-2E#IQsoC@@x5~Z0 z?y<*8q1@L?N|)p;Pl`!jn&!^-UBW=(?GmZ)2Lru=9x){~HJvTlsyRv7%h)j4AAcB9^Sg0}Ux`oCd}VnimBqAM%i9HF7d>O!(dKdiJ!_l`|p;!UC(RkeOc zwad^C)b&cqZR>tLg{Mi_VzZJ`bZB!9wo3{N+1}Bw#NqFqbf?s#tuFB1998=Q?`Q-c z(*+}i60%{YvM6|8GVH z|5Sl4QZv{zdcSsgvR%zFff~=WE*oQbzl<XcyYrZcyI5qBN6q|S2=EHjuh%$3i$-n3_=d$Y~3 z({oAbPo~=?OhOXf6ys*bJ~L)|imVK-q@`}-Zi(~K>2oCh=Om?Qmy9Um4b#qA&Qd{7 z$t3KX?OYZa6C~{P%oXY0tjy(1(W*e%lxT<9BZK{`#9}t7WM^tlYN~vqFg{l?XJ%(* zxFsKk#LMI<@9DbqrAuXGwW^^v#D_{QjyfX6bHsk8S?{78mTMhhH1HaY4Z#D2+4g6LE zztzBRHSk*v{8j_M)xd8x@LLW1Rs+A)z;8A1TMhi5tO0%bt|bfY-?#kZzub^BK&@Ya z?2ajZXXIap^Lvt4*k4KA&-2_1&Hv;{Ips{xD7*Q-<&VFoVQ|F8JW~{iuYH|}ySRzu z8P=^|?fv?rL(H_QG;1{LG@CR-rzwASO^0TTW};@UW+2Vni&eP5`}}tA3){UfYxlmo z-TV4>?;G2_m$C=a>WCJ5NB{ZH+^xjhzJC9+7*%MA_xRIb|6a_2@KQhB3EIA2{8DTZ zPF?|jc}CZ+@;vma8&&%T${nEiYi$R@b;R1jPG&#+Z~cG!eA({{o?pj0RUcJ1Dc0mD zwh#YH?-TD*@z?2kiTMynN-RPQCYtGR1y7?Vt6m3$x;r@oBVmYtRGg*fJ zr%T=_v8#U{_xA?_);HSG^%SqqeUb_SL`L@EyN%c)iNmgZXMcmbK|8*0busJbrE$wf_8v{JnlXuHy~S z@%_8xIJF^?JjyFjs``MTS?FlHzMOZ_l!Xbdq!eeiFU9HP`HDgQf6>r{*d&f!rHQ|V z7Y)tHOustEo#63#fCr6&2l9J>YJ^uWtC2n_0 za>}^WG47<%V=kENbgHx#Tr`yVGl{c*2`T2GxBnzE=NKJppd5i>2P;puFC!sYAJ$9A zR;Tq6%!5LyNy%iAZ0&MWD}aY>B7IzEoJUGU4% z{rdQlDV^8%i!pYXKaRn3+%YRNVMUTRJ!wgX``6XrzY*WBs=?|3-W#tiho1 zn8zp++;XBe&`*Q;OHk)6+jtD-&&%;sPP6@@KX>4mRv^(1`kk4v1UY28G|RiHmFEup zC(Lwby1nViDg(g-2Fv%7q?CjtIfU9OiD3THGgrt-tAr%)(i}M*)yjL&ex4x*8{5=I z@bSgD){-;|0Ye5R*lKZ;7p{`HGRrLmJB(s+_ue5IL8Jn zUv_euTMo>76F4)SmE%oztKniE(be5H=;G8teviesGRwP+Xp`l30GYehR1_?(VEM|) z%+B$6vb;WbNZ z5|+7FwGVGrR!8-v=gs5dVLHt@uEqi}DF!P?hxziEr^^$vJ?`Z6RJl8YKGiOx!Q#v0 zJUCtGSoQ)HCDT{XUU4js!Qu<#FKY#dVRM#bv$tE~PLLTiSdMs<0+aW>nALEhxNW7Xnba#{>}AF&zm#7Svj7moTWcOeu9*1;r!O&e|>!{ zjHc7NW3%MepEfacoco~dv2aFGy7$+{aH9NsPf+#~h6_^WApRF5M9cjNC#c-u{cR!l zoym>2DJKdZB)yL6cfNb6xhp(TH3#eWZQEJLa)K&T9asMimcQfL?N{V1SUe1SS*K2z zl@o*u(t5%BS%P_6i8sf*2`b^(r-Kt!WUzD-=DAb#J#Za%hM?i1W%13(FlXnutYvQI zExEf#PuC~PM$q;=VRQ*`+*u^Id~}$_Uu@rw_j_)+udZ#qcaTi5dN_XC?zred!Y`P0 zd<4g>96`dh^nY%S%gSBVL54f-?+a!HCMg}kafuQ(Sh{k5Pv9oCUrIPw_+Jw?NI2F> zeHWZ0+Ag!de+SM zqv)v69fUWh74BaA-<-!<^=BPJ`^M@Z-RZg9CHKFd?m|_&EuH#A#SYf5TaAa~GaRgc zsPx*^RtKpD3*Ww-=4EAdcp)!H_yx0qM$m3x=w2BlyxH@DMsb4vqN58|f4ctL$JjxI zoFHFvo#ohSrY>j)%YQ;bCZB!1K3{r5mU-WJ;9^V%{Y&DNYdq;KSIL9VZ{jbRTjpCu z7qq;xZYCtl&EpA6WS6Qhy_+QqmS5JNVG5voOd`o#2^33B|D?)7x|Df#x_^`HX;6=TZ{|#`b zwrk)U+CBgeYdfSj&j>*hzpD>-vhrNv*g>6)DmeHQo&kg{9C9kpYQq*fk#RcDxP*oB z9(OxQD?>DC9K!!1>4?(aGe!*bM_Z8NxTv5o{xzJ7!T|;%R_~QSHD^Ci@KF zUS4eB2j~#Cu*X31fd4Q!aS-{GwBQ@45I+s@Yb5Ck&pn;rkRvVOm8cFo5w04BAHwFr zfe}0t33uVAr~q5o^&G>fzz&0HNaFOs!>Dd1`9Ie%?nY^(>xbtISAHCDI+D6ggtK|x zP}*4P8OrmA!l)~G2GIk2QPvdR$$SP;2G1Z0BQ1Fr(Jg!(=<46ed?wLNV|nhE*f4}= z6FDV6uoN}o?ifcKU4VZ(Hv9lN&!Dd0nDP8RF}5%UrD40^jY#q)tU(oo6@D)7v76xX z3G|PJ9$%7Zn;+aFzui&ewZyfe)!zf3Rhbs6PlKO9gvoBV*3zi|%4?H=RzCnJ%;4~!h zyWr2rY_B;y0|ANcf$LCr{0sM@zSzP;C<40)UU-R0%L!Mw=ySN|!GEHBY~c;_48xBt zya(;X7XE;CV+-G(Pk+W1`r=3fI}dI~iIiRVKJs7-J1^jwq}X9_91=gmY_tJecqb~u z_QUZDRk@t7Oxsm(_9F6p8T9~%#naY9segD7Z4~==hH>>3^qDis4_uZ+S%y$Q@PQ@d z0Y5eHv24T0!%qz?TS5KcrwSIXB5&A!xa=BTxA4Mib$;O8NZLYJjSS)xzK!}~=dC8b z>u{F*zzHZ4Teuia#1^`)N7%w8C8s{rms2e5@h^Xd24!VA$+Y+-`7 z6Jaf?!@Ul=*V7hfk!QFCO~V#eAs4pr3zUK_>~h`Gh|sX*=T%o}G-O9@5~+ ze`d@OXDobY18sVCC!-mL{YCi~4%2oV`~#A(`LGO4V~h*ywR-~`eW&WHkuV8~{|tB& zlD5c)PiyzxaN%9d-K6V-mlu+M?2WJnNuGrtX}cNr`Kxm83&&_X5-vfKRtj8;ByYlp zwEIr@t+tK3Ip2W9zZ3Sjhc+VJF!&9s9!5RDSsRrfd0y}hNb)bw7=BjU^8Dh#_bNYj z_zBue*hA29pYkufT-%G`eMr*v!_)6qWwFEcNZf^+{qz&^QwDn#>GHx;ipeMOhr@YD z>L(7~gW@is-e9*9RsY@LAS8b5aJ04~;p9@rDrIrP%uV#A^XbEI-Dbwv2-*m)-J;^D zfCI|t&!jsLRw2o!uo+4GLf2O6d@YYENxMYB>yXTodGG=4z7rlslI{^W{6Xb^1YCl| zJq7MY62I_!?S2%Fc}V$*gm)v!+eUa8iT@*T_D*HT!iSLf*$F>E68|AM>S2{P2TVoc zo(AvJwjUlsl7Hc-UCNI2p8Nc>c9&-+ zUxdVu6W)Sku2>H%Q9X7Q+^6lKe`8HR;y(=*A!+MUSg&p2XWDLp;g2dm!jal`z}u13 z)dsj*y9?{JEj;5fmDW)B8A>DFCV2DXtZUfoVHJ}62;bE90XX~#t+DUx~+zKhJZh6{Gn&(Fa>d=xpb<=NBSp3~)mu}IoTn4xXqm={=I z@gDu5%1#mZ#x)T27Me>GwAuLCd{|Y#Bk72Bqu<&8D9=jTz^AdXk>=CdYm0}-- z{r0M`c6b$%{Aa*j+OC1m|DCkwbTSUW?~vp{o^zdy#7=>apzi0A7TkxTu=m3oUSoY|n_kAY8V zy9N$_SEV%qhQG%+!N2f!BzfBa-$#;%gK*IM%C^H?B>NfRbK0(j^9~Xh{XY(#`T^rq z;)JJu$UG)CjBI4>rhbG!p(^Ul_}DN;d_ugq3v)iDjd0I}@_ckVwlEb*e$wDS#GN*( zgT0%SdtYcjtonunu0t{&3*pyD>bV(?`cnCKz@td|vvB4S^2UMD7`OpRSYg=Ls;(m7 zA5jGE>tU027moc#k9}C6Z9jZp+s!cSTh(?0VG1()58SA2;g3k>e50A)Y(-+bU^9xs z7G`{>KD!B@KvE|)u>1GQ7B0|sJiHe<2_M1%hQ%m6k9gpgGcAUb{b$+` zi}49c!+qdT;z8oy1@Ae_Vw4fjM)>pDv;}_n(NZG`N!e52#pe)~`iX_J&sFZRu=7aT zi#iO2Lr1Bw!f#P7aW=!Hqb@=7+#$t{~;j>8k(r!5Id<&$#;K=b7V=r+!VG)w? zSPJi)U@_KW7sBxuQiu4N2-7B7jP4RY>^X_}M={UCs>v3^k1gzbk;UBm342em7)J=3 z2J@y`*nqPyh2y4Kj40Y73jR2qK1LrfX3%G5s;~p$)ELqu&S~&*R8L(EonQz!9P1AJ;u7kaIOX>SMqO$#`?LJEL6){XaJ{yLc`lWfaQ9rwz?>{Rh-B?Hc&0whzI6amr6Pj71VwxKg|4!Y>zC zjB4ipBkE}~8rv!239@sxc$?Fe5+RoMICgv%`EyfhK+N8z-o z@Eat3vKcP;o$6!p@G&I$c^po;T-DDs=tt5&%iu>y!ZyOY7SkT&rx5PCg1&tL`x!Xs zO6A`Uzeah?|IP5sMAhy?VHq;xgkNdp*qS~0Oz??8ROtTkX+lWgORB!tnh9mb+QqTUP^tE zRwR5&+YK-~ojHU&m%-d+_~&z<@D?O_UJo~9&|dfvUbmdKpic6jk;!~Wy$M}e79*cN zmItjKm4^_x3dv{5qj2!mYEHJpHAwae8{uTH#aK=Jx$yLC(qlhhhfiz!Al$NwbV;iU z-h2&Xd_H-DcVA1NAwL^or`0OmP&gM!+2i0#+I=q^bsh5vbABBB4*3at6uy$jc%**z z!|gXvpSV}SyVh9D>ve_jcQ@irK7H_KBzps6Epq~rw4&e{f1nrO{#r!;fwjiIgULW9CVAa?QlJc!Clz(k1DJkjz^O2 zM3}T5fA~p(A0x^0A((V4^+vj-@a#XSJVd~)NIw5I!11@K{yY(WgJSUC49g2>JL0T> zp?_9=M)(Pmu!rExzgUa{(u#-oAt|rtPU1m!>bV&%x=ZCb9^Qw#uts6u5s zVANlkTjo;Fa2pc;6>#|7s?Usof4+ygZUTK3Rw0Q;Sf_1aleUF(HmW= zANdS{L&Uz2aSbm;W}CvbNb(@G+^^=n5I7G>JI28m(R#w}g%kYBeIm?35;hmEC}M2l zCl`hmtF{P(zekc*9{dDJoQL3pC91r;VOlBaQeNT3o5?439z17@3OfRBMlwGffCI`@ zx+7r1RuyL=JZGC4?<3%qNb=@`{mPXeJA6mm4e*TZjQMHQ3H&pvA^+9z6C~H}jzDXr z#W>0w5(fKMQ8w~65bi>`;vcSlK+iL<+k>iH-GxZXE8K_7{s6DoNnK6k+9|vriMt>E z9m#xE2fr125`7E~-9@_i9|7}_luP)kw(H@@N0hq*UXCQr#jqYpy$P?VCeF#E3n%_f z%|F7o9<`|P0w+Eu>muV0j(Hsaq#FsJKoVyS-13C-Uk2YnVO-;FfcHO1e`Ou_!?{n< zj#5T=E0VAUu*cKPx#S@XPDc_p240J#T&v-*XIY;J>wvc*na2v?-;t9#se@1KW=_UF z0H;2u=C@e58-o+x`~vQ?Y4=*zStNBn4ZefS&#ExzMYY!C!Y7gB ztp*-OtI5CoZqV30Do*(go@{N)@BKWa?M4{!5^cb`FI=*hIwx!jtVI%M1HAq3Di0gr zPe}aN{=;G{d|CNPgqPJ(u8U|>_&qW|)4^f?RC$PiOOV8Ayuv)ck9kl0!x|KYEwt}f zX{EvYwe5#ZuQE5{M>wzEVhqGCgVW!n9 z$I9T}k&M$i_~Jq8hjjPCvJYtADdZm>KvE~dlRi{+6$%TH%=5yKk0=Xag$Gd zf2z`*2tPvNzY#uvNcEFi_^;2fNh{`a)}t@ztJu}BPm^k+zVNwkh?n?l;g8=^*Vsn0 z#W){H-lAY4lKv^Y8^uJkAAqNRN8Yf*VKfpy)8HB;Vb{V+?Op}n)b;^*+4s~5VHd+A zsF`$|;iW%Ne%xJfIg+~dz)nZid=(0RKr$A(|42MY=CQ@_l%G`n+u=5CSHOcv@^c7& z^|P{%z{d=$ndir0cZ=2ZBV4R);SOzA!SPnBxjs&W8<07F!UM=`M|ii*YBWgwz>kpR zzY#7DQGSGvpfKk4YIsPy3m0`#aaO@m{7${JX%u`Jnfp)J=OpE)FI=SUcsM##`HzID zNZKL|-l^?EXmlei=?edfWZ$w8j^p>?#g2lzkd&nwI(k^my`1o7B;{QX$MKuMQm!bt zx~J7#r-a*kkq6@64gbb(*~^%E94_Q{Z)H7N414son)7fNEI|@yDZJ(stC2$3)$qAf zm7iK@>!ARJ>?b|id8+w%KiwlkD} z`K_{OZOiX|-KcH(jjm_4y&L|7Vy2VNGp)vH$iR+(i;<)yw4P-(j^Z8yy~vO4gR_T` zPwZIOfMg#o42jTrfFram{NWs{k%<4JaNfBp{y6v*l6pG=?;Jt<5>Fv~4M`sQjwEg* zw(w?cuZOcoS&driFdjaSq^@dVm(f=9T2OcRB$B>iAHz68l273tBysMAKO+fijJ0w- zz-q2L!Ym}$(>(C@NZc0_7RH@#H5w_4@ZdQ75U22^DAK~-3;Rv58Wl0jS8(Npq|N7` zTzKY0tI^C{Jrp`8Q%A%jG%m6lYY8iyc)mZSssA#KE zM_A#DD2;1Pd*SQT82jX*9wttwu5cH|%~0_OPma-J1g=F9(&ynxvsAjFaICf?VH%Qp z6TUlJjgf=!idbbQ!nfuqy8&ijs_MZ9YmtmW;Z7Ink{@C8T>2sDPJ@y2RQ(8_Mh^V! zhU4d}cAN+=jl;&>1*^oS{|Ngpuo}B5Zv>o(WZuYyg$ohx!a0kWA4tmu_r>E*Jp184 zFH?Ct2nYU7l~H)b<*J?&;q6G;VgqbKQV+uT#neA>3Li$|UJVCdq3YQV|Df%BI6Z-R z9RD%!?Io0#yfwi5WHoOHKSc(6vqSKj6jk=sun9>Y5YBb0wBq0oNc#3sn2<`n5jGLt zj^sMV1{k>%8+YLsC=I&_4o+iSW7}aIlKcxdX}b(gOjq?REJ0EarSKah{*S_uS1H>8 zFGJ!d4HhHW%ay`?%dEy;(%KKL8Ol!x9E&8LNZ4gL{RcnY;nhg`j1NA7#7`aUpQ-GD zFiqP&xC1p1wh9i&qF-Ii=MeVN8{nraReK$RC$Ca=7#w$v8t+lijm$QJ_aKRX zC;SFU{+r<+uT^0S;MnWvf5aaN*CX*Sd= zG!pmS@Qih;eTTw6H(8DS_~{G#=QGwWp}n9FNx6hCqcGg-V93q7{^2qt>p})BL{cu{ z4@kn=Z(+VivX2sehNK>%{%AFpBk|*bdys_P3;V2B?tNh$k~1X2iMOgbL0GQs3fS*Y zs!qb;hscBfMmYU8+Kar!z>oqpmkO^%iTGI!<8CKTY~cJ@29PC7Y;2_?!wi@ zyl1~8{8x#x55R4u?3Hn^fC-!MPuN5lxmmdjyKYhK+a11(WNthNx0G4U??K97x2@R3 z(;b#0$#Vt#7m~6ZfMd5Yj_?x+y-3`Ba0ik$s)Fa2Q!W?n2v;Jr-Qi^wlmYj}@I549 z55fl@pv<`Mgs1OhuEDm$FOhuii+b2`pijNq>ujsoGA1UTyo}&DvfMe@3!~8a3=6&_vp6FZ}vx z)fUb0=4WVc+}FdQ&#G}JycVV5z8daAQYY20=WbOGVem{O`56kwX*&uoMdCjV=4o44 zsBPijo}+$<|8Y3}dFEJb7wq=};{@9Q-7isB*m=qa{YOD#pK4QK9FjgDEYr5|sJ4a4`&GY9 zfo~$I|A<#%K{9fyYuPJx=ZP;tIy&86|XAeMGLgD8~zT0Yo zJ>H}r;_ifxAFvvIu^ZseNXl-!#l8qhS}vH5#61HJeOu*In2f|d1+LR}KCIMs75o>H zcpBl5cT_!$fQ3lht6&q#m2?~UKgz>)z!;Q|?SgaBdhA4)gbJ`z;5H=jRKWMO-3$jG zq^UK4IU2 z|AFusB<-~uF8@^7Rq%pCYR->>`?W1h`b@c}K+EUK4uR`XJ@MzmZ_r-sW_Z&Vs^0S9 z!%gfPaIc1E9aioUa1WB}v3sHCOZM*g5#D%&wGa2T!f#Z$gp0pbr}bIIG~zhRrC%?ryOe>yfOd!cv>fh`?R=ekYspIQBtU)!AmoFI;$% z&75!J;b~p?-&E=le$Z9fjqurSD$d>TitaYE{u5zD59Kc0iKOodUp?8zcb>E z{63`?E)TOA8Mu33YA^D@{Fw&7Lc0lj6wd3d;>m!oprL#g+Ye{T46g2L zGtbWp*CEM6KKv0$KQT_R8IzD)e{;fnPPG|v*rjk@Kbv_SAP#zwTu=7F5^a~lPm#oV z2u6mhI9>22ZCAiIwS54F^|x`}ow*clA7E3TePAQ1!QJF(Hp7p-7v>MN85^*LuOP|u zemH87vKPaCgH>IH!yF`ja^cT*n{kk^#u?Nrl0G9`ai-1u44Vu8hUD7y zYWoNrF+{mX!Ynjx0c`}!ksZ52+|N>Z@W8*FP2U(z{$b}~lo3BMumFW&m%>d`i%7TX8+A+wF(m@&F6aL)NQqYghV z*k_{6IE397u0ryeZZ#Y?Nu?D96DIRp+T?RJd<;3UABW$e3hbkB%0)IK1$!DSLHXFF z@M@>caA5o31|)r3c=HsS5rzAD_!Tni0iHiqI-N0sBu*dPfW(h*r?!Q+%v612J$wU6{0HE+lrQ#7@KbLkPo;Nq#Ee zYe?ptdT5=e><~D6KKbEVRvdgi&Su0AwjLfr;=g$j<0xLmKLTE%?L_$C5?L_Jq_Xap{iOq<|7M7;i%)+8hht~JyV2v=8{xYsJf5(y_fq8^3Cq$c4}OICSJ9^U5qg%X_7y&jq#bud zew5R+L*Y;)`I!diWKt)Db-@p^7%$k3aKqI$BM*Bc^klO}uwDp1L()b~Fwdvv4dIn5 zn0N4>2+z!AzQ!I351<-s;lx!cU17Yog{Q2h4)GHXZ$zp&mDkMIU0mowhs9rw}y=imn>->=H(fm4fYMk0QMbtR;S zEwq&qKXwRQ@CbE?9S`3@(jOY&Mb#=@C!GB^#w31XVKtKa5q5i2`R@+3!qemis`nR|t=AsH`+U`9RtlKqwNTjWU~pK!y!$RD=w)HfL~_#X;?M)oUd_XF(l zkkr2eK8a)xQv*NM?uX!OZ?Uh!e?4q^n>x9IxdN_whxf#}8a{|*kGB(kfMi@8ftNSX zMuc4qKS6TsR+>$EK_(YEk;Z3{ovcK=Uo#&{%Q^WeSO-U^@B_ABrUZ40}9s{DTs`yEoYFjCvX z-)Y+mZ_~E$DHKYZ3J+*^;h@h{JmoB#qKPq%B01F zU3jUsFNe9>7XC%s!Uwf&`I2#fB&;wQ6)=|y@6vW9+>gYMF!n3v9ImqoQ;@g|uhF*f zUTq6MM(Y{l!Y)TtUlI;Q5>_}>+roHl3$wK?yj9!6ZQ2$-t8L){Z41BAwy@vVDlMTy z+rpXJ7G`T(xL(`BQf&*L)b<|up|*wAZ&duk{>WfF3dd>psc?z5g*nJzjuJkJ!k80; z|J1gy-?y|MbB^#_ZI6RXkkp$87HHcKuW6<&2eJo%UB6Rvk?|{DpW}yHKMZaQF}Qui z;C2#&TR!CW3xiuR3~t*nxV^*R76yY`9Sm-PFt|O!;PwgQee@CHwie?9#BDDIx33ry z=V#~;;uaP&yu|qx3Z%uQN@Fr|YTgd-LWSr~G*;^#DE_u-R>9W(9_IZ{RE@e4e*(G^ zNnRv`3yeS12SnP9SI+*d9tP*GG!j8 zfg#j8x)1H(|Fx(Gc6W3pIs@6!V01dV9L+(o=wdV*%|a7GDHn=Foll~?C_(Fy&fF7+ z-GIcF|I7b`S0k^MybtIj{H^{E^$p>FKvBdiaeWRO(MRY*^Z`1EiCTE6^&Gh!W71C<$GUu0yNQ4d^Dc z4&|diptb0asC~HCsPooh%Vmh3!(H0BrUOaaNt?|?)6f*uk>3Ye{cp0iC&3By+lgo$ zc0eCve}d+s8&Q8gS}_e8QQAHe`)nlcY-5buQD9z@xr$rwj8o{Ny-_bDWBLgF_$%}! zI*d53XK+l<;K-lBkv`*N)QC6^XmCW)kiK39+pAwYcNq(PTe(SkVMzR)i)8%Dyf6ZZ zKbaebA{oo#?``tREwRRK(h|vBAe8*e_>;VIyw04DWL$D&&-fZidAjnyTi`_WEVk(S zAiA9PTZHDI*~p15LX*)XG!aR-t}qmJMj^`;ti+*Tip1HqD7Uwe@eSOrnwV7jjGWjXczh$`X}*cqH@Z-4OO7E=ti^# z-GK5?F)BiSBy-q(Xd{w2QQGugbUi9T*CB2p?ocQ5{~oA2>V`tmNvJdGghEg+^bT=I zd%lGZpf^!h+`AwPG7z^1n(J)@wya&U{=R{1ydQ=JqtnqKG!P9yr=k9+AL5qCplk0L z{4cQ9+p%S>mUUXjg^ULo7mes6^db5HosGZu;d|&T?4BqLov9`3;tKQx|CfD(Fd&IH zkX~SKAZt-;E#Z9{N<8ri0yGcJMY4bB;FZ^b`)|(wzp4SwbW>iG*S6T)=Yj+M^Eme|tg|uvFVWw{oEzJQ zV~kytyF9}#4=U$z-IIomKF=}C&U5UuQg~4Oq+tuVw$=-zYyElGtF>>J0uB5)C zp`@{-sie8YC=D$QD-AETmqwI2OJho1rSYYSrTL`=rG=&b(wHr-Eum#$WdsZhF*bmP zZH?QSwl!}v%0tV;%EQa;# zQ4(4bRuW!fFNr8|lth&{OUgD?Z>rr?zo~Ik^QO?v;hQ5iM{SPT9KShjbMEH+&4ruG zHdk-1-CV!9adY$L&@JIxBDO?riP;jrC2dRYmi#S+TgtXnZ>ilzhD7P>WjYsA*5tub5Ux2A2)-I~9(aBJDt>aDd~ z>$f&;ZQdHXEqq(Vwy13}+v2ySZOh$8<{csCUZuca=r8kE`K$f){swnM%V?OR{kP}*49RN7o>Yzo~J zwkdp*eN)6H$EK)F&P_3!T$|!IC2mUFP(?k|P!o03MFX|bM12@rL$?OnII$wF!c&o3kynvlQBYA>;jbvG zsH&*0sHv!}sH>>2XsBqcXsT$gFt&$o58EET-M&3yyJLIQcIWn(?XKr$5H; z^2hrV{b_!WKi8k<&-Y8)_;u^l_-p-jW*as7oBYlGWBn|6%T$-vl-8EkmDZPrZ?V(2 z9P}Tfw%%ZT@Z5+iJGeZmZi?zpddHM_sU* zGF%}>JQI3^|9_`sMp0-{SW$S9y(pr{Q503weq6OLukM6}F&1;!S%1WzB zr7r%x9@f0c*c`e!j8SW6+&UP!PR6c_(VNKl^)Q0-7{djOVn5@!ijiEySgvCR@%B$Qbr8ihoTnj@jyBOeZp`J&fx*#&ZKBx`{DuYzy5M#<;dKvK@?V zhn@}F&T!KE|2ukn?T)$~^*b7NH125H(Y(W`46O{S46n3TMpQZ~qbi-1F_o^$_{zk} zv`SB9Ze?C&eq}*rVWq#atg@=Iy0WISw$expFZC6x(vS1D z7Hsuzt=d{ce{P^J8}ws4eb~u-l*n9^$2{cUR>dq-#|+fOnjgk`?_jNWvCezS^U4cY z>8n`f>saBNSlz=|*&VFvF8YOsnZAHozKR*Xj@iA5nLUhI-NB6RVm9|MlNT_HS8cCh z{%&C1H(2xStoKe<`$SgyJXU!>b94_=hrAqR80i+S9`9A3cuUFEM~=5AotHkjA!%xTUdS5YGCY+g}8k-w;_sHUi{ zsG+E-$S4jgwii2!oyD%=#9~izUU5OOzqqQnhFwMsD^VJ&P(CYA8GDvmR-Q(7ETQaH zBFvpiJiC-!b|{6cFV#D08EcJM^+k!!99>9YQ|4gR=kP9acUoX&EbN zEvslF`_@qQtP#x6G3-^-%5%$&h7j{}dcg^IQTgnJ%k(0HlsR` znWUE4Ba|5@%$cM|U#{_o(PyjZqcQZ% zLi%K5aX5RzTw1Y?_Or7Fd&n*O4O*yx{aP3^New$&C-X%Ob3_!YUKMkJi?QFh)y_yS zq;A3((Piw??W|K}jMgxAU3rX4JH6S@_zP#u`DL!I;+%;&#^ULjb>t?7K3K!3aWGCA zizDb&em-5;`6N-mycfnySH}EiuztIk(Hb^O;NM>VZ`VNR>7>ZTW5=37-*@hE?z)(D z-}bPaWc9BZ^eIjsSuK{)JsmwdcS&3qV{zL;td>rOV{zxM!#i6-ENd>XT0;DnIAR_B zTDkOebm0P}Kcv{2XE;W;3manZzw79ePhGm;#_+@U#BRIj_0wM;>WzqdNgxTk(FU{mqg*|$TJz{>$lriTxPVd)abd+Q4=tzh8 z`dz;sV@5m1jE)*TM&AF;cj|M}`J=}~MU5NNw!D%W{|@cbHJaa> zO3m_SrYDU))zMcRPwLZSep04=2EXZ{w$tvvpFLow4LbcmqT}wDhCg{hX5PnJ*SfxTuDvVu zvZrPhd^6?pTF;|HJ}$rW%kk?kEJ^6U`lQ4+_S|=G!Nm8*UjFjfM<-0}e*KE4=D&8+ zeH&->y6yG&h-YV9Kl|C{rxQM%TySLjV^^1@?s{QSFFL>^{YC^%!%Rbrf7$hD}4mmZX@1(pQ zJwDhUafUzh%Z0-q>AfxGj?Nn$=gGf&g$#3?XDH(@CK=e?P}5-TN$-jx4TQGY9M?*ugF}1{uj2y$`Tnu% zMyL6Fo(ZEyC3`c*wiyPart^EADQ?~4rL&J*I{G}k9Un0AR|dRT61Rs;b4+zypyrTu zKW5mhj&mImfh<}rrw)`HWs{}$19McgYrf;8&YhOtz%3Sz>jOb7mJqMQ;}{xv@35>3 z*M-VT&i1s)nf^Y-<`B?=qOGDP8%KA3IP%QuFZ-VH$!o4% zFOU9X{-N}3wXtulyMNE}k(npIxc^VN*Sxc*^2}|~D{ddu_rtT_dpY!plNV+^HlTOZ zzN`J+2-Lx&MkcFr3v#d`O6DUea{@Z_sG8YA1=T9)bG1oJmdR;AAj|D zMCqQP8~a}Oe8a_ao{t)_cIoTabep^2^DbWw`k=Am%NO!zZ@#ADmeL{CSpz@lb4}lA z7f*g-)AZ+7j@@wCz{`FZ{_QE{FAmsq%Fqd8Ccby^bz$#KzVFY;I~{8}KhD%$s;6z+ z;hpa$OjvWc@1401y`1 zX{PN9TD|=r$xX+L$S+N-Tjqb?^TCJv98P(8ZQjuxdFTIg*Xu8ojHnneqT=w{iV5fU zo^Z$Qk1jg6`^B$DmBmbau6sM#_tJgIXEm?A`|j=2FWqt7;MzVf<=pe)yYJr8 z+^u`zkv)^^rf<9E^iA=99vAuK@biX`j!)e=ChY!uo8}dL(KvbEiZ7kNJMjHglTN#M z`--adi$5Rt=#8H^%3|L>-0j@>Dfv5$o6BwgJavuz%oU$r85h-i$-A$3hQ9gPV9zTl zUGhf0x9i@24F2-5Grr1rv;Lv}*WTi~|BFN8x-P!^k=gq~{o_~t_|{XCCUiMVPpr0h z#~NFlqj$^53w3m609tt_kSvKUlb>Z>@X7D@fx*v|k?pwpS56tT0-+q%b(4P0lp(#Y zrPEDcC|xdkiaBT8aGPXvaL5feIc`|%aQY|vC$5_ii1N4zI4}iu6ko>iF|?bBe>sLV zmfeyid&nBgW2{<_podyd&1)>BjtPMZU~)cB=k~a{IXgRJWU?oFq}T1q%1)Objl=75 zqDyHBZROp<)7Mz$@%3w_vC6O;IYzeOhFL}`e|<)pk&cUvrg;y=mQ9$b>}A$IFn<=r&GEJcC1B^8%3%KSUuj3d)XfszaHKaal| zb{NHUXN13?Vjg@BZllf~WTsr@eJSsbh17+!^s|qi9l(Zy9 zNlVg@vUw?i{8i-@ACedGBR=fJBB{&!RPC%GVWlb=nuH9s}evcK@` z0io6}l2e91+io&8*RTF#XLrA0>;-RbANS(H7biUS@M-5=Q~chM=&Akgd+L&+IqyF3 z=Epa@b-(4ygZZz1{8N`7&v^RK6?v~Tz4mnUGe4~y{^obD-#+#q8LvLr|H2Q?d+o(P zUz+dy)8F6y`uf8?pTBIOxAD`fraUq5)fxY*z4MN0BHQD*389yuAVmZvNRhHmLR}E) zy+~1t(joyu2~{L$jF3ez6crE%0xLu*yBmXofMP)qg%uDMBq9p}OK}yX32X_-P82Y# zynX9C=e_;s<(&L6Gw05o+_~rb{eFIT&ZL`Q_1Ir$Ykl2ddU#Ay-}hK)!(H3 zl+;E}Gmu*D9^96bLg>XY%N|we`UjtYRJQe$XiRK@e3#``-019D<}>yZx~1@z9ENIl zn-DLLk-gVGX)IxqbGulZtK4o`q1X;>GhuFY)9=a6*spoA`QuZQ_0Bcrre0PKrQp2K zkFsl$Z=uyPZ;lJWOrFiZE15p>G&iWYzJ3~WAr46rUI0kKvrq^Gh>!cN@3!$w_& z1VEULvcPxvfFVS3ErjrLAO+YC!+`B5^;%ZOc(e$3&B$knSe1?AXYzSw@A}-dmoq(uy62YhZH2WShUt19(xXyy zuuZIrk=qzn5;yo2GAw_a!t@lEM>ARQ&e2odY7=BL!{Qm*S!m)??~ha&tgZBieT@>Gz2OcO_!!?{jW2s5YrygeB@OR>*Sjh^!zJs%_j zgZUaR&(<##^(8V1!c;{f4oy4$Ff_&6Z(@6qU=c~E86XKYu8k`P2LwqH0#lICwYAY@ zk+e_|xT^rfz)wj!hKqj%WO;=_l*YpR0Sq|%*7TSgvH?L$9LJssNeqdpp*jiB1e)gE zwq-ABan~yKo1Wt>iOG|M3Ln2Y*yKB*9vW~-%y#eFI-~>~1%S+|fz(23Ya%sJhYCsj zp!jo$lGb?dFPb;Qj76&4Q_7Y0+kXPtk?W!J^C24vPCAfCIYg9JO=>4AT7O7u zejtaM?mQ5P0~glOxbP3e{XVm4gCoF(+ById{3Y){hXC94*R&acvwGkI$$AC+ku1=7 z->K~Ct`D8A^|TZG3-R!

f$B=v99WyI*Hff;9A^q{@hkP4{*OlAEv!=HB{gN1~GA zFBj!c*BsuZeJJDUocpt5z|w}@lwx+=$9_0Ue~cf0AGBk1A^s(eMW zxMnC@G8rmGSx-V_l};Y$p5@L6y}=FFPXZ!X6JQ4{2*3g;a53hKMAd(phoi7)lp6Rv zOLU|kMh)b3RxRR_Hh)UM8?}i)y&6eD4u}O}{w4?PUu^|)fXV7b{#EIKrDyLszz<_( zx+XE8n61#j1~mhjX(JMf{$}QerbwSdLw61xfhZ6XDp&8aT_V(lK{l6O@I!b!LKHQV zoq{i>MtMB`PuF7m!<_yX_ zuCt~j7qL{2Z=X-;5lH3aoirVb>&At*UUHUE>{qsY(VOXaHPr8NZfS#|P*khi{&QwZ zqj&Ppj43_w@l=!dOo{rUSn#l8??wA%2Trn5?=1dyryD-aw3Md1DIFh3#=yEfvj>#x zek-nP`$Z@rQH+dl5HbCS74zO|9di`^;WZ zFo|#x0R?N&fskOSS8~OL_=@Bi43renXoRy@E2m*Ad+uPBdi~Zb{^z^UE&%bt5Tw=& zVdajo42Zp0pamL__FAz(9m%!{{1ayQ@9gPr2Wrx$?cAyUZ)!=o55GL1cY9S$}=N5b-uFaDRm-uT)Q3&5qTIvqMLMn`9el-vbAIZ<^Imw z&tNcbeAwKAYuiC0zasHIb-r-$1;RjRnV7|Vd$|^|PlC32WIC4vr+1pb+coLge3Ada za2anz@L)Sa7#`go5oynNb-+;9qsDQlC|2~5-7Y!6^UlOxpCH;E?$)L0*A~yuICw4j zhq|B@casww$4D>D9hNRAtCo&L@2jQ26HZ-1iZZTt&th6m$Z&QfNJfg!h;vQpw=wLd zxQv&m&dU2wOE*gIEpP9o3D5V_Xs=wBGgoV|Pe4z3%qBt`Y7{#jnT=D+=Q3JINHxcl z(o)%ix435be_C?j0b*B01C$yZ5d1f##$>e>C^g!DM{3q&hP~Jj|3O-h19(6eTr1W} z)L1=LWXPXna&`89dY+I^+y1Fe{8w!qKG?ezU;*fG@v-;?toUw%!al3y`_XT}0K9={ zMr3Vy<(T9W*f!PQOZe9JcqP7_OWQDE$|j-iaXSZe>0#*up`FI6;MUt0ktlfS>RrV*wVO3F06BxGQ$7twa zWD|w47c;uUQdq*9tb?{YV!kWMH#OZ!wR|^u6u*PPFIpV;Y>P#BWpsDu=}cmEMgY?p zO)i@c&b~kA7AQz)hFrg;6kU_+dm537ejIy&=)RZ=9}cU6C{%|OPbN9aj=1^c)e5Mo z;HZtn+l}%n7Em676m@t7pFCtP_$1 zwF5{{tM{Oq_)n-2RCps^V8_*X3b1VrgFreJT!%U!o~|z8@p2;J@0Zj*;>jm?%Apc0 zXmjyewJ3!1q|5KSf;Gpf`L%6Jr|P9|T#2vr*$SwzogFHG+zxC5z-1Vis39cX!h=GV z9xsBGTkuMGRX=TMVV_YeENeIizCTe$>`jb=ONMnasDy5^e}uNXak_qewvQtF2*iH!c}nabzqib^xwhGxDqi3z@Tb|FzF Y)pLkpKVy diff --git a/Externals/discord-rpc/build.py b/Externals/discord-rpc/build.py new file mode 100644 index 0000000000..215d3586b3 --- /dev/null +++ b/Externals/discord-rpc/build.py @@ -0,0 +1,304 @@ +#!/usr/bin/env python + +import os +import subprocess +import sys +import shutil +import zipfile +from contextlib import contextmanager +import click + + +def get_platform(): + """ a name for the platform """ + if sys.platform.startswith('win'): + return 'win' + elif sys.platform == 'darwin': + return 'osx' + elif sys.platform.startswith('linux'): + return 'linux' + raise Exception('Unsupported platform ' + sys.platform) + + +SCRIPT_PATH = os.path.dirname(os.path.abspath(__file__)) +# we use Buildkite which sets this env variable by default +IS_BUILD_MACHINE = os.environ.get('CI', '') == 'true' +PLATFORM = get_platform() +INSTALL_ROOT = os.path.join(SCRIPT_PATH, 'builds', 'install') + + +def get_signtool(): + """ get path to code signing tool """ + if PLATFORM == 'win': + sdk_dir = 'c:\\Program Files (x86)\\Windows Kits\\10' # os.environ['WindowsSdkDir'] + return os.path.join(sdk_dir, 'bin', 'x86', 'signtool.exe') + elif PLATFORM == 'osx': + return '/usr/bin/codesign' + + +@contextmanager +def cd(new_dir): + """ Temporarily change current directory """ + if new_dir: + old_dir = os.getcwd() + os.chdir(new_dir) + yield + if new_dir: + os.chdir(old_dir) + + +def mkdir_p(path): + """ mkdir -p """ + if not os.path.isdir(path): + click.secho('Making ' + path, fg='yellow') + os.makedirs(path) + + +@click.group(invoke_without_command=True) +@click.pass_context +@click.option('--clean', is_flag=True) +def cli(ctx, clean): + """ click wrapper for command line stuff """ + if ctx.invoked_subcommand is None: + ctx.invoke(libs, clean=clean) + if IS_BUILD_MACHINE: + ctx.invoke(sign) + ctx.invoke(archive) + + +@cli.command() +@click.pass_context +def unity(ctx): + """ build just dynamic libs for use in unity project """ + ctx.invoke(libs, clean=False, static=False, shared=True, skip_formatter=True, just_release=True) + BUILDS = [] + + click.echo('--- Copying libs and header into unity example') + UNITY_PROJECT_PATH = os.path.join(SCRIPT_PATH, 'examples', 'button-clicker', 'Assets', 'Plugins') + + if sys.platform.startswith('win'): + LIBRARY_NAME = 'discord-rpc.dll' + BUILD_64_BASE_PATH = os.path.join(SCRIPT_PATH, 'builds', 'win64-dynamic', 'src', 'Release') + UNITY_64_DLL_PATH = os.path.join(UNITY_PROJECT_PATH, 'x86_64') + BUILDS.append({BUILD_64_BASE_PATH: UNITY_64_DLL_PATH}) + + BUILD_32_BASE_PATH = os.path.join(SCRIPT_PATH, 'builds', 'win32-dynamic', 'src', 'Release') + UNITY_32_DLL_PATH = os.path.join(UNITY_PROJECT_PATH, 'x86') + BUILDS.append({BUILD_32_BASE_PATH: UNITY_32_DLL_PATH}) + + elif sys.platform == 'darwin': + LIBRARY_NAME = 'discord-rpc.bundle' + BUILD_BASE_PATH = os.path.join(SCRIPT_PATH, 'builds', 'osx-dynamic', 'src') + UNITY_DLL_PATH = UNITY_PROJECT_PATH + os.rename( + os.path.join(BUILD_BASE_PATH, 'libdiscord-rpc.dylib'), os.path.join(BUILD_BASE_PATH, 'discord-rpc.bundle')) + + BUILDS.append({BUILD_BASE_PATH: UNITY_DLL_PATH}) + + elif sys.platform.startswith('linux'): + LIBRARY_NAME = 'discord-rpc.so' + BUILD_BASE_PATH = os.path.join(SCRIPT_PATH, 'builds', 'linux-dynamic', 'src') + UNITY_DLL_PATH = os.path.join(UNITY_PROJECT_PATH, 'x86') + os.rename(os.path.join(BUILD_BASE_PATH, 'libdiscord-rpc.so'), os.path.join(BUILD_BASE_PATH, 'discord-rpc.so')) + + BUILDS.append({BUILD_BASE_PATH: UNITY_DLL_PATH}) + + else: + raise Exception('Unsupported platform ' + sys.platform) + + for build in BUILDS: + for i in build: + mkdir_p(build[i]) + shutil.copy(os.path.join(i, LIBRARY_NAME), build[i]) + + +@cli.command() +@click.pass_context +def unreal(ctx): + """ build libs and copy them into the unreal project """ + ctx.invoke(libs, clean=False, static=False, shared=True, skip_formatter=True, just_release=True) + BUILDS = [] + + click.echo('--- Copying libs and header into unreal example') + UNREAL_PROJECT_PATH = os.path.join(SCRIPT_PATH, 'examples', 'unrealstatus', 'Plugins', 'discordrpc') + UNREAL_INCLUDE_PATH = os.path.join(UNREAL_PROJECT_PATH, 'Source', 'ThirdParty', 'DiscordRpcLibrary', 'Include') + mkdir_p(UNREAL_INCLUDE_PATH) + shutil.copy(os.path.join(SCRIPT_PATH, 'include', 'discord_rpc.h'), UNREAL_INCLUDE_PATH) + + if sys.platform.startswith('win'): + LIBRARY_NAME = 'discord-rpc.lib' + BUILD_64_BASE_PATH = os.path.join(SCRIPT_PATH, 'builds', 'win64-dynamic', 'src', 'Release') + UNREAL_64_DLL_PATH = os.path.join(UNREAL_PROJECT_PATH, 'Source', 'ThirdParty', 'DiscordRpcLibrary', 'Win64') + BUILDS.append({BUILD_64_BASE_PATH: UNREAL_64_DLL_PATH}) + + BUILD_32_BASE_PATH = os.path.join(SCRIPT_PATH, 'builds', 'win32-dynamic', 'src', 'Release') + UNREAL_32_DLL_PATH = os.path.join(UNREAL_PROJECT_PATH, 'Source', 'ThirdParty', 'DiscordRpcLibrary', 'Win32') + BUILDS.append({BUILD_32_BASE_PATH: UNREAL_32_DLL_PATH}) + + elif sys.platform == 'darwin': + LIBRARY_NAME = 'libdiscord-rpc.dylib' + BUILD_BASE_PATH = os.path.join(SCRIPT_PATH, 'builds', 'osx-dynamic', 'src') + UNREAL_DLL_PATH = os.path.join(UNREAL_PROJECT_PATH, 'Source', 'ThirdParty', 'DiscordRpcLibrary', 'Mac') + + BUILDS.append({BUILD_BASE_PATH: UNREAL_DLL_PATH}) + + elif sys.platform.startswith('linux'): + LIBRARY_NAME = 'libdiscord-rpc.so' + BUILD_BASE_PATH = os.path.join(SCRIPT_PATH, 'builds', 'linux-dynamic', 'src') + UNREAL_DLL_PATH = os.path.join(UNREAL_PROJECT_PATH, 'Source', 'ThirdParty', 'DiscordRpcLibrary', 'Linux') + + BUILDS.append({BUILD_BASE_PATH: UNREAL_DLL_PATH}) + + else: + raise Exception('Unsupported platform ' + sys.platform) + + for build in BUILDS: + for i in build: + mkdir_p(build[i]) + shutil.copy(os.path.join(i, LIBRARY_NAME), build[i]) + + +def build_lib(build_name, generator, options, just_release): + """ Create a dir under builds, run build and install in it """ + build_path = os.path.join(SCRIPT_PATH, 'builds', build_name) + install_path = os.path.join(INSTALL_ROOT, build_name) + mkdir_p(build_path) + mkdir_p(install_path) + with cd(build_path): + initial_cmake = ['cmake', SCRIPT_PATH, '-DCMAKE_INSTALL_PREFIX=%s' % os.path.join('..', 'install', build_name)] + if generator: + initial_cmake.extend(['-G', generator]) + for key in options: + val = options[key] + if type(val) is bool: + val = 'ON' if val else 'OFF' + initial_cmake.append('-D%s=%s' % (key, val)) + click.echo('--- Building ' + build_name) + subprocess.check_call(initial_cmake) + if not just_release: + subprocess.check_call(['cmake', '--build', '.', '--config', 'Debug']) + subprocess.check_call(['cmake', '--build', '.', '--config', 'Release', '--target', 'install']) + + +@cli.command() +def archive(): + """ create zip of install dir """ + click.echo('--- Archiving') + archive_file_path = os.path.join(SCRIPT_PATH, 'builds', 'discord-rpc-%s.zip' % get_platform()) + archive_file = zipfile.ZipFile(archive_file_path, 'w', zipfile.ZIP_DEFLATED) + archive_src_base_path = INSTALL_ROOT + archive_dst_base_path = 'discord-rpc' + with cd(archive_src_base_path): + for path, _, filenames in os.walk('.'): + for fname in filenames: + fpath = os.path.join(path, fname) + dst_path = os.path.normpath(os.path.join(archive_dst_base_path, fpath)) + click.echo('Adding ' + dst_path) + archive_file.write(fpath, dst_path) + + +@cli.command() +def sign(): + """ Do code signing within install directory using our cert """ + tool = get_signtool() + signable_extensions = set() + if PLATFORM == 'win': + signable_extensions.add('.dll') + sign_command_base = [ + tool, + 'sign', + '/n', + 'Discord Inc.', + '/a', + '/tr', + 'http://timestamp.digicert.com/rfc3161', + '/as', + '/td', + 'sha256', + '/fd', + 'sha256', + ] + elif PLATFORM == 'osx': + signable_extensions.add('.dylib') + sign_command_base = [ + tool, + '--keychain', + os.path.expanduser('~/Library/Keychains/login.keychain'), + '-vvvv', + '--deep', + '--force', + '--sign', + 'Developer ID Application: Hammer & Chisel Inc. (53Q6R32WPB)', + ] + else: + click.secho('Not signing things on this platform yet', fg='red') + return + + click.echo('--- Signing') + for path, _, filenames in os.walk(INSTALL_ROOT): + for fname in filenames: + ext = os.path.splitext(fname)[1] + if ext not in signable_extensions: + continue + fpath = os.path.join(path, fname) + click.echo('Sign ' + fpath) + sign_command = sign_command_base + [fpath] + subprocess.check_call(sign_command) + + +@cli.command() +@click.option('--clean', is_flag=True) +@click.option('--static', is_flag=True) +@click.option('--shared', is_flag=True) +@click.option('--skip_formatter', is_flag=True) +@click.option('--just_release', is_flag=True) +def libs(clean, static, shared, skip_formatter, just_release): + """ Do all the builds for this platform """ + if clean: + shutil.rmtree('builds', ignore_errors=True) + + mkdir_p('builds') + + if not (static or shared): + static = True + shared = True + + static_options = {} + dynamic_options = { + 'BUILD_SHARED_LIBS': True, + 'USE_STATIC_CRT': True, + } + + if skip_formatter or IS_BUILD_MACHINE: + static_options['CLANG_FORMAT_SUFFIX'] = 'none' + dynamic_options['CLANG_FORMAT_SUFFIX'] = 'none' + + if IS_BUILD_MACHINE: + just_release = True + static_options['WARNINGS_AS_ERRORS'] = True + dynamic_options['WARNINGS_AS_ERRORS'] = True + + if PLATFORM == 'win': + generator32 = 'Visual Studio 14 2015' + generator64 = 'Visual Studio 14 2015 Win64' + if static: + build_lib('win32-static', generator32, static_options, just_release) + build_lib('win64-static', generator64, static_options, just_release) + if shared: + build_lib('win32-dynamic', generator32, dynamic_options, just_release) + build_lib('win64-dynamic', generator64, dynamic_options, just_release) + elif PLATFORM == 'osx': + if static: + build_lib('osx-static', None, static_options, just_release) + if shared: + build_lib('osx-dynamic', None, dynamic_options, just_release) + elif PLATFORM == 'linux': + if static: + build_lib('linux-static', None, static_options, just_release) + if shared: + build_lib('linux-dynamic', None, dynamic_options, just_release) + + +if __name__ == '__main__': + os.chdir(SCRIPT_PATH) + sys.exit(cli()) diff --git a/Externals/discord-rpc/include/discord_register.h b/Externals/discord-rpc/include/discord_register.h index 4c16b68a7f..16fb42f328 100644 --- a/Externals/discord-rpc/include/discord_register.h +++ b/Externals/discord-rpc/include/discord_register.h @@ -1,17 +1,17 @@ #pragma once #if defined(DISCORD_DYNAMIC_LIB) -# if defined(_WIN32) -# if defined(DISCORD_BUILDING_SDK) -# define DISCORD_EXPORT __declspec(dllexport) -# else -# define DISCORD_EXPORT __declspec(dllimport) -# endif -# else -# define DISCORD_EXPORT __attribute__((visibility("default"))) -# endif +#if defined(_WIN32) +#if defined(DISCORD_BUILDING_SDK) +#define DISCORD_EXPORT __declspec(dllexport) #else -# define DISCORD_EXPORT +#define DISCORD_EXPORT __declspec(dllimport) +#endif +#else +#define DISCORD_EXPORT __attribute__((visibility("default"))) +#endif +#else +#define DISCORD_EXPORT #endif #ifdef __cplusplus diff --git a/Externals/discord-rpc/lib/discord-rpc.lib b/Externals/discord-rpc/lib/discord-rpc.lib deleted file mode 100644 index fdf4abe6d03feb1c232a9fe2a9e7da100a6d4e4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3622 zcmcImPfrs;6n||g#Vsfi^=48cikb+eu+=7Nij+tL6w;Op2bN`bg^k-k*_N1iz#Av; zd;_8vzJUn`K7b}(ypU+(7vKxvo6gL3ce-sU$RuxP=e;-cn|bqlGc)>9wY8ns(qznA zrsTwQDn1oYCB6DMYs!vcQv!gy0O15c!~z&N1d#Tq44wcqB!@N1&=D1B0PQHzQz}DA z)T2meRH8cSbw$Z8udd{aN@l(=m(Q*iSMrK(*0hSPKeMYEC`xW^X{pr-KDoT8PjO)_ zx2R-hi?fiSBPiLjSvOV7{Al1nW~r+97`Upivs>3IAIgHKqvn43-SV7jSzD_1z9#s3 zOx%C1s;hNl)i!EISrg|W7;)t5 zlQ*`_THUZ)hGuHfuTVGC(p$A8E|rhdwD-!#WSkRqQyN4LB4p25 zC{O!il8^>nn9lunWyEB{AMq(7hI|m4SEmRqw7bW*4RQ>T`#i|>QWnPVeLtW3uk<0} yh241W>s|!?uRGfBLUmpeS4ZSefS5O1#&Mky7ozY;xmH~A+Rdm?Qk3-o diff --git a/Externals/discord-rpc/lib/libdiscord-rpc.dylib b/Externals/discord-rpc/lib/libdiscord-rpc.dylib deleted file mode 100644 index b48f5616cdb89650f856aa74124ecfd4624d8620..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 260256 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 +#include +#include +#include + +struct Backoff { + int64_t minAmount; + int64_t maxAmount; + int64_t current; + int fails; + std::mt19937_64 randGenerator; + std::uniform_real_distribution<> randDistribution; + + double rand01() { return randDistribution(randGenerator); } + + Backoff(int64_t min, int64_t max) + : minAmount(min) + , maxAmount(max) + , current(min) + , fails(0) + , randGenerator((uint64_t)time(0)) + { + } + + void reset() + { + fails = 0; + current = minAmount; + } + + int64_t nextDelay() + { + ++fails; + int64_t delay = (int64_t)((double)current * 2.0 * rand01()); + current = std::min(current + delay, maxAmount); + return current; + } +}; diff --git a/Externals/discord-rpc/src/connection.h b/Externals/discord-rpc/src/connection.h new file mode 100644 index 0000000000..a8f99b9f10 --- /dev/null +++ b/Externals/discord-rpc/src/connection.h @@ -0,0 +1,19 @@ +#pragma once + +// This is to wrap the platform specific kinds of connect/read/write. + +#include +#include + +// not really connectiony, but need per-platform +int GetProcessId(); + +struct BaseConnection { + static BaseConnection* Create(); + static void Destroy(BaseConnection*&); + bool isOpen{false}; + bool Open(); + bool Close(); + bool Write(const void* data, size_t length); + bool Read(void* data, size_t length); +}; diff --git a/Externals/discord-rpc/src/connection_unix.cpp b/Externals/discord-rpc/src/connection_unix.cpp new file mode 100644 index 0000000000..6fe359ea4f --- /dev/null +++ b/Externals/discord-rpc/src/connection_unix.cpp @@ -0,0 +1,122 @@ +#include "connection.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +int GetProcessId() +{ + return ::getpid(); +} + +struct BaseConnectionUnix : public BaseConnection { + int sock{-1}; +}; + +static BaseConnectionUnix Connection; +static sockaddr_un PipeAddr{}; +#ifdef MSG_NOSIGNAL +static int MsgFlags = MSG_NOSIGNAL; +#else +static int MsgFlags = 0; +#endif + +static const char* GetTempPath() +{ + const char* temp = getenv("XDG_RUNTIME_DIR"); + temp = temp ? temp : getenv("TMPDIR"); + temp = temp ? temp : getenv("TMP"); + temp = temp ? temp : getenv("TEMP"); + temp = temp ? temp : "/tmp"; + return temp; +} + +/*static*/ BaseConnection* BaseConnection::Create() +{ + PipeAddr.sun_family = AF_UNIX; + return &Connection; +} + +/*static*/ void BaseConnection::Destroy(BaseConnection*& c) +{ + auto self = reinterpret_cast(c); + self->Close(); + c = nullptr; +} + +bool BaseConnection::Open() +{ + const char* tempPath = GetTempPath(); + auto self = reinterpret_cast(this); + self->sock = socket(AF_UNIX, SOCK_STREAM, 0); + if (self->sock == -1) { + return false; + } + fcntl(self->sock, F_SETFL, O_NONBLOCK); +#ifdef SO_NOSIGPIPE + int optval = 1; + setsockopt(self->sock, SOL_SOCKET, SO_NOSIGPIPE, &optval, sizeof(optval)); +#endif + + for (int pipeNum = 0; pipeNum < 10; ++pipeNum) { + snprintf( + PipeAddr.sun_path, sizeof(PipeAddr.sun_path), "%s/discord-ipc-%d", tempPath, pipeNum); + int err = connect(self->sock, (const sockaddr*)&PipeAddr, sizeof(PipeAddr)); + if (err == 0) { + self->isOpen = true; + return true; + } + } + self->Close(); + return false; +} + +bool BaseConnection::Close() +{ + auto self = reinterpret_cast(this); + if (self->sock == -1) { + return false; + } + close(self->sock); + self->sock = -1; + self->isOpen = false; + return true; +} + +bool BaseConnection::Write(const void* data, size_t length) +{ + auto self = reinterpret_cast(this); + + if (self->sock == -1) { + return false; + } + + ssize_t sentBytes = send(self->sock, data, length, MsgFlags); + if (sentBytes < 0) { + Close(); + } + return sentBytes == (ssize_t)length; +} + +bool BaseConnection::Read(void* data, size_t length) +{ + auto self = reinterpret_cast(this); + + if (self->sock == -1) { + return false; + } + + int res = (int)recv(self->sock, data, length, MsgFlags); + if (res < 0) { + if (errno == EAGAIN) { + return false; + } + Close(); + } + return res == (int)length; +} diff --git a/Externals/discord-rpc/src/connection_win.cpp b/Externals/discord-rpc/src/connection_win.cpp new file mode 100644 index 0000000000..2dd2750c06 --- /dev/null +++ b/Externals/discord-rpc/src/connection_win.cpp @@ -0,0 +1,128 @@ +#include "connection.h" + +#define WIN32_LEAN_AND_MEAN +#define NOMCX +#define NOSERVICE +#define NOIME +#include +#include + +int GetProcessId() +{ + return (int)::GetCurrentProcessId(); +} + +struct BaseConnectionWin : public BaseConnection { + HANDLE pipe{INVALID_HANDLE_VALUE}; +}; + +static BaseConnectionWin Connection; + +/*static*/ BaseConnection* BaseConnection::Create() +{ + return &Connection; +} + +/*static*/ void BaseConnection::Destroy(BaseConnection*& c) +{ + auto self = reinterpret_cast(c); + self->Close(); + c = nullptr; +} + +bool BaseConnection::Open() +{ + wchar_t pipeName[]{L"\\\\?\\pipe\\discord-ipc-0"}; + const size_t pipeDigit = sizeof(pipeName) / sizeof(wchar_t) - 2; + pipeName[pipeDigit] = L'0'; + auto self = reinterpret_cast(this); + for (;;) { + self->pipe = ::CreateFileW( + pipeName, GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, 0, nullptr); + if (self->pipe != INVALID_HANDLE_VALUE) { + self->isOpen = true; + return true; + } + + auto lastError = GetLastError(); + if (lastError == ERROR_FILE_NOT_FOUND) { + if (pipeName[pipeDigit] < L'9') { + pipeName[pipeDigit]++; + continue; + } + } + else if (lastError == ERROR_PIPE_BUSY) { + if (!WaitNamedPipeW(pipeName, 10000)) { + return false; + } + continue; + } + return false; + } +} + +bool BaseConnection::Close() +{ + auto self = reinterpret_cast(this); + ::CloseHandle(self->pipe); + self->pipe = INVALID_HANDLE_VALUE; + self->isOpen = false; + return true; +} + +bool BaseConnection::Write(const void* data, size_t length) +{ + if (length == 0) { + return true; + } + auto self = reinterpret_cast(this); + assert(self); + if (!self) { + return false; + } + if (self->pipe == INVALID_HANDLE_VALUE) { + return false; + } + assert(data); + if (!data) { + return false; + } + const DWORD bytesLength = (DWORD)length; + DWORD bytesWritten = 0; + return ::WriteFile(self->pipe, data, bytesLength, &bytesWritten, nullptr) == TRUE && + bytesWritten == bytesLength; +} + +bool BaseConnection::Read(void* data, size_t length) +{ + assert(data); + if (!data) { + return false; + } + auto self = reinterpret_cast(this); + assert(self); + if (!self) { + return false; + } + if (self->pipe == INVALID_HANDLE_VALUE) { + return false; + } + DWORD bytesAvailable = 0; + if (::PeekNamedPipe(self->pipe, nullptr, 0, nullptr, &bytesAvailable, nullptr)) { + if (bytesAvailable >= length) { + DWORD bytesToRead = (DWORD)length; + DWORD bytesRead = 0; + if (::ReadFile(self->pipe, data, bytesToRead, &bytesRead, nullptr) == TRUE) { + assert(bytesToRead == bytesRead); + return true; + } + else { + Close(); + } + } + } + else { + Close(); + } + return false; +} diff --git a/Externals/discord-rpc/src/discord-rpc.vcxproj b/Externals/discord-rpc/src/discord-rpc.vcxproj new file mode 100644 index 0000000000..971b47ffc1 --- /dev/null +++ b/Externals/discord-rpc/src/discord-rpc.vcxproj @@ -0,0 +1,93 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {4482FD2A-EC43-3FFB-AC20-2E5C54B05EAD} + 10.0.15063.0 + Win32Proj + x64 + discord-rpc + + + + StaticLibrary + v141 + Unicode + + + + + + + + + + + + <_ProjectFileVersion>10.0.20506.1 + + + + ..\include;..\thirdparty\include;%(AdditionalIncludeDirectories) + + + WIN32;_WINDOWS;_DEBUG;DISCORD_WINDOWS;%(PreprocessorDefinitions) + ..\include;..\thirdparty\rapidjson-1.1.0\include;%(AdditionalIncludeDirectories) + + + ..\include;..\thirdparty\rapidjson-1.1.0\include;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + + + + ..\include;..\thirdparty\include;%(AdditionalIncludeDirectories) + + + + + WIN32;_WINDOWS;NDEBUG;DISCORD_WINDOWS;CMAKE_INTDIR=\"Release\";%(PreprocessorDefinitions) + ..\include;..\thirdparty\rapidjson-1.1.0\include;%(AdditionalIncludeDirectories) + + + ..\include;..\thirdparty\rapidjson-1.1.0\include;%(AdditionalIncludeDirectories) + $(ProjectDir)/$(IntDir) + %(Filename).h + %(Filename).tlb + %(Filename)_i.c + %(Filename)_p.c + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Externals/discord-rpc/src/discord_register_linux.cpp b/Externals/discord-rpc/src/discord_register_linux.cpp new file mode 100644 index 0000000000..b10f96db66 --- /dev/null +++ b/Externals/discord-rpc/src/discord_register_linux.cpp @@ -0,0 +1,100 @@ +#include "discord_rpc.h" +#include "discord_register.h" +#include + +#include +#include +#include +#include +#include +#include + +static bool Mkdir(const char* path) +{ + int result = mkdir(path, 0755); + if (result == 0) { + return true; + } + if (errno == EEXIST) { + return true; + } + return false; +} + +// we want to register games so we can run them from Discord client as discord-:// +extern "C" DISCORD_EXPORT void Discord_Register(const char* applicationId, const char* command) +{ + // Add a desktop file and update some mime handlers so that xdg-open does the right thing. + + const char* home = getenv("HOME"); + if (!home) { + return; + } + + char exePath[1024]; + if (!command || !command[0]) { + if (readlink("/proc/self/exe", exePath, sizeof(exePath)) <= 0) { + return; + } + command = exePath; + } + + const char* destopFileFormat = "[Desktop Entry]\n" + "Name=Game %s\n" + "Exec=%s %%u\n" // note: it really wants that %u in there + "Type=Application\n" + "NoDisplay=true\n" + "Categories=Discord;Games;\n" + "MimeType=x-scheme-handler/discord-%s;\n"; + char desktopFile[2048]; + int fileLen = snprintf( + desktopFile, sizeof(desktopFile), destopFileFormat, applicationId, command, applicationId); + if (fileLen <= 0) { + return; + } + + char desktopFilename[256]; + snprintf(desktopFilename, sizeof(desktopFilename), "/discord-%s.desktop", applicationId); + + char desktopFilePath[1024]; + snprintf(desktopFilePath, sizeof(desktopFilePath), "%s/.local", home); + if (!Mkdir(desktopFilePath)) { + return; + } + strcat(desktopFilePath, "/share"); + if (!Mkdir(desktopFilePath)) { + return; + } + strcat(desktopFilePath, "/applications"); + if (!Mkdir(desktopFilePath)) { + return; + } + strcat(desktopFilePath, desktopFilename); + + FILE* fp = fopen(desktopFilePath, "w"); + if (fp) { + fwrite(desktopFile, 1, fileLen, fp); + fclose(fp); + } + else { + return; + } + + char xdgMimeCommand[1024]; + snprintf(xdgMimeCommand, + sizeof(xdgMimeCommand), + "xdg-mime default discord-%s.desktop x-scheme-handler/discord-%s", + applicationId, + applicationId); + if (system(xdgMimeCommand) < 0) { + fprintf(stderr, "Failed to register mime handler\n"); + } +} + +extern "C" DISCORD_EXPORT void Discord_RegisterSteamGame(const char* applicationId, + const char* steamId) +{ + char command[256]; + sprintf(command, "xdg-open steam://rungameid/%s", steamId); + Discord_Register(applicationId, command); +} diff --git a/Externals/discord-rpc/src/discord_register_osx.m b/Externals/discord-rpc/src/discord_register_osx.m new file mode 100644 index 0000000000..d710102865 --- /dev/null +++ b/Externals/discord-rpc/src/discord_register_osx.m @@ -0,0 +1,80 @@ +#include +#include + +#import + +#include "discord_register.h" + +static void RegisterCommand(const char* applicationId, const char* command) +{ + // There does not appear to be a way to register arbitrary commands on OSX, so instead we'll save the command + // to a file in the Discord config path, and when it is needed, Discord can try to load the file there, open + // the command therein (will pass to js's window.open, so requires a url-like thing) + + // Note: will not work for sandboxed apps + NSString *home = NSHomeDirectory(); + if (!home) { + return; + } + + NSString *path = [[[[[[home stringByAppendingPathComponent:@"Library"] + stringByAppendingPathComponent:@"Application Support"] + stringByAppendingPathComponent:@"discord"] + stringByAppendingPathComponent:@"games"] + stringByAppendingPathComponent:[NSString stringWithUTF8String:applicationId]] + stringByAppendingPathExtension:@"json"]; + [[NSFileManager defaultManager] createDirectoryAtPath:[path stringByDeletingLastPathComponent] withIntermediateDirectories:YES attributes:nil error:nil]; + + NSString *jsonBuffer = [NSString stringWithFormat:@"{\"command\": \"%s\"}", command]; + [jsonBuffer writeToFile:path atomically:NO encoding:NSUTF8StringEncoding error:nil]; +} + +static void RegisterURL(const char* applicationId) +{ + char url[256]; + snprintf(url, sizeof(url), "discord-%s", applicationId); + CFStringRef cfURL = CFStringCreateWithCString(NULL, url, kCFStringEncodingUTF8); + + NSString* myBundleId = [[NSBundle mainBundle] bundleIdentifier]; + if (!myBundleId) { + fprintf(stderr, "No bundle id found\n"); + return; + } + + NSURL* myURL = [[NSBundle mainBundle] bundleURL]; + if (!myURL) { + fprintf(stderr, "No bundle url found\n"); + return; + } + + OSStatus status = LSSetDefaultHandlerForURLScheme(cfURL, (__bridge CFStringRef)myBundleId); + if (status != noErr) { + fprintf(stderr, "Error in LSSetDefaultHandlerForURLScheme: %d\n", (int)status); + return; + } + + status = LSRegisterURL((__bridge CFURLRef)myURL, true); + if (status != noErr) { + fprintf(stderr, "Error in LSRegisterURL: %d\n", (int)status); + } +} + +void Discord_Register(const char* applicationId, const char* command) +{ + if (command) { + RegisterCommand(applicationId, command); + } + else { + // raii lite + @autoreleasepool { + RegisterURL(applicationId); + } + } +} + +void Discord_RegisterSteamGame(const char* applicationId, const char* steamId) +{ + char command[256]; + snprintf(command, 256, "steam://rungameid/%s", steamId); + Discord_Register(applicationId, command); +} diff --git a/Externals/discord-rpc/src/discord_register_win.cpp b/Externals/discord-rpc/src/discord_register_win.cpp new file mode 100644 index 0000000000..e441318dd5 --- /dev/null +++ b/Externals/discord-rpc/src/discord_register_win.cpp @@ -0,0 +1,185 @@ +#include "discord_rpc.h" +#include "discord_register.h" + +#define WIN32_LEAN_AND_MEAN +#define NOMCX +#define NOSERVICE +#define NOIME +#include +#include +#include +#include + +/** + * Updated fixes for MinGW and WinXP + * This block is written the way it does not involve changing the rest of the code + * Checked to be compiling + * 1) strsafe.h belongs to Windows SDK and cannot be added to MinGW + * #include guarded, functions redirected to substitutes + * 2) RegSetKeyValueW and LSTATUS are not declared in + * The entire function is rewritten + */ +#ifdef __MINGW32__ +/// strsafe.h fixes +static HRESULT StringCbPrintfW(LPWSTR pszDest, size_t cbDest, LPCWSTR pszFormat, ...) +{ + HRESULT ret; + va_list va; + va_start(va, pszFormat); + cbDest /= 2; // Size is divided by 2 to convert from bytes to wide characters - causes segfault + // othervise + ret = vsnwprintf(pszDest, cbDest, pszFormat, va); + pszDest[cbDest - 1] = 0; // Terminate the string in case a buffer overflow; -1 will be returned + va_end(va); + return ret; +} +#else +#include +#endif // __MINGW32__ + +/// winreg.h fixes +#ifndef LSTATUS +#define LSTATUS LONG +#endif +#ifdef RegSetKeyValueW +#undefine RegSetKeyValueW +#endif +#define RegSetKeyValueW regset +static LSTATUS regset(HKEY hkey, + LPCWSTR subkey, + LPCWSTR name, + DWORD type, + const void* data, + DWORD len) +{ + HKEY htkey = hkey, hsubkey = nullptr; + LSTATUS ret; + if (subkey && subkey[0]) { + if ((ret = RegCreateKeyExW(hkey, subkey, 0, 0, 0, KEY_ALL_ACCESS, 0, &hsubkey, 0)) != + ERROR_SUCCESS) + return ret; + htkey = hsubkey; + } + ret = RegSetValueExW(htkey, name, 0, type, (const BYTE*)data, len); + if (hsubkey && hsubkey != hkey) + RegCloseKey(hsubkey); + return ret; +} + +static void Discord_RegisterW(const wchar_t* applicationId, const wchar_t* command) +{ + // https://msdn.microsoft.com/en-us/library/aa767914(v=vs.85).aspx + // we want to register games so we can run them as discord-:// + // Update the HKEY_CURRENT_USER, because it doesn't seem to require special permissions. + + wchar_t exeFilePath[MAX_PATH]; + DWORD exeLen = GetModuleFileNameW(nullptr, exeFilePath, MAX_PATH); + wchar_t openCommand[1024]; + + if (command && command[0]) { + StringCbPrintfW(openCommand, sizeof(openCommand), L"%s", command); + } + else { + // StringCbCopyW(openCommand, sizeof(openCommand), exeFilePath); + StringCbPrintfW(openCommand, sizeof(openCommand), L"%s", exeFilePath); + } + + wchar_t protocolName[64]; + StringCbPrintfW(protocolName, sizeof(protocolName), L"discord-%s", applicationId); + wchar_t protocolDescription[128]; + StringCbPrintfW( + protocolDescription, sizeof(protocolDescription), L"URL:Run game %s protocol", applicationId); + wchar_t urlProtocol = 0; + + wchar_t keyName[256]; + StringCbPrintfW(keyName, sizeof(keyName), L"Software\\Classes\\%s", protocolName); + HKEY key; + auto status = + RegCreateKeyExW(HKEY_CURRENT_USER, keyName, 0, nullptr, 0, KEY_WRITE, nullptr, &key, nullptr); + if (status != ERROR_SUCCESS) { + fprintf(stderr, "Error creating key\n"); + return; + } + DWORD len; + LSTATUS result; + len = (DWORD)lstrlenW(protocolDescription) + 1; + result = + RegSetKeyValueW(key, nullptr, nullptr, REG_SZ, protocolDescription, len * sizeof(wchar_t)); + if (FAILED(result)) { + fprintf(stderr, "Error writing description\n"); + } + + len = (DWORD)lstrlenW(protocolDescription) + 1; + result = RegSetKeyValueW(key, nullptr, L"URL Protocol", REG_SZ, &urlProtocol, sizeof(wchar_t)); + if (FAILED(result)) { + fprintf(stderr, "Error writing description\n"); + } + + result = RegSetKeyValueW( + key, L"DefaultIcon", nullptr, REG_SZ, exeFilePath, (exeLen + 1) * sizeof(wchar_t)); + if (FAILED(result)) { + fprintf(stderr, "Error writing icon\n"); + } + + len = (DWORD)lstrlenW(openCommand) + 1; + result = RegSetKeyValueW( + key, L"shell\\open\\command", nullptr, REG_SZ, openCommand, len * sizeof(wchar_t)); + if (FAILED(result)) { + fprintf(stderr, "Error writing command\n"); + } + RegCloseKey(key); +} + +extern "C" DISCORD_EXPORT void Discord_Register(const char* applicationId, const char* command) +{ + wchar_t appId[32]; + MultiByteToWideChar(CP_UTF8, 0, applicationId, -1, appId, 32); + + wchar_t openCommand[1024]; + const wchar_t* wcommand = nullptr; + if (command && command[0]) { + const auto commandBufferLen = sizeof(openCommand) / sizeof(*openCommand); + MultiByteToWideChar(CP_UTF8, 0, command, -1, openCommand, commandBufferLen); + wcommand = openCommand; + } + + Discord_RegisterW(appId, wcommand); +} + +extern "C" DISCORD_EXPORT void Discord_RegisterSteamGame(const char* applicationId, + const char* steamId) +{ + wchar_t appId[32]; + MultiByteToWideChar(CP_UTF8, 0, applicationId, -1, appId, 32); + + wchar_t wSteamId[32]; + MultiByteToWideChar(CP_UTF8, 0, steamId, -1, wSteamId, 32); + + HKEY key; + auto status = RegOpenKeyExW(HKEY_CURRENT_USER, L"Software\\Valve\\Steam", 0, KEY_READ, &key); + if (status != ERROR_SUCCESS) { + fprintf(stderr, "Error opening Steam key\n"); + return; + } + + wchar_t steamPath[MAX_PATH]; + DWORD pathBytes = sizeof(steamPath); + status = RegQueryValueExW(key, L"SteamExe", nullptr, nullptr, (BYTE*)steamPath, &pathBytes); + RegCloseKey(key); + if (status != ERROR_SUCCESS || pathBytes < 1) { + fprintf(stderr, "Error reading SteamExe key\n"); + return; + } + + DWORD pathChars = pathBytes / sizeof(wchar_t); + for (DWORD i = 0; i < pathChars; ++i) { + if (steamPath[i] == L'/') { + steamPath[i] = L'\\'; + } + } + + wchar_t command[1024]; + StringCbPrintfW(command, sizeof(command), L"\"%s\" steam://rungameid/%s", steamPath, wSteamId); + + Discord_RegisterW(appId, command); +} diff --git a/Externals/discord-rpc/src/discord_rpc.cpp b/Externals/discord-rpc/src/discord_rpc.cpp new file mode 100644 index 0000000000..dedb3f1539 --- /dev/null +++ b/Externals/discord-rpc/src/discord_rpc.cpp @@ -0,0 +1,499 @@ +#include "discord_rpc.h" + +#include "backoff.h" +#include "discord_register.h" +#include "msg_queue.h" +#include "rpc_connection.h" +#include "serialization.h" + +#include +#include +#include + +#ifndef DISCORD_DISABLE_IO_THREAD +#include +#include +#endif + +constexpr size_t MaxMessageSize{16 * 1024}; +constexpr size_t MessageQueueSize{8}; +constexpr size_t JoinQueueSize{8}; + +struct QueuedMessage { + size_t length; + char buffer[MaxMessageSize]; + + void Copy(const QueuedMessage& other) + { + length = other.length; + if (length) { + memcpy(buffer, other.buffer, length); + } + } +}; + +struct User { + // snowflake (64bit int), turned into a ascii decimal string, at most 20 chars +1 null + // terminator = 21 + char userId[32]; + // 32 unicode glyphs is max name size => 4 bytes per glyph in the worst case, +1 for null + // terminator = 129 + char username[344]; + // 4 decimal digits + 1 null terminator = 5 + char discriminator[8]; + // optional 'a_' + md5 hex digest (32 bytes) + null terminator = 35 + char avatar[128]; + // Rounded way up because I'm paranoid about games breaking from future changes in these sizes +}; + +static RpcConnection* Connection{nullptr}; +static DiscordEventHandlers QueuedHandlers{}; +static DiscordEventHandlers Handlers{}; +static std::atomic_bool WasJustConnected{false}; +static std::atomic_bool WasJustDisconnected{false}; +static std::atomic_bool GotErrorMessage{false}; +static std::atomic_bool WasJoinGame{false}; +static std::atomic_bool WasSpectateGame{false}; +static char JoinGameSecret[256]; +static char SpectateGameSecret[256]; +static int LastErrorCode{0}; +static char LastErrorMessage[256]; +static int LastDisconnectErrorCode{0}; +static char LastDisconnectErrorMessage[256]; +static std::mutex PresenceMutex; +static std::mutex HandlerMutex; +static QueuedMessage QueuedPresence{}; +static MsgQueue SendQueue; +static MsgQueue JoinAskQueue; +static User connectedUser; + +// We want to auto connect, and retry on failure, but not as fast as possible. This does expoential +// backoff from 0.5 seconds to 1 minute +static Backoff ReconnectTimeMs(500, 60 * 1000); +static auto NextConnect = std::chrono::system_clock::now(); +static int Pid{0}; +static int Nonce{1}; + +#ifndef DISCORD_DISABLE_IO_THREAD +static void Discord_UpdateConnection(void); +class IoThreadHolder { +private: + std::atomic_bool keepRunning{true}; + std::mutex waitForIOMutex; + std::condition_variable waitForIOActivity; + std::thread ioThread; + +public: + void Start() + { + keepRunning.store(true); + ioThread = std::thread([&]() { + const std::chrono::duration maxWait{500LL}; + while (keepRunning.load()) { + Discord_UpdateConnection(); + std::unique_lock lock(waitForIOMutex); + waitForIOActivity.wait_for(lock, maxWait); + } + }); + } + + void Notify() { waitForIOActivity.notify_all(); } + + void Stop() + { + keepRunning.exchange(false); + Notify(); + if (ioThread.joinable()) { + ioThread.join(); + } + } + + ~IoThreadHolder() { Stop(); } +}; +#else +class IoThreadHolder { +public: + void Start() {} + void Stop() {} + void Notify() {} +}; +#endif // DISCORD_DISABLE_IO_THREAD +static IoThreadHolder* IoThread{nullptr}; + +static void UpdateReconnectTime() +{ + NextConnect = std::chrono::system_clock::now() + + std::chrono::duration{ReconnectTimeMs.nextDelay()}; +} + +#ifdef DISCORD_DISABLE_IO_THREAD +extern "C" DISCORD_EXPORT void Discord_UpdateConnection(void) +#else +static void Discord_UpdateConnection(void) +#endif +{ + if (!Connection) { + return; + } + + if (!Connection->IsOpen()) { + if (std::chrono::system_clock::now() >= NextConnect) { + UpdateReconnectTime(); + Connection->Open(); + } + } + else { + // reads + + for (;;) { + JsonDocument message; + + if (!Connection->Read(message)) { + break; + } + + const char* evtName = GetStrMember(&message, "evt"); + const char* nonce = GetStrMember(&message, "nonce"); + + if (nonce) { + // in responses only -- should use to match up response when needed. + + if (evtName && strcmp(evtName, "ERROR") == 0) { + auto data = GetObjMember(&message, "data"); + LastErrorCode = GetIntMember(data, "code"); + StringCopy(LastErrorMessage, GetStrMember(data, "message", "")); + GotErrorMessage.store(true); + } + } + else { + // should have evt == name of event, optional data + if (evtName == nullptr) { + continue; + } + + auto data = GetObjMember(&message, "data"); + + if (strcmp(evtName, "ACTIVITY_JOIN") == 0) { + auto secret = GetStrMember(data, "secret"); + if (secret) { + StringCopy(JoinGameSecret, secret); + WasJoinGame.store(true); + } + } + else if (strcmp(evtName, "ACTIVITY_SPECTATE") == 0) { + auto secret = GetStrMember(data, "secret"); + if (secret) { + StringCopy(SpectateGameSecret, secret); + WasSpectateGame.store(true); + } + } + else if (strcmp(evtName, "ACTIVITY_JOIN_REQUEST") == 0) { + auto user = GetObjMember(data, "user"); + auto userId = GetStrMember(user, "id"); + auto username = GetStrMember(user, "username"); + auto avatar = GetStrMember(user, "avatar"); + auto joinReq = JoinAskQueue.GetNextAddMessage(); + if (userId && username && joinReq) { + StringCopy(joinReq->userId, userId); + StringCopy(joinReq->username, username); + auto discriminator = GetStrMember(user, "discriminator"); + if (discriminator) { + StringCopy(joinReq->discriminator, discriminator); + } + if (avatar) { + StringCopy(joinReq->avatar, avatar); + } + else { + joinReq->avatar[0] = 0; + } + JoinAskQueue.CommitAdd(); + } + } + } + } + + // writes + if (QueuedPresence.length) { + QueuedMessage local; + { + std::lock_guard guard(PresenceMutex); + local.Copy(QueuedPresence); + QueuedPresence.length = 0; + } + if (!Connection->Write(local.buffer, local.length)) { + // if we fail to send, requeue + std::lock_guard guard(PresenceMutex); + QueuedPresence.Copy(local); + } + } + + while (SendQueue.HavePendingSends()) { + auto qmessage = SendQueue.GetNextSendMessage(); + Connection->Write(qmessage->buffer, qmessage->length); + SendQueue.CommitSend(); + } + } +} + +static void SignalIOActivity() +{ + if (IoThread != nullptr) { + IoThread->Notify(); + } +} + +static bool RegisterForEvent(const char* evtName) +{ + auto qmessage = SendQueue.GetNextAddMessage(); + if (qmessage) { + qmessage->length = + JsonWriteSubscribeCommand(qmessage->buffer, sizeof(qmessage->buffer), Nonce++, evtName); + SendQueue.CommitAdd(); + SignalIOActivity(); + return true; + } + return false; +} + +static bool DeregisterForEvent(const char* evtName) +{ + auto qmessage = SendQueue.GetNextAddMessage(); + if (qmessage) { + qmessage->length = + JsonWriteUnsubscribeCommand(qmessage->buffer, sizeof(qmessage->buffer), Nonce++, evtName); + SendQueue.CommitAdd(); + SignalIOActivity(); + return true; + } + return false; +} + +extern "C" DISCORD_EXPORT void Discord_Initialize(const char* applicationId, + DiscordEventHandlers* handlers, + int autoRegister, + const char* optionalSteamId) +{ + IoThread = new (std::nothrow) IoThreadHolder(); + if (IoThread == nullptr) { + return; + } + + if (autoRegister) { + if (optionalSteamId && optionalSteamId[0]) { + Discord_RegisterSteamGame(applicationId, optionalSteamId); + } + else { + Discord_Register(applicationId, nullptr); + } + } + + Pid = GetProcessId(); + + { + std::lock_guard guard(HandlerMutex); + + if (handlers) { + QueuedHandlers = *handlers; + } + else { + QueuedHandlers = {}; + } + + Handlers = {}; + } + + if (Connection) { + return; + } + + Connection = RpcConnection::Create(applicationId); + Connection->onConnect = [](JsonDocument& readyMessage) { + Discord_UpdateHandlers(&QueuedHandlers); + auto data = GetObjMember(&readyMessage, "data"); + auto user = GetObjMember(data, "user"); + auto userId = GetStrMember(user, "id"); + auto username = GetStrMember(user, "username"); + auto avatar = GetStrMember(user, "avatar"); + if (userId && username) { + StringCopy(connectedUser.userId, userId); + StringCopy(connectedUser.username, username); + auto discriminator = GetStrMember(user, "discriminator"); + if (discriminator) { + StringCopy(connectedUser.discriminator, discriminator); + } + if (avatar) { + StringCopy(connectedUser.avatar, avatar); + } + else { + connectedUser.avatar[0] = 0; + } + } + WasJustConnected.exchange(true); + ReconnectTimeMs.reset(); + }; + Connection->onDisconnect = [](int err, const char* message) { + LastDisconnectErrorCode = err; + StringCopy(LastDisconnectErrorMessage, message); + { + std::lock_guard guard(HandlerMutex); + Handlers = {}; + } + WasJustDisconnected.exchange(true); + UpdateReconnectTime(); + }; + + IoThread->Start(); +} + +extern "C" DISCORD_EXPORT void Discord_Shutdown(void) +{ + if (!Connection) { + return; + } + Connection->onConnect = nullptr; + Connection->onDisconnect = nullptr; + Handlers = {}; + if (IoThread != nullptr) { + IoThread->Stop(); + delete IoThread; + IoThread = nullptr; + } + + RpcConnection::Destroy(Connection); +} + +extern "C" DISCORD_EXPORT void Discord_UpdatePresence(const DiscordRichPresence* presence) +{ + { + std::lock_guard guard(PresenceMutex); + QueuedPresence.length = JsonWriteRichPresenceObj( + QueuedPresence.buffer, sizeof(QueuedPresence.buffer), Nonce++, Pid, presence); + } + SignalIOActivity(); +} + +extern "C" DISCORD_EXPORT void Discord_ClearPresence(void) +{ + Discord_UpdatePresence(nullptr); +} + +extern "C" DISCORD_EXPORT void Discord_Respond(const char* userId, /* DISCORD_REPLY_ */ int reply) +{ + // if we are not connected, let's not batch up stale messages for later + if (!Connection || !Connection->IsOpen()) { + return; + } + auto qmessage = SendQueue.GetNextAddMessage(); + if (qmessage) { + qmessage->length = + JsonWriteJoinReply(qmessage->buffer, sizeof(qmessage->buffer), userId, reply, Nonce++); + SendQueue.CommitAdd(); + SignalIOActivity(); + } +} + +extern "C" DISCORD_EXPORT void Discord_RunCallbacks(void) +{ + // Note on some weirdness: internally we might connect, get other signals, disconnect any number + // of times inbetween calls here. Externally, we want the sequence to seem sane, so any other + // signals are book-ended by calls to ready and disconnect. + + if (!Connection) { + return; + } + + bool wasDisconnected = WasJustDisconnected.exchange(false); + bool isConnected = Connection->IsOpen(); + + if (isConnected) { + // if we are connected, disconnect cb first + std::lock_guard guard(HandlerMutex); + if (wasDisconnected && Handlers.disconnected) { + Handlers.disconnected(LastDisconnectErrorCode, LastDisconnectErrorMessage); + } + } + + if (WasJustConnected.exchange(false)) { + std::lock_guard guard(HandlerMutex); + if (Handlers.ready) { + DiscordUser du{connectedUser.userId, + connectedUser.username, + connectedUser.discriminator, + connectedUser.avatar}; + Handlers.ready(&du); + } + } + + if (GotErrorMessage.exchange(false)) { + std::lock_guard guard(HandlerMutex); + if (Handlers.errored) { + Handlers.errored(LastErrorCode, LastErrorMessage); + } + } + + if (WasJoinGame.exchange(false)) { + std::lock_guard guard(HandlerMutex); + if (Handlers.joinGame) { + Handlers.joinGame(JoinGameSecret); + } + } + + if (WasSpectateGame.exchange(false)) { + std::lock_guard guard(HandlerMutex); + if (Handlers.spectateGame) { + Handlers.spectateGame(SpectateGameSecret); + } + } + + // Right now this batches up any requests and sends them all in a burst; I could imagine a world + // where the implementer would rather sequentially accept/reject each one before the next invite + // is sent. I left it this way because I could also imagine wanting to process these all and + // maybe show them in one common dialog and/or start fetching the avatars in parallel, and if + // not it should be trivial for the implementer to make a queue themselves. + while (JoinAskQueue.HavePendingSends()) { + auto req = JoinAskQueue.GetNextSendMessage(); + { + std::lock_guard guard(HandlerMutex); + if (Handlers.joinRequest) { + DiscordUser du{req->userId, req->username, req->discriminator, req->avatar}; + Handlers.joinRequest(&du); + } + } + JoinAskQueue.CommitSend(); + } + + if (!isConnected) { + // if we are not connected, disconnect message last + std::lock_guard guard(HandlerMutex); + if (wasDisconnected && Handlers.disconnected) { + Handlers.disconnected(LastDisconnectErrorCode, LastDisconnectErrorMessage); + } + } +} + +extern "C" DISCORD_EXPORT void Discord_UpdateHandlers(DiscordEventHandlers* newHandlers) +{ + if (newHandlers) { +#define HANDLE_EVENT_REGISTRATION(handler_name, event) \ + if (!Handlers.handler_name && newHandlers->handler_name) { \ + RegisterForEvent(event); \ + } \ + else if (Handlers.handler_name && !newHandlers->handler_name) { \ + DeregisterForEvent(event); \ + } + + std::lock_guard guard(HandlerMutex); + HANDLE_EVENT_REGISTRATION(joinGame, "ACTIVITY_JOIN") + HANDLE_EVENT_REGISTRATION(spectateGame, "ACTIVITY_SPECTATE") + HANDLE_EVENT_REGISTRATION(joinRequest, "ACTIVITY_JOIN_REQUEST") + +#undef HANDLE_EVENT_REGISTRATION + + Handlers = *newHandlers; + } + else { + std::lock_guard guard(HandlerMutex); + Handlers = {}; + } + return; +} diff --git a/Externals/discord-rpc/src/dllmain.cpp b/Externals/discord-rpc/src/dllmain.cpp new file mode 100644 index 0000000000..fbfc2950d7 --- /dev/null +++ b/Externals/discord-rpc/src/dllmain.cpp @@ -0,0 +1,8 @@ +#include + +// outsmart GCC's missing-declarations warning +BOOL WINAPI DllMain(HMODULE, DWORD, LPVOID); +BOOL WINAPI DllMain(HMODULE, DWORD, LPVOID) +{ + return TRUE; +} diff --git a/Externals/discord-rpc/src/msg_queue.h b/Externals/discord-rpc/src/msg_queue.h new file mode 100644 index 0000000000..77f380e705 --- /dev/null +++ b/Externals/discord-rpc/src/msg_queue.h @@ -0,0 +1,36 @@ +#pragma once + +#include + +// A simple queue. No locks, but only works with a single thread as producer and a single thread as +// a consumer. Mutex up as needed. + +template +class MsgQueue { + ElementType queue_[QueueSize]; + std::atomic_uint nextAdd_{0}; + std::atomic_uint nextSend_{0}; + std::atomic_uint pendingSends_{0}; + +public: + MsgQueue() {} + + ElementType* GetNextAddMessage() + { + // if we are falling behind, bail + if (pendingSends_.load() >= QueueSize) { + return nullptr; + } + auto index = (nextAdd_++) % QueueSize; + return &queue_[index]; + } + void CommitAdd() { ++pendingSends_; } + + bool HavePendingSends() const { return pendingSends_.load() != 0; } + ElementType* GetNextSendMessage() + { + auto index = (nextSend_++) % QueueSize; + return &queue_[index]; + } + void CommitSend() { --pendingSends_; } +}; diff --git a/Externals/discord-rpc/src/rpc_connection.cpp b/Externals/discord-rpc/src/rpc_connection.cpp new file mode 100644 index 0000000000..bf9e4cc7a4 --- /dev/null +++ b/Externals/discord-rpc/src/rpc_connection.cpp @@ -0,0 +1,141 @@ +#include "rpc_connection.h" +#include "serialization.h" + +#include + +static const int RpcVersion = 1; +static RpcConnection Instance; + +/*static*/ RpcConnection* RpcConnection::Create(const char* applicationId) +{ + Instance.connection = BaseConnection::Create(); + StringCopy(Instance.appId, applicationId); + return &Instance; +} + +/*static*/ void RpcConnection::Destroy(RpcConnection*& c) +{ + c->Close(); + BaseConnection::Destroy(c->connection); + c = nullptr; +} + +void RpcConnection::Open() +{ + if (state == State::Connected) { + return; + } + + if (state == State::Disconnected) { + if (connection->Open()) { + } + else { + return; + } + } + + if (state == State::SentHandshake) { + JsonDocument message; + if (Read(message)) { + auto cmd = GetStrMember(&message, "cmd"); + auto evt = GetStrMember(&message, "evt"); + if (cmd && evt && !strcmp(cmd, "DISPATCH") && !strcmp(evt, "READY")) { + state = State::Connected; + if (onConnect) { + onConnect(message); + } + } + } + } + else { + sendFrame.opcode = Opcode::Handshake; + sendFrame.length = (uint32_t)JsonWriteHandshakeObj( + sendFrame.message, sizeof(sendFrame.message), RpcVersion, appId); + + if (connection->Write(&sendFrame, sizeof(MessageFrameHeader) + sendFrame.length)) { + state = State::SentHandshake; + } + else { + Close(); + } + } +} + +void RpcConnection::Close() +{ + if (onDisconnect && (state == State::Connected || state == State::SentHandshake)) { + onDisconnect(lastErrorCode, lastErrorMessage); + } + connection->Close(); + state = State::Disconnected; +} + +bool RpcConnection::Write(const void* data, size_t length) +{ + sendFrame.opcode = Opcode::Frame; + memcpy(sendFrame.message, data, length); + sendFrame.length = (uint32_t)length; + if (!connection->Write(&sendFrame, sizeof(MessageFrameHeader) + length)) { + Close(); + return false; + } + return true; +} + +bool RpcConnection::Read(JsonDocument& message) +{ + if (state != State::Connected && state != State::SentHandshake) { + return false; + } + MessageFrame readFrame; + for (;;) { + bool didRead = connection->Read(&readFrame, sizeof(MessageFrameHeader)); + if (!didRead) { + if (!connection->isOpen) { + lastErrorCode = (int)ErrorCode::PipeClosed; + StringCopy(lastErrorMessage, "Pipe closed"); + Close(); + } + return false; + } + + if (readFrame.length > 0) { + didRead = connection->Read(readFrame.message, readFrame.length); + if (!didRead) { + lastErrorCode = (int)ErrorCode::ReadCorrupt; + StringCopy(lastErrorMessage, "Partial data in frame"); + Close(); + return false; + } + readFrame.message[readFrame.length] = 0; + } + + switch (readFrame.opcode) { + case Opcode::Close: { + message.ParseInsitu(readFrame.message); + lastErrorCode = GetIntMember(&message, "code"); + StringCopy(lastErrorMessage, GetStrMember(&message, "message", "")); + Close(); + return false; + } + case Opcode::Frame: + message.ParseInsitu(readFrame.message); + return true; + case Opcode::Ping: + readFrame.opcode = Opcode::Pong; + if (!connection->Write(&readFrame, sizeof(MessageFrameHeader) + readFrame.length)) { + Close(); + } + break; + case Opcode::Pong: + break; + case Opcode::Handshake: + default: + // something bad happened + lastErrorCode = (int)ErrorCode::ReadCorrupt; + StringCopy(lastErrorMessage, "Bad ipc frame"); + Close(); + return false; + } + } +} diff --git a/Externals/discord-rpc/src/rpc_connection.h b/Externals/discord-rpc/src/rpc_connection.h new file mode 100644 index 0000000000..bbdd05c792 --- /dev/null +++ b/Externals/discord-rpc/src/rpc_connection.h @@ -0,0 +1,59 @@ +#pragma once + +#include "connection.h" +#include "serialization.h" + +// I took this from the buffer size libuv uses for named pipes; I suspect ours would usually be much +// smaller. +constexpr size_t MaxRpcFrameSize = 64 * 1024; + +struct RpcConnection { + enum class ErrorCode : int { + Success = 0, + PipeClosed = 1, + ReadCorrupt = 2, + }; + + enum class Opcode : uint32_t { + Handshake = 0, + Frame = 1, + Close = 2, + Ping = 3, + Pong = 4, + }; + + struct MessageFrameHeader { + Opcode opcode; + uint32_t length; + }; + + struct MessageFrame : public MessageFrameHeader { + char message[MaxRpcFrameSize - sizeof(MessageFrameHeader)]; + }; + + enum class State : uint32_t { + Disconnected, + SentHandshake, + AwaitingResponse, + Connected, + }; + + BaseConnection* connection{nullptr}; + State state{State::Disconnected}; + void (*onConnect)(JsonDocument& message){nullptr}; + void (*onDisconnect)(int errorCode, const char* message){nullptr}; + char appId[64]{}; + int lastErrorCode{0}; + char lastErrorMessage[256]{}; + RpcConnection::MessageFrame sendFrame; + + static RpcConnection* Create(const char* applicationId); + static void Destroy(RpcConnection*&); + + inline bool IsOpen() const { return state == State::Connected; } + + void Open(); + void Close(); + bool Write(const void* data, size_t length); + bool Read(JsonDocument& message); +}; diff --git a/Externals/discord-rpc/src/serialization.cpp b/Externals/discord-rpc/src/serialization.cpp new file mode 100644 index 0000000000..6cc1e9013d --- /dev/null +++ b/Externals/discord-rpc/src/serialization.cpp @@ -0,0 +1,245 @@ +#include "serialization.h" +#include "connection.h" +#include "discord_rpc.h" + +template +void NumberToString(char* dest, T number) +{ + if (!number) { + *dest++ = '0'; + *dest++ = 0; + return; + } + if (number < 0) { + *dest++ = '-'; + number = -number; + } + char temp[32]; + int place = 0; + while (number) { + auto digit = number % 10; + number = number / 10; + temp[place++] = '0' + (char)digit; + } + for (--place; place >= 0; --place) { + *dest++ = temp[place]; + } + *dest = 0; +} + +// it's ever so slightly faster to not have to strlen the key +template +void WriteKey(JsonWriter& w, T& k) +{ + w.Key(k, sizeof(T) - 1); +} + +struct WriteObject { + JsonWriter& writer; + WriteObject(JsonWriter& w) + : writer(w) + { + writer.StartObject(); + } + template + WriteObject(JsonWriter& w, T& name) + : writer(w) + { + WriteKey(writer, name); + writer.StartObject(); + } + ~WriteObject() { writer.EndObject(); } +}; + +struct WriteArray { + JsonWriter& writer; + template + WriteArray(JsonWriter& w, T& name) + : writer(w) + { + WriteKey(writer, name); + writer.StartArray(); + } + ~WriteArray() { writer.EndArray(); } +}; + +template +void WriteOptionalString(JsonWriter& w, T& k, const char* value) +{ + if (value && value[0]) { + w.Key(k, sizeof(T) - 1); + w.String(value); + } +} + +static void JsonWriteNonce(JsonWriter& writer, int nonce) +{ + WriteKey(writer, "nonce"); + char nonceBuffer[32]; + NumberToString(nonceBuffer, nonce); + writer.String(nonceBuffer); +} + +size_t JsonWriteRichPresenceObj(char* dest, + size_t maxLen, + int nonce, + int pid, + const DiscordRichPresence* presence) +{ + JsonWriter writer(dest, maxLen); + + { + WriteObject top(writer); + + JsonWriteNonce(writer, nonce); + + WriteKey(writer, "cmd"); + writer.String("SET_ACTIVITY"); + + { + WriteObject args(writer, "args"); + + WriteKey(writer, "pid"); + writer.Int(pid); + + if (presence != nullptr) { + WriteObject activity(writer, "activity"); + + WriteOptionalString(writer, "state", presence->state); + WriteOptionalString(writer, "details", presence->details); + + if (presence->startTimestamp || presence->endTimestamp) { + WriteObject timestamps(writer, "timestamps"); + + if (presence->startTimestamp) { + WriteKey(writer, "start"); + writer.Int64(presence->startTimestamp); + } + + if (presence->endTimestamp) { + WriteKey(writer, "end"); + writer.Int64(presence->endTimestamp); + } + } + + if ((presence->largeImageKey && presence->largeImageKey[0]) || + (presence->largeImageText && presence->largeImageText[0]) || + (presence->smallImageKey && presence->smallImageKey[0]) || + (presence->smallImageText && presence->smallImageText[0])) { + WriteObject assets(writer, "assets"); + WriteOptionalString(writer, "large_image", presence->largeImageKey); + WriteOptionalString(writer, "large_text", presence->largeImageText); + WriteOptionalString(writer, "small_image", presence->smallImageKey); + WriteOptionalString(writer, "small_text", presence->smallImageText); + } + + if ((presence->partyId && presence->partyId[0]) || presence->partySize || + presence->partyMax) { + WriteObject party(writer, "party"); + WriteOptionalString(writer, "id", presence->partyId); + if (presence->partySize && presence->partyMax) { + WriteArray size(writer, "size"); + writer.Int(presence->partySize); + writer.Int(presence->partyMax); + } + } + + if ((presence->matchSecret && presence->matchSecret[0]) || + (presence->joinSecret && presence->joinSecret[0]) || + (presence->spectateSecret && presence->spectateSecret[0])) { + WriteObject secrets(writer, "secrets"); + WriteOptionalString(writer, "match", presence->matchSecret); + WriteOptionalString(writer, "join", presence->joinSecret); + WriteOptionalString(writer, "spectate", presence->spectateSecret); + } + + writer.Key("instance"); + writer.Bool(presence->instance != 0); + } + } + } + + return writer.Size(); +} + +size_t JsonWriteHandshakeObj(char* dest, size_t maxLen, int version, const char* applicationId) +{ + JsonWriter writer(dest, maxLen); + + { + WriteObject obj(writer); + WriteKey(writer, "v"); + writer.Int(version); + WriteKey(writer, "client_id"); + writer.String(applicationId); + } + + return writer.Size(); +} + +size_t JsonWriteSubscribeCommand(char* dest, size_t maxLen, int nonce, const char* evtName) +{ + JsonWriter writer(dest, maxLen); + + { + WriteObject obj(writer); + + JsonWriteNonce(writer, nonce); + + WriteKey(writer, "cmd"); + writer.String("SUBSCRIBE"); + + WriteKey(writer, "evt"); + writer.String(evtName); + } + + return writer.Size(); +} + +size_t JsonWriteUnsubscribeCommand(char* dest, size_t maxLen, int nonce, const char* evtName) +{ + JsonWriter writer(dest, maxLen); + + { + WriteObject obj(writer); + + JsonWriteNonce(writer, nonce); + + WriteKey(writer, "cmd"); + writer.String("UNSUBSCRIBE"); + + WriteKey(writer, "evt"); + writer.String(evtName); + } + + return writer.Size(); +} + +size_t JsonWriteJoinReply(char* dest, size_t maxLen, const char* userId, int reply, int nonce) +{ + JsonWriter writer(dest, maxLen); + + { + WriteObject obj(writer); + + WriteKey(writer, "cmd"); + if (reply == DISCORD_REPLY_YES) { + writer.String("SEND_ACTIVITY_JOIN_INVITE"); + } + else { + writer.String("CLOSE_ACTIVITY_JOIN_REQUEST"); + } + + WriteKey(writer, "args"); + { + WriteObject args(writer); + + WriteKey(writer, "user_id"); + writer.String(userId); + } + + JsonWriteNonce(writer, nonce); + } + + return writer.Size(); +} diff --git a/Externals/discord-rpc/src/serialization.h b/Externals/discord-rpc/src/serialization.h new file mode 100644 index 0000000000..9c462dc283 --- /dev/null +++ b/Externals/discord-rpc/src/serialization.h @@ -0,0 +1,215 @@ +#pragma once + +#include + +#ifndef __MINGW32__ +#pragma warning(push) + +#pragma warning(disable : 4061) // enum is not explicitly handled by a case label +#pragma warning(disable : 4365) // signed/unsigned mismatch +#pragma warning(disable : 4464) // relative include path contains +#pragma warning(disable : 4668) // is not defined as a preprocessor macro +#pragma warning(disable : 6313) // Incorrect operator +#endif // __MINGW32__ + +#include "rapidjson/document.h" +#include "rapidjson/stringbuffer.h" +#include "rapidjson/writer.h" + +#ifndef __MINGW32__ +#pragma warning(pop) +#endif // __MINGW32__ + +// if only there was a standard library function for this +template +inline size_t StringCopy(char (&dest)[Len], const char* src) +{ + if (!src || !Len) { + return 0; + } + size_t copied; + char* out = dest; + for (copied = 1; *src && copied < Len; ++copied) { + *out++ = *src++; + } + *out = 0; + return copied - 1; +} + +size_t JsonWriteHandshakeObj(char* dest, size_t maxLen, int version, const char* applicationId); + +// Commands +struct DiscordRichPresence; +size_t JsonWriteRichPresenceObj(char* dest, + size_t maxLen, + int nonce, + int pid, + const DiscordRichPresence* presence); +size_t JsonWriteSubscribeCommand(char* dest, size_t maxLen, int nonce, const char* evtName); + +size_t JsonWriteUnsubscribeCommand(char* dest, size_t maxLen, int nonce, const char* evtName); + +size_t JsonWriteJoinReply(char* dest, size_t maxLen, const char* userId, int reply, int nonce); + +// I want to use as few allocations as I can get away with, and to do that with RapidJson, you need +// to supply some of your own allocators for stuff rather than use the defaults + +class LinearAllocator { +public: + char* buffer_; + char* end_; + LinearAllocator() + { + assert(0); // needed for some default case in rapidjson, should not use + } + LinearAllocator(char* buffer, size_t size) + : buffer_(buffer) + , end_(buffer + size) + { + } + static const bool kNeedFree = false; + void* Malloc(size_t size) + { + char* res = buffer_; + buffer_ += size; + if (buffer_ > end_) { + buffer_ = res; + return nullptr; + } + return res; + } + void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) + { + if (newSize == 0) { + return nullptr; + } + // allocate how much you need in the first place + assert(!originalPtr && !originalSize); + // unused parameter warning + (void)(originalPtr); + (void)(originalSize); + return Malloc(newSize); + } + static void Free(void* ptr) + { + /* shrug */ + (void)ptr; + } +}; + +template +class FixedLinearAllocator : public LinearAllocator { +public: + char fixedBuffer_[Size]; + FixedLinearAllocator() + : LinearAllocator(fixedBuffer_, Size) + { + } + static const bool kNeedFree = false; +}; + +// wonder why this isn't a thing already, maybe I missed it +class DirectStringBuffer { +public: + using Ch = char; + char* buffer_; + char* end_; + char* current_; + + DirectStringBuffer(char* buffer, size_t maxLen) + : buffer_(buffer) + , end_(buffer + maxLen) + , current_(buffer) + { + } + + void Put(char c) + { + if (current_ < end_) { + *current_++ = c; + } + } + void Flush() {} + size_t GetSize() const { return (size_t)(current_ - buffer_); } +}; + +using MallocAllocator = rapidjson::CrtAllocator; +using PoolAllocator = rapidjson::MemoryPoolAllocator; +using UTF8 = rapidjson::UTF8; +// Writer appears to need about 16 bytes per nested object level (with 64bit size_t) +using StackAllocator = FixedLinearAllocator<2048>; +constexpr size_t WriterNestingLevels = 2048 / (2 * sizeof(size_t)); +using JsonWriterBase = + rapidjson::Writer; +class JsonWriter : public JsonWriterBase { +public: + DirectStringBuffer stringBuffer_; + StackAllocator stackAlloc_; + + JsonWriter(char* dest, size_t maxLen) + : JsonWriterBase(stringBuffer_, &stackAlloc_, WriterNestingLevels) + , stringBuffer_(dest, maxLen) + , stackAlloc_() + { + } + + size_t Size() const { return stringBuffer_.GetSize(); } +}; + +using JsonDocumentBase = rapidjson::GenericDocument; +class JsonDocument : public JsonDocumentBase { +public: + static const int kDefaultChunkCapacity = 32 * 1024; + // json parser will use this buffer first, then allocate more if needed; I seriously doubt we + // send any messages that would use all of this, though. + char parseBuffer_[32 * 1024]; + MallocAllocator mallocAllocator_; + PoolAllocator poolAllocator_; + StackAllocator stackAllocator_; + JsonDocument() + : JsonDocumentBase(rapidjson::kObjectType, + &poolAllocator_, + sizeof(stackAllocator_.fixedBuffer_), + &stackAllocator_) + , poolAllocator_(parseBuffer_, sizeof(parseBuffer_), kDefaultChunkCapacity, &mallocAllocator_) + , stackAllocator_() + { + } +}; + +using JsonValue = rapidjson::GenericValue; + +inline JsonValue* GetObjMember(JsonValue* obj, const char* name) +{ + if (obj) { + auto member = obj->FindMember(name); + if (member != obj->MemberEnd() && member->value.IsObject()) { + return &member->value; + } + } + return nullptr; +} + +inline int GetIntMember(JsonValue* obj, const char* name, int notFoundDefault = 0) +{ + if (obj) { + auto member = obj->FindMember(name); + if (member != obj->MemberEnd() && member->value.IsInt()) { + return member->value.GetInt(); + } + } + return notFoundDefault; +} + +inline const char* GetStrMember(JsonValue* obj, + const char* name, + const char* notFoundDefault = nullptr) +{ + if (obj) { + auto member = obj->FindMember(name); + if (member != obj->MemberEnd() && member->value.IsString()) { + return member->value.GetString(); + } + } + return notFoundDefault; +} diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/allocators.h b/Externals/discord-rpc/thirdparty/include/rapidjson/allocators.h new file mode 100644 index 0000000000..98affe03fb --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/allocators.h @@ -0,0 +1,271 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_ALLOCATORS_H_ +#define RAPIDJSON_ALLOCATORS_H_ + +#include "rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// Allocator + +/*! \class rapidjson::Allocator + \brief Concept for allocating, resizing and freeing memory block. + + Note that Malloc() and Realloc() are non-static but Free() is static. + + So if an allocator need to support Free(), it needs to put its pointer in + the header of memory block. + +\code +concept Allocator { + static const bool kNeedFree; //!< Whether this allocator needs to call Free(). + + // Allocate a memory block. + // \param size of the memory block in bytes. + // \returns pointer to the memory block. + void* Malloc(size_t size); + + // Resize a memory block. + // \param originalPtr The pointer to current memory block. Null pointer is permitted. + // \param originalSize The current size in bytes. (Design issue: since some allocator may not book-keep this, explicitly pass to it can save memory.) + // \param newSize the new size in bytes. + void* Realloc(void* originalPtr, size_t originalSize, size_t newSize); + + // Free a memory block. + // \param pointer to the memory block. Null pointer is permitted. + static void Free(void *ptr); +}; +\endcode +*/ + +/////////////////////////////////////////////////////////////////////////////// +// CrtAllocator + +//! C-runtime library allocator. +/*! This class is just wrapper for standard C library memory routines. + \note implements Allocator concept +*/ +class CrtAllocator { +public: + static const bool kNeedFree = true; + void* Malloc(size_t size) { + if (size) // behavior of malloc(0) is implementation defined. + return std::malloc(size); + else + return NULL; // standardize to returning NULL. + } + void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) { + (void)originalSize; + if (newSize == 0) { + std::free(originalPtr); + return NULL; + } + return std::realloc(originalPtr, newSize); + } + static void Free(void *ptr) { std::free(ptr); } +}; + +/////////////////////////////////////////////////////////////////////////////// +// MemoryPoolAllocator + +//! Default memory allocator used by the parser and DOM. +/*! This allocator allocate memory blocks from pre-allocated memory chunks. + + It does not free memory blocks. And Realloc() only allocate new memory. + + The memory chunks are allocated by BaseAllocator, which is CrtAllocator by default. + + User may also supply a buffer as the first chunk. + + If the user-buffer is full then additional chunks are allocated by BaseAllocator. + + The user-buffer is not deallocated by this allocator. + + \tparam BaseAllocator the allocator type for allocating memory chunks. Default is CrtAllocator. + \note implements Allocator concept +*/ +template +class MemoryPoolAllocator { +public: + static const bool kNeedFree = false; //!< Tell users that no need to call Free() with this allocator. (concept Allocator) + + //! Constructor with chunkSize. + /*! \param chunkSize The size of memory chunk. The default is kDefaultChunkSize. + \param baseAllocator The allocator for allocating memory chunks. + */ + MemoryPoolAllocator(size_t chunkSize = kDefaultChunkCapacity, BaseAllocator* baseAllocator = 0) : + chunkHead_(0), chunk_capacity_(chunkSize), userBuffer_(0), baseAllocator_(baseAllocator), ownBaseAllocator_(0) + { + } + + //! Constructor with user-supplied buffer. + /*! The user buffer will be used firstly. When it is full, memory pool allocates new chunk with chunk size. + + The user buffer will not be deallocated when this allocator is destructed. + + \param buffer User supplied buffer. + \param size Size of the buffer in bytes. It must at least larger than sizeof(ChunkHeader). + \param chunkSize The size of memory chunk. The default is kDefaultChunkSize. + \param baseAllocator The allocator for allocating memory chunks. + */ + MemoryPoolAllocator(void *buffer, size_t size, size_t chunkSize = kDefaultChunkCapacity, BaseAllocator* baseAllocator = 0) : + chunkHead_(0), chunk_capacity_(chunkSize), userBuffer_(buffer), baseAllocator_(baseAllocator), ownBaseAllocator_(0) + { + RAPIDJSON_ASSERT(buffer != 0); + RAPIDJSON_ASSERT(size > sizeof(ChunkHeader)); + chunkHead_ = reinterpret_cast(buffer); + chunkHead_->capacity = size - sizeof(ChunkHeader); + chunkHead_->size = 0; + chunkHead_->next = 0; + } + + //! Destructor. + /*! This deallocates all memory chunks, excluding the user-supplied buffer. + */ + ~MemoryPoolAllocator() { + Clear(); + RAPIDJSON_DELETE(ownBaseAllocator_); + } + + //! Deallocates all memory chunks, excluding the user-supplied buffer. + void Clear() { + while (chunkHead_ && chunkHead_ != userBuffer_) { + ChunkHeader* next = chunkHead_->next; + baseAllocator_->Free(chunkHead_); + chunkHead_ = next; + } + if (chunkHead_ && chunkHead_ == userBuffer_) + chunkHead_->size = 0; // Clear user buffer + } + + //! Computes the total capacity of allocated memory chunks. + /*! \return total capacity in bytes. + */ + size_t Capacity() const { + size_t capacity = 0; + for (ChunkHeader* c = chunkHead_; c != 0; c = c->next) + capacity += c->capacity; + return capacity; + } + + //! Computes the memory blocks allocated. + /*! \return total used bytes. + */ + size_t Size() const { + size_t size = 0; + for (ChunkHeader* c = chunkHead_; c != 0; c = c->next) + size += c->size; + return size; + } + + //! Allocates a memory block. (concept Allocator) + void* Malloc(size_t size) { + if (!size) + return NULL; + + size = RAPIDJSON_ALIGN(size); + if (chunkHead_ == 0 || chunkHead_->size + size > chunkHead_->capacity) + if (!AddChunk(chunk_capacity_ > size ? chunk_capacity_ : size)) + return NULL; + + void *buffer = reinterpret_cast(chunkHead_) + RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + chunkHead_->size; + chunkHead_->size += size; + return buffer; + } + + //! Resizes a memory block (concept Allocator) + void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) { + if (originalPtr == 0) + return Malloc(newSize); + + if (newSize == 0) + return NULL; + + originalSize = RAPIDJSON_ALIGN(originalSize); + newSize = RAPIDJSON_ALIGN(newSize); + + // Do not shrink if new size is smaller than original + if (originalSize >= newSize) + return originalPtr; + + // Simply expand it if it is the last allocation and there is sufficient space + if (originalPtr == reinterpret_cast(chunkHead_) + RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + chunkHead_->size - originalSize) { + size_t increment = static_cast(newSize - originalSize); + if (chunkHead_->size + increment <= chunkHead_->capacity) { + chunkHead_->size += increment; + return originalPtr; + } + } + + // Realloc process: allocate and copy memory, do not free original buffer. + if (void* newBuffer = Malloc(newSize)) { + if (originalSize) + std::memcpy(newBuffer, originalPtr, originalSize); + return newBuffer; + } + else + return NULL; + } + + //! Frees a memory block (concept Allocator) + static void Free(void *ptr) { (void)ptr; } // Do nothing + +private: + //! Copy constructor is not permitted. + MemoryPoolAllocator(const MemoryPoolAllocator& rhs) /* = delete */; + //! Copy assignment operator is not permitted. + MemoryPoolAllocator& operator=(const MemoryPoolAllocator& rhs) /* = delete */; + + //! Creates a new chunk. + /*! \param capacity Capacity of the chunk in bytes. + \return true if success. + */ + bool AddChunk(size_t capacity) { + if (!baseAllocator_) + ownBaseAllocator_ = baseAllocator_ = RAPIDJSON_NEW(BaseAllocator()); + if (ChunkHeader* chunk = reinterpret_cast(baseAllocator_->Malloc(RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + capacity))) { + chunk->capacity = capacity; + chunk->size = 0; + chunk->next = chunkHead_; + chunkHead_ = chunk; + return true; + } + else + return false; + } + + static const int kDefaultChunkCapacity = 64 * 1024; //!< Default chunk capacity. + + //! Chunk header for perpending to each chunk. + /*! Chunks are stored as a singly linked list. + */ + struct ChunkHeader { + size_t capacity; //!< Capacity of the chunk in bytes (excluding the header itself). + size_t size; //!< Current size of allocated memory in bytes. + ChunkHeader *next; //!< Next chunk in the linked list. + }; + + ChunkHeader *chunkHead_; //!< Head of the chunk linked-list. Only the head chunk serves allocation. + size_t chunk_capacity_; //!< The minimum capacity of chunk when they are allocated. + void *userBuffer_; //!< User supplied buffer. + BaseAllocator* baseAllocator_; //!< base allocator for allocating memory chunks. + BaseAllocator* ownBaseAllocator_; //!< base allocator created by this object. +}; + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_ENCODINGS_H_ diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/document.h b/Externals/discord-rpc/thirdparty/include/rapidjson/document.h new file mode 100644 index 0000000000..e3e20dfbdc --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/document.h @@ -0,0 +1,2575 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_DOCUMENT_H_ +#define RAPIDJSON_DOCUMENT_H_ + +/*! \file document.h */ + +#include "reader.h" +#include "internal/meta.h" +#include "internal/strfunc.h" +#include "memorystream.h" +#include "encodedstream.h" +#include // placement new +#include + +RAPIDJSON_DIAG_PUSH +#ifdef _MSC_VER +RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant +RAPIDJSON_DIAG_OFF(4244) // conversion from kXxxFlags to 'uint16_t', possible loss of data +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(switch-enum) +RAPIDJSON_DIAG_OFF(c++98-compat) +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_OFF(effc++) +#if __GNUC__ >= 6 +RAPIDJSON_DIAG_OFF(terminate) // ignore throwing RAPIDJSON_ASSERT in RAPIDJSON_NOEXCEPT functions +#endif +#endif // __GNUC__ + +#ifndef RAPIDJSON_NOMEMBERITERATORCLASS +#include // std::iterator, std::random_access_iterator_tag +#endif + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS +#include // std::move +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +// Forward declaration. +template +class GenericValue; + +template +class GenericDocument; + +//! Name-value pair in a JSON object value. +/*! + This class was internal to GenericValue. It used to be a inner struct. + But a compiler (IBM XL C/C++ for AIX) have reported to have problem with that so it moved as a namespace scope struct. + https://code.google.com/p/rapidjson/issues/detail?id=64 +*/ +template +struct GenericMember { + GenericValue name; //!< name of member (must be a string) + GenericValue value; //!< value of member. +}; + +/////////////////////////////////////////////////////////////////////////////// +// GenericMemberIterator + +#ifndef RAPIDJSON_NOMEMBERITERATORCLASS + +//! (Constant) member iterator for a JSON object value +/*! + \tparam Const Is this a constant iterator? + \tparam Encoding Encoding of the value. (Even non-string values need to have the same encoding in a document) + \tparam Allocator Allocator type for allocating memory of object, array and string. + + This class implements a Random Access Iterator for GenericMember elements + of a GenericValue, see ISO/IEC 14882:2003(E) C++ standard, 24.1 [lib.iterator.requirements]. + + \note This iterator implementation is mainly intended to avoid implicit + conversions from iterator values to \c NULL, + e.g. from GenericValue::FindMember. + + \note Define \c RAPIDJSON_NOMEMBERITERATORCLASS to fall back to a + pointer-based implementation, if your platform doesn't provide + the C++ header. + + \see GenericMember, GenericValue::MemberIterator, GenericValue::ConstMemberIterator + */ +template +class GenericMemberIterator + : public std::iterator >::Type> { + + friend class GenericValue; + template friend class GenericMemberIterator; + + typedef GenericMember PlainType; + typedef typename internal::MaybeAddConst::Type ValueType; + typedef std::iterator BaseType; + +public: + //! Iterator type itself + typedef GenericMemberIterator Iterator; + //! Constant iterator type + typedef GenericMemberIterator ConstIterator; + //! Non-constant iterator type + typedef GenericMemberIterator NonConstIterator; + + //! Pointer to (const) GenericMember + typedef typename BaseType::pointer Pointer; + //! Reference to (const) GenericMember + typedef typename BaseType::reference Reference; + //! Signed integer type (e.g. \c ptrdiff_t) + typedef typename BaseType::difference_type DifferenceType; + + //! Default constructor (singular value) + /*! Creates an iterator pointing to no element. + \note All operations, except for comparisons, are undefined on such values. + */ + GenericMemberIterator() : ptr_() {} + + //! Iterator conversions to more const + /*! + \param it (Non-const) iterator to copy from + + Allows the creation of an iterator from another GenericMemberIterator + that is "less const". Especially, creating a non-constant iterator + from a constant iterator are disabled: + \li const -> non-const (not ok) + \li const -> const (ok) + \li non-const -> const (ok) + \li non-const -> non-const (ok) + + \note If the \c Const template parameter is already \c false, this + constructor effectively defines a regular copy-constructor. + Otherwise, the copy constructor is implicitly defined. + */ + GenericMemberIterator(const NonConstIterator & it) : ptr_(it.ptr_) {} + Iterator& operator=(const NonConstIterator & it) { ptr_ = it.ptr_; return *this; } + + //! @name stepping + //@{ + Iterator& operator++(){ ++ptr_; return *this; } + Iterator& operator--(){ --ptr_; return *this; } + Iterator operator++(int){ Iterator old(*this); ++ptr_; return old; } + Iterator operator--(int){ Iterator old(*this); --ptr_; return old; } + //@} + + //! @name increment/decrement + //@{ + Iterator operator+(DifferenceType n) const { return Iterator(ptr_+n); } + Iterator operator-(DifferenceType n) const { return Iterator(ptr_-n); } + + Iterator& operator+=(DifferenceType n) { ptr_+=n; return *this; } + Iterator& operator-=(DifferenceType n) { ptr_-=n; return *this; } + //@} + + //! @name relations + //@{ + bool operator==(ConstIterator that) const { return ptr_ == that.ptr_; } + bool operator!=(ConstIterator that) const { return ptr_ != that.ptr_; } + bool operator<=(ConstIterator that) const { return ptr_ <= that.ptr_; } + bool operator>=(ConstIterator that) const { return ptr_ >= that.ptr_; } + bool operator< (ConstIterator that) const { return ptr_ < that.ptr_; } + bool operator> (ConstIterator that) const { return ptr_ > that.ptr_; } + //@} + + //! @name dereference + //@{ + Reference operator*() const { return *ptr_; } + Pointer operator->() const { return ptr_; } + Reference operator[](DifferenceType n) const { return ptr_[n]; } + //@} + + //! Distance + DifferenceType operator-(ConstIterator that) const { return ptr_-that.ptr_; } + +private: + //! Internal constructor from plain pointer + explicit GenericMemberIterator(Pointer p) : ptr_(p) {} + + Pointer ptr_; //!< raw pointer +}; + +#else // RAPIDJSON_NOMEMBERITERATORCLASS + +// class-based member iterator implementation disabled, use plain pointers + +template +struct GenericMemberIterator; + +//! non-const GenericMemberIterator +template +struct GenericMemberIterator { + //! use plain pointer as iterator type + typedef GenericMember* Iterator; +}; +//! const GenericMemberIterator +template +struct GenericMemberIterator { + //! use plain const pointer as iterator type + typedef const GenericMember* Iterator; +}; + +#endif // RAPIDJSON_NOMEMBERITERATORCLASS + +/////////////////////////////////////////////////////////////////////////////// +// GenericStringRef + +//! Reference to a constant string (not taking a copy) +/*! + \tparam CharType character type of the string + + This helper class is used to automatically infer constant string + references for string literals, especially from \c const \b (!) + character arrays. + + The main use is for creating JSON string values without copying the + source string via an \ref Allocator. This requires that the referenced + string pointers have a sufficient lifetime, which exceeds the lifetime + of the associated GenericValue. + + \b Example + \code + Value v("foo"); // ok, no need to copy & calculate length + const char foo[] = "foo"; + v.SetString(foo); // ok + + const char* bar = foo; + // Value x(bar); // not ok, can't rely on bar's lifetime + Value x(StringRef(bar)); // lifetime explicitly guaranteed by user + Value y(StringRef(bar, 3)); // ok, explicitly pass length + \endcode + + \see StringRef, GenericValue::SetString +*/ +template +struct GenericStringRef { + typedef CharType Ch; //!< character type of the string + + //! Create string reference from \c const character array +#ifndef __clang__ // -Wdocumentation + /*! + This constructor implicitly creates a constant string reference from + a \c const character array. It has better performance than + \ref StringRef(const CharType*) by inferring the string \ref length + from the array length, and also supports strings containing null + characters. + + \tparam N length of the string, automatically inferred + + \param str Constant character array, lifetime assumed to be longer + than the use of the string in e.g. a GenericValue + + \post \ref s == str + + \note Constant complexity. + \note There is a hidden, private overload to disallow references to + non-const character arrays to be created via this constructor. + By this, e.g. function-scope arrays used to be filled via + \c snprintf are excluded from consideration. + In such cases, the referenced string should be \b copied to the + GenericValue instead. + */ +#endif + template + GenericStringRef(const CharType (&str)[N]) RAPIDJSON_NOEXCEPT + : s(str), length(N-1) {} + + //! Explicitly create string reference from \c const character pointer +#ifndef __clang__ // -Wdocumentation + /*! + This constructor can be used to \b explicitly create a reference to + a constant string pointer. + + \see StringRef(const CharType*) + + \param str Constant character pointer, lifetime assumed to be longer + than the use of the string in e.g. a GenericValue + + \post \ref s == str + + \note There is a hidden, private overload to disallow references to + non-const character arrays to be created via this constructor. + By this, e.g. function-scope arrays used to be filled via + \c snprintf are excluded from consideration. + In such cases, the referenced string should be \b copied to the + GenericValue instead. + */ +#endif + explicit GenericStringRef(const CharType* str) + : s(str), length(internal::StrLen(str)){ RAPIDJSON_ASSERT(s != 0); } + + //! Create constant string reference from pointer and length +#ifndef __clang__ // -Wdocumentation + /*! \param str constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \param len length of the string, excluding the trailing NULL terminator + + \post \ref s == str && \ref length == len + \note Constant complexity. + */ +#endif + GenericStringRef(const CharType* str, SizeType len) + : s(str), length(len) { RAPIDJSON_ASSERT(s != 0); } + + GenericStringRef(const GenericStringRef& rhs) : s(rhs.s), length(rhs.length) {} + + GenericStringRef& operator=(const GenericStringRef& rhs) { s = rhs.s; length = rhs.length; } + + //! implicit conversion to plain CharType pointer + operator const Ch *() const { return s; } + + const Ch* const s; //!< plain CharType pointer + const SizeType length; //!< length of the string (excluding the trailing NULL terminator) + +private: + //! Disallow construction from non-const array + template + GenericStringRef(CharType (&str)[N]) /* = delete */; +}; + +//! Mark a character pointer as constant string +/*! Mark a plain character pointer as a "string literal". This function + can be used to avoid copying a character string to be referenced as a + value in a JSON GenericValue object, if the string's lifetime is known + to be valid long enough. + \tparam CharType Character type of the string + \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \return GenericStringRef string reference object + \relatesalso GenericStringRef + + \see GenericValue::GenericValue(StringRefType), GenericValue::operator=(StringRefType), GenericValue::SetString(StringRefType), GenericValue::PushBack(StringRefType, Allocator&), GenericValue::AddMember +*/ +template +inline GenericStringRef StringRef(const CharType* str) { + return GenericStringRef(str, internal::StrLen(str)); +} + +//! Mark a character pointer as constant string +/*! Mark a plain character pointer as a "string literal". This function + can be used to avoid copying a character string to be referenced as a + value in a JSON GenericValue object, if the string's lifetime is known + to be valid long enough. + + This version has better performance with supplied length, and also + supports string containing null characters. + + \tparam CharType character type of the string + \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \param length The length of source string. + \return GenericStringRef string reference object + \relatesalso GenericStringRef +*/ +template +inline GenericStringRef StringRef(const CharType* str, size_t length) { + return GenericStringRef(str, SizeType(length)); +} + +#if RAPIDJSON_HAS_STDSTRING +//! Mark a string object as constant string +/*! Mark a string object (e.g. \c std::string) as a "string literal". + This function can be used to avoid copying a string to be referenced as a + value in a JSON GenericValue object, if the string's lifetime is known + to be valid long enough. + + \tparam CharType character type of the string + \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \return GenericStringRef string reference object + \relatesalso GenericStringRef + \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. +*/ +template +inline GenericStringRef StringRef(const std::basic_string& str) { + return GenericStringRef(str.data(), SizeType(str.size())); +} +#endif + +/////////////////////////////////////////////////////////////////////////////// +// GenericValue type traits +namespace internal { + +template +struct IsGenericValueImpl : FalseType {}; + +// select candidates according to nested encoding and allocator types +template struct IsGenericValueImpl::Type, typename Void::Type> + : IsBaseOf, T>::Type {}; + +// helper to match arbitrary GenericValue instantiations, including derived classes +template struct IsGenericValue : IsGenericValueImpl::Type {}; + +} // namespace internal + +/////////////////////////////////////////////////////////////////////////////// +// TypeHelper + +namespace internal { + +template +struct TypeHelper {}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsBool(); } + static bool Get(const ValueType& v) { return v.GetBool(); } + static ValueType& Set(ValueType& v, bool data) { return v.SetBool(data); } + static ValueType& Set(ValueType& v, bool data, typename ValueType::AllocatorType&) { return v.SetBool(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsInt(); } + static int Get(const ValueType& v) { return v.GetInt(); } + static ValueType& Set(ValueType& v, int data) { return v.SetInt(data); } + static ValueType& Set(ValueType& v, int data, typename ValueType::AllocatorType&) { return v.SetInt(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsUint(); } + static unsigned Get(const ValueType& v) { return v.GetUint(); } + static ValueType& Set(ValueType& v, unsigned data) { return v.SetUint(data); } + static ValueType& Set(ValueType& v, unsigned data, typename ValueType::AllocatorType&) { return v.SetUint(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsInt64(); } + static int64_t Get(const ValueType& v) { return v.GetInt64(); } + static ValueType& Set(ValueType& v, int64_t data) { return v.SetInt64(data); } + static ValueType& Set(ValueType& v, int64_t data, typename ValueType::AllocatorType&) { return v.SetInt64(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsUint64(); } + static uint64_t Get(const ValueType& v) { return v.GetUint64(); } + static ValueType& Set(ValueType& v, uint64_t data) { return v.SetUint64(data); } + static ValueType& Set(ValueType& v, uint64_t data, typename ValueType::AllocatorType&) { return v.SetUint64(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsDouble(); } + static double Get(const ValueType& v) { return v.GetDouble(); } + static ValueType& Set(ValueType& v, double data) { return v.SetDouble(data); } + static ValueType& Set(ValueType& v, double data, typename ValueType::AllocatorType&) { return v.SetDouble(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsFloat(); } + static float Get(const ValueType& v) { return v.GetFloat(); } + static ValueType& Set(ValueType& v, float data) { return v.SetFloat(data); } + static ValueType& Set(ValueType& v, float data, typename ValueType::AllocatorType&) { return v.SetFloat(data); } +}; + +template +struct TypeHelper { + typedef const typename ValueType::Ch* StringType; + static bool Is(const ValueType& v) { return v.IsString(); } + static StringType Get(const ValueType& v) { return v.GetString(); } + static ValueType& Set(ValueType& v, const StringType data) { return v.SetString(typename ValueType::StringRefType(data)); } + static ValueType& Set(ValueType& v, const StringType data, typename ValueType::AllocatorType& a) { return v.SetString(data, a); } +}; + +#if RAPIDJSON_HAS_STDSTRING +template +struct TypeHelper > { + typedef std::basic_string StringType; + static bool Is(const ValueType& v) { return v.IsString(); } + static StringType Get(const ValueType& v) { return StringType(v.GetString(), v.GetStringLength()); } + static ValueType& Set(ValueType& v, const StringType& data, typename ValueType::AllocatorType& a) { return v.SetString(data, a); } +}; +#endif + +template +struct TypeHelper { + typedef typename ValueType::Array ArrayType; + static bool Is(const ValueType& v) { return v.IsArray(); } + static ArrayType Get(ValueType& v) { return v.GetArray(); } + static ValueType& Set(ValueType& v, ArrayType data) { return v = data; } + static ValueType& Set(ValueType& v, ArrayType data, typename ValueType::AllocatorType&) { return v = data; } +}; + +template +struct TypeHelper { + typedef typename ValueType::ConstArray ArrayType; + static bool Is(const ValueType& v) { return v.IsArray(); } + static ArrayType Get(const ValueType& v) { return v.GetArray(); } +}; + +template +struct TypeHelper { + typedef typename ValueType::Object ObjectType; + static bool Is(const ValueType& v) { return v.IsObject(); } + static ObjectType Get(ValueType& v) { return v.GetObject(); } + static ValueType& Set(ValueType& v, ObjectType data) { return v = data; } + static ValueType& Set(ValueType& v, ObjectType data, typename ValueType::AllocatorType&) { v = data; } +}; + +template +struct TypeHelper { + typedef typename ValueType::ConstObject ObjectType; + static bool Is(const ValueType& v) { return v.IsObject(); } + static ObjectType Get(const ValueType& v) { return v.GetObject(); } +}; + +} // namespace internal + +// Forward declarations +template class GenericArray; +template class GenericObject; + +/////////////////////////////////////////////////////////////////////////////// +// GenericValue + +//! Represents a JSON value. Use Value for UTF8 encoding and default allocator. +/*! + A JSON value can be one of 7 types. This class is a variant type supporting + these types. + + Use the Value if UTF8 and default allocator + + \tparam Encoding Encoding of the value. (Even non-string values need to have the same encoding in a document) + \tparam Allocator Allocator type for allocating memory of object, array and string. +*/ +template > +class GenericValue { +public: + //! Name-value pair in an object. + typedef GenericMember Member; + typedef Encoding EncodingType; //!< Encoding type from template parameter. + typedef Allocator AllocatorType; //!< Allocator type from template parameter. + typedef typename Encoding::Ch Ch; //!< Character type derived from Encoding. + typedef GenericStringRef StringRefType; //!< Reference to a constant string + typedef typename GenericMemberIterator::Iterator MemberIterator; //!< Member iterator for iterating in object. + typedef typename GenericMemberIterator::Iterator ConstMemberIterator; //!< Constant member iterator for iterating in object. + typedef GenericValue* ValueIterator; //!< Value iterator for iterating in array. + typedef const GenericValue* ConstValueIterator; //!< Constant value iterator for iterating in array. + typedef GenericValue ValueType; //!< Value type of itself. + typedef GenericArray Array; + typedef GenericArray ConstArray; + typedef GenericObject Object; + typedef GenericObject ConstObject; + + //!@name Constructors and destructor. + //@{ + + //! Default constructor creates a null value. + GenericValue() RAPIDJSON_NOEXCEPT : data_() { data_.f.flags = kNullFlag; } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move constructor in C++11 + GenericValue(GenericValue&& rhs) RAPIDJSON_NOEXCEPT : data_(rhs.data_) { + rhs.data_.f.flags = kNullFlag; // give up contents + } +#endif + +private: + //! Copy constructor is not permitted. + GenericValue(const GenericValue& rhs); + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Moving from a GenericDocument is not permitted. + template + GenericValue(GenericDocument&& rhs); + + //! Move assignment from a GenericDocument is not permitted. + template + GenericValue& operator=(GenericDocument&& rhs); +#endif + +public: + + //! Constructor with JSON value type. + /*! This creates a Value of specified type with default content. + \param type Type of the value. + \note Default content for number is zero. + */ + explicit GenericValue(Type type) RAPIDJSON_NOEXCEPT : data_() { + static const uint16_t defaultFlags[7] = { + kNullFlag, kFalseFlag, kTrueFlag, kObjectFlag, kArrayFlag, kShortStringFlag, + kNumberAnyFlag + }; + RAPIDJSON_ASSERT(type <= kNumberType); + data_.f.flags = defaultFlags[type]; + + // Use ShortString to store empty string. + if (type == kStringType) + data_.ss.SetLength(0); + } + + //! Explicit copy constructor (with allocator) + /*! Creates a copy of a Value by using the given Allocator + \tparam SourceAllocator allocator of \c rhs + \param rhs Value to copy from (read-only) + \param allocator Allocator for allocating copied elements and buffers. Commonly use GenericDocument::GetAllocator(). + \see CopyFrom() + */ + template< typename SourceAllocator > + GenericValue(const GenericValue& rhs, Allocator & allocator); + + //! Constructor for boolean value. + /*! \param b Boolean value + \note This constructor is limited to \em real boolean values and rejects + implicitly converted types like arbitrary pointers. Use an explicit cast + to \c bool, if you want to construct a boolean JSON value in such cases. + */ +#ifndef RAPIDJSON_DOXYGEN_RUNNING // hide SFINAE from Doxygen + template + explicit GenericValue(T b, RAPIDJSON_ENABLEIF((internal::IsSame))) RAPIDJSON_NOEXCEPT // See #472 +#else + explicit GenericValue(bool b) RAPIDJSON_NOEXCEPT +#endif + : data_() { + // safe-guard against failing SFINAE + RAPIDJSON_STATIC_ASSERT((internal::IsSame::Value)); + data_.f.flags = b ? kTrueFlag : kFalseFlag; + } + + //! Constructor for int value. + explicit GenericValue(int i) RAPIDJSON_NOEXCEPT : data_() { + data_.n.i64 = i; + data_.f.flags = (i >= 0) ? (kNumberIntFlag | kUintFlag | kUint64Flag) : kNumberIntFlag; + } + + //! Constructor for unsigned value. + explicit GenericValue(unsigned u) RAPIDJSON_NOEXCEPT : data_() { + data_.n.u64 = u; + data_.f.flags = (u & 0x80000000) ? kNumberUintFlag : (kNumberUintFlag | kIntFlag | kInt64Flag); + } + + //! Constructor for int64_t value. + explicit GenericValue(int64_t i64) RAPIDJSON_NOEXCEPT : data_() { + data_.n.i64 = i64; + data_.f.flags = kNumberInt64Flag; + if (i64 >= 0) { + data_.f.flags |= kNumberUint64Flag; + if (!(static_cast(i64) & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x00000000))) + data_.f.flags |= kUintFlag; + if (!(static_cast(i64) & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000))) + data_.f.flags |= kIntFlag; + } + else if (i64 >= static_cast(RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000))) + data_.f.flags |= kIntFlag; + } + + //! Constructor for uint64_t value. + explicit GenericValue(uint64_t u64) RAPIDJSON_NOEXCEPT : data_() { + data_.n.u64 = u64; + data_.f.flags = kNumberUint64Flag; + if (!(u64 & RAPIDJSON_UINT64_C2(0x80000000, 0x00000000))) + data_.f.flags |= kInt64Flag; + if (!(u64 & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x00000000))) + data_.f.flags |= kUintFlag; + if (!(u64 & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000))) + data_.f.flags |= kIntFlag; + } + + //! Constructor for double value. + explicit GenericValue(double d) RAPIDJSON_NOEXCEPT : data_() { data_.n.d = d; data_.f.flags = kNumberDoubleFlag; } + + //! Constructor for constant string (i.e. do not make a copy of string) + GenericValue(const Ch* s, SizeType length) RAPIDJSON_NOEXCEPT : data_() { SetStringRaw(StringRef(s, length)); } + + //! Constructor for constant string (i.e. do not make a copy of string) + explicit GenericValue(StringRefType s) RAPIDJSON_NOEXCEPT : data_() { SetStringRaw(s); } + + //! Constructor for copy-string (i.e. do make a copy of string) + GenericValue(const Ch* s, SizeType length, Allocator& allocator) : data_() { SetStringRaw(StringRef(s, length), allocator); } + + //! Constructor for copy-string (i.e. do make a copy of string) + GenericValue(const Ch*s, Allocator& allocator) : data_() { SetStringRaw(StringRef(s), allocator); } + +#if RAPIDJSON_HAS_STDSTRING + //! Constructor for copy-string from a string object (i.e. do make a copy of string) + /*! \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. + */ + GenericValue(const std::basic_string& s, Allocator& allocator) : data_() { SetStringRaw(StringRef(s), allocator); } +#endif + + //! Constructor for Array. + /*! + \param a An array obtained by \c GetArray(). + \note \c Array is always pass-by-value. + \note the source array is moved into this value and the sourec array becomes empty. + */ + GenericValue(Array a) RAPIDJSON_NOEXCEPT : data_(a.value_.data_) { + a.value_.data_ = Data(); + a.value_.data_.f.flags = kArrayFlag; + } + + //! Constructor for Object. + /*! + \param o An object obtained by \c GetObject(). + \note \c Object is always pass-by-value. + \note the source object is moved into this value and the sourec object becomes empty. + */ + GenericValue(Object o) RAPIDJSON_NOEXCEPT : data_(o.value_.data_) { + o.value_.data_ = Data(); + o.value_.data_.f.flags = kObjectFlag; + } + + //! Destructor. + /*! Need to destruct elements of array, members of object, or copy-string. + */ + ~GenericValue() { + if (Allocator::kNeedFree) { // Shortcut by Allocator's trait + switch(data_.f.flags) { + case kArrayFlag: + { + GenericValue* e = GetElementsPointer(); + for (GenericValue* v = e; v != e + data_.a.size; ++v) + v->~GenericValue(); + Allocator::Free(e); + } + break; + + case kObjectFlag: + for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m) + m->~Member(); + Allocator::Free(GetMembersPointer()); + break; + + case kCopyStringFlag: + Allocator::Free(const_cast(GetStringPointer())); + break; + + default: + break; // Do nothing for other types. + } + } + } + + //@} + + //!@name Assignment operators + //@{ + + //! Assignment with move semantics. + /*! \param rhs Source of the assignment. It will become a null value after assignment. + */ + GenericValue& operator=(GenericValue& rhs) RAPIDJSON_NOEXCEPT { + RAPIDJSON_ASSERT(this != &rhs); + this->~GenericValue(); + RawAssign(rhs); + return *this; + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move assignment in C++11 + GenericValue& operator=(GenericValue&& rhs) RAPIDJSON_NOEXCEPT { + return *this = rhs.Move(); + } +#endif + + //! Assignment of constant string reference (no copy) + /*! \param str Constant string reference to be assigned + \note This overload is needed to avoid clashes with the generic primitive type assignment overload below. + \see GenericStringRef, operator=(T) + */ + GenericValue& operator=(StringRefType str) RAPIDJSON_NOEXCEPT { + GenericValue s(str); + return *this = s; + } + + //! Assignment with primitive types. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param value The value to be assigned. + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref SetString(const Ch*, Allocator&) (for copying) or + \ref StringRef() (to explicitly mark the pointer as constant) instead. + All other pointer types would implicitly convert to \c bool, + use \ref SetBool() instead. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::IsPointer), (GenericValue&)) + operator=(T value) { + GenericValue v(value); + return *this = v; + } + + //! Deep-copy assignment from Value + /*! Assigns a \b copy of the Value to the current Value object + \tparam SourceAllocator Allocator type of \c rhs + \param rhs Value to copy from (read-only) + \param allocator Allocator to use for copying + */ + template + GenericValue& CopyFrom(const GenericValue& rhs, Allocator& allocator) { + RAPIDJSON_ASSERT(static_cast(this) != static_cast(&rhs)); + this->~GenericValue(); + new (this) GenericValue(rhs, allocator); + return *this; + } + + //! Exchange the contents of this value with those of other. + /*! + \param other Another value. + \note Constant complexity. + */ + GenericValue& Swap(GenericValue& other) RAPIDJSON_NOEXCEPT { + GenericValue temp; + temp.RawAssign(*this); + RawAssign(other); + other.RawAssign(temp); + return *this; + } + + //! free-standing swap function helper + /*! + Helper function to enable support for common swap implementation pattern based on \c std::swap: + \code + void swap(MyClass& a, MyClass& b) { + using std::swap; + swap(a.value, b.value); + // ... + } + \endcode + \see Swap() + */ + friend inline void swap(GenericValue& a, GenericValue& b) RAPIDJSON_NOEXCEPT { a.Swap(b); } + + //! Prepare Value for move semantics + /*! \return *this */ + GenericValue& Move() RAPIDJSON_NOEXCEPT { return *this; } + //@} + + //!@name Equal-to and not-equal-to operators + //@{ + //! Equal-to operator + /*! + \note If an object contains duplicated named member, comparing equality with any object is always \c false. + \note Linear time complexity (number of all values in the subtree and total lengths of all strings). + */ + template + bool operator==(const GenericValue& rhs) const { + typedef GenericValue RhsType; + if (GetType() != rhs.GetType()) + return false; + + switch (GetType()) { + case kObjectType: // Warning: O(n^2) inner-loop + if (data_.o.size != rhs.data_.o.size) + return false; + for (ConstMemberIterator lhsMemberItr = MemberBegin(); lhsMemberItr != MemberEnd(); ++lhsMemberItr) { + typename RhsType::ConstMemberIterator rhsMemberItr = rhs.FindMember(lhsMemberItr->name); + if (rhsMemberItr == rhs.MemberEnd() || lhsMemberItr->value != rhsMemberItr->value) + return false; + } + return true; + + case kArrayType: + if (data_.a.size != rhs.data_.a.size) + return false; + for (SizeType i = 0; i < data_.a.size; i++) + if ((*this)[i] != rhs[i]) + return false; + return true; + + case kStringType: + return StringEqual(rhs); + + case kNumberType: + if (IsDouble() || rhs.IsDouble()) { + double a = GetDouble(); // May convert from integer to double. + double b = rhs.GetDouble(); // Ditto + return a >= b && a <= b; // Prevent -Wfloat-equal + } + else + return data_.n.u64 == rhs.data_.n.u64; + + default: + return true; + } + } + + //! Equal-to operator with const C-string pointer + bool operator==(const Ch* rhs) const { return *this == GenericValue(StringRef(rhs)); } + +#if RAPIDJSON_HAS_STDSTRING + //! Equal-to operator with string object + /*! \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. + */ + bool operator==(const std::basic_string& rhs) const { return *this == GenericValue(StringRef(rhs)); } +#endif + + //! Equal-to operator with primitive types + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c double, \c true, \c false + */ + template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr,internal::IsGenericValue >), (bool)) operator==(const T& rhs) const { return *this == GenericValue(rhs); } + + //! Not-equal-to operator + /*! \return !(*this == rhs) + */ + template + bool operator!=(const GenericValue& rhs) const { return !(*this == rhs); } + + //! Not-equal-to operator with const C-string pointer + bool operator!=(const Ch* rhs) const { return !(*this == rhs); } + + //! Not-equal-to operator with arbitrary types + /*! \return !(*this == rhs) + */ + template RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue), (bool)) operator!=(const T& rhs) const { return !(*this == rhs); } + + //! Equal-to operator with arbitrary types (symmetric version) + /*! \return (rhs == lhs) + */ + template friend RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue), (bool)) operator==(const T& lhs, const GenericValue& rhs) { return rhs == lhs; } + + //! Not-Equal-to operator with arbitrary types (symmetric version) + /*! \return !(rhs == lhs) + */ + template friend RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue), (bool)) operator!=(const T& lhs, const GenericValue& rhs) { return !(rhs == lhs); } + //@} + + //!@name Type + //@{ + + Type GetType() const { return static_cast(data_.f.flags & kTypeMask); } + bool IsNull() const { return data_.f.flags == kNullFlag; } + bool IsFalse() const { return data_.f.flags == kFalseFlag; } + bool IsTrue() const { return data_.f.flags == kTrueFlag; } + bool IsBool() const { return (data_.f.flags & kBoolFlag) != 0; } + bool IsObject() const { return data_.f.flags == kObjectFlag; } + bool IsArray() const { return data_.f.flags == kArrayFlag; } + bool IsNumber() const { return (data_.f.flags & kNumberFlag) != 0; } + bool IsInt() const { return (data_.f.flags & kIntFlag) != 0; } + bool IsUint() const { return (data_.f.flags & kUintFlag) != 0; } + bool IsInt64() const { return (data_.f.flags & kInt64Flag) != 0; } + bool IsUint64() const { return (data_.f.flags & kUint64Flag) != 0; } + bool IsDouble() const { return (data_.f.flags & kDoubleFlag) != 0; } + bool IsString() const { return (data_.f.flags & kStringFlag) != 0; } + + // Checks whether a number can be losslessly converted to a double. + bool IsLosslessDouble() const { + if (!IsNumber()) return false; + if (IsUint64()) { + uint64_t u = GetUint64(); + volatile double d = static_cast(u); + return (d >= 0.0) + && (d < static_cast(std::numeric_limits::max())) + && (u == static_cast(d)); + } + if (IsInt64()) { + int64_t i = GetInt64(); + volatile double d = static_cast(i); + return (d >= static_cast(std::numeric_limits::min())) + && (d < static_cast(std::numeric_limits::max())) + && (i == static_cast(d)); + } + return true; // double, int, uint are always lossless + } + + // Checks whether a number is a float (possible lossy). + bool IsFloat() const { + if ((data_.f.flags & kDoubleFlag) == 0) + return false; + double d = GetDouble(); + return d >= -3.4028234e38 && d <= 3.4028234e38; + } + // Checks whether a number can be losslessly converted to a float. + bool IsLosslessFloat() const { + if (!IsNumber()) return false; + double a = GetDouble(); + if (a < static_cast(-std::numeric_limits::max()) + || a > static_cast(std::numeric_limits::max())) + return false; + double b = static_cast(static_cast(a)); + return a >= b && a <= b; // Prevent -Wfloat-equal + } + + //@} + + //!@name Null + //@{ + + GenericValue& SetNull() { this->~GenericValue(); new (this) GenericValue(); return *this; } + + //@} + + //!@name Bool + //@{ + + bool GetBool() const { RAPIDJSON_ASSERT(IsBool()); return data_.f.flags == kTrueFlag; } + //!< Set boolean value + /*! \post IsBool() == true */ + GenericValue& SetBool(bool b) { this->~GenericValue(); new (this) GenericValue(b); return *this; } + + //@} + + //!@name Object + //@{ + + //! Set this value as an empty object. + /*! \post IsObject() == true */ + GenericValue& SetObject() { this->~GenericValue(); new (this) GenericValue(kObjectType); return *this; } + + //! Get the number of members in the object. + SizeType MemberCount() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.size; } + + //! Check whether the object is empty. + bool ObjectEmpty() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.size == 0; } + + //! Get a value from an object associated with the name. + /*! \pre IsObject() == true + \tparam T Either \c Ch or \c const \c Ch (template used for disambiguation with \ref operator[](SizeType)) + \note In version 0.1x, if the member is not found, this function returns a null value. This makes issue 7. + Since 0.2, if the name is not correct, it will assert. + If user is unsure whether a member exists, user should use HasMember() first. + A better approach is to use FindMember(). + \note Linear time complexity. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr::Type, Ch> >),(GenericValue&)) operator[](T* name) { + GenericValue n(StringRef(name)); + return (*this)[n]; + } + template + RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr::Type, Ch> >),(const GenericValue&)) operator[](T* name) const { return const_cast(*this)[name]; } + + //! Get a value from an object associated with the name. + /*! \pre IsObject() == true + \tparam SourceAllocator Allocator of the \c name value + + \note Compared to \ref operator[](T*), this version is faster because it does not need a StrLen(). + And it can also handle strings with embedded null characters. + + \note Linear time complexity. + */ + template + GenericValue& operator[](const GenericValue& name) { + MemberIterator member = FindMember(name); + if (member != MemberEnd()) + return member->value; + else { + RAPIDJSON_ASSERT(false); // see above note + + // This will generate -Wexit-time-destructors in clang + // static GenericValue NullValue; + // return NullValue; + + // Use static buffer and placement-new to prevent destruction + static char buffer[sizeof(GenericValue)]; + return *new (buffer) GenericValue(); + } + } + template + const GenericValue& operator[](const GenericValue& name) const { return const_cast(*this)[name]; } + +#if RAPIDJSON_HAS_STDSTRING + //! Get a value from an object associated with name (string object). + GenericValue& operator[](const std::basic_string& name) { return (*this)[GenericValue(StringRef(name))]; } + const GenericValue& operator[](const std::basic_string& name) const { return (*this)[GenericValue(StringRef(name))]; } +#endif + + //! Const member iterator + /*! \pre IsObject() == true */ + ConstMemberIterator MemberBegin() const { RAPIDJSON_ASSERT(IsObject()); return ConstMemberIterator(GetMembersPointer()); } + //! Const \em past-the-end member iterator + /*! \pre IsObject() == true */ + ConstMemberIterator MemberEnd() const { RAPIDJSON_ASSERT(IsObject()); return ConstMemberIterator(GetMembersPointer() + data_.o.size); } + //! Member iterator + /*! \pre IsObject() == true */ + MemberIterator MemberBegin() { RAPIDJSON_ASSERT(IsObject()); return MemberIterator(GetMembersPointer()); } + //! \em Past-the-end member iterator + /*! \pre IsObject() == true */ + MemberIterator MemberEnd() { RAPIDJSON_ASSERT(IsObject()); return MemberIterator(GetMembersPointer() + data_.o.size); } + + //! Check whether a member exists in the object. + /*! + \param name Member name to be searched. + \pre IsObject() == true + \return Whether a member with that name exists. + \note It is better to use FindMember() directly if you need the obtain the value as well. + \note Linear time complexity. + */ + bool HasMember(const Ch* name) const { return FindMember(name) != MemberEnd(); } + +#if RAPIDJSON_HAS_STDSTRING + //! Check whether a member exists in the object with string object. + /*! + \param name Member name to be searched. + \pre IsObject() == true + \return Whether a member with that name exists. + \note It is better to use FindMember() directly if you need the obtain the value as well. + \note Linear time complexity. + */ + bool HasMember(const std::basic_string& name) const { return FindMember(name) != MemberEnd(); } +#endif + + //! Check whether a member exists in the object with GenericValue name. + /*! + This version is faster because it does not need a StrLen(). It can also handle string with null character. + \param name Member name to be searched. + \pre IsObject() == true + \return Whether a member with that name exists. + \note It is better to use FindMember() directly if you need the obtain the value as well. + \note Linear time complexity. + */ + template + bool HasMember(const GenericValue& name) const { return FindMember(name) != MemberEnd(); } + + //! Find member by name. + /*! + \param name Member name to be searched. + \pre IsObject() == true + \return Iterator to member, if it exists. + Otherwise returns \ref MemberEnd(). + + \note Earlier versions of Rapidjson returned a \c NULL pointer, in case + the requested member doesn't exist. For consistency with e.g. + \c std::map, this has been changed to MemberEnd() now. + \note Linear time complexity. + */ + MemberIterator FindMember(const Ch* name) { + GenericValue n(StringRef(name)); + return FindMember(n); + } + + ConstMemberIterator FindMember(const Ch* name) const { return const_cast(*this).FindMember(name); } + + //! Find member by name. + /*! + This version is faster because it does not need a StrLen(). It can also handle string with null character. + \param name Member name to be searched. + \pre IsObject() == true + \return Iterator to member, if it exists. + Otherwise returns \ref MemberEnd(). + + \note Earlier versions of Rapidjson returned a \c NULL pointer, in case + the requested member doesn't exist. For consistency with e.g. + \c std::map, this has been changed to MemberEnd() now. + \note Linear time complexity. + */ + template + MemberIterator FindMember(const GenericValue& name) { + RAPIDJSON_ASSERT(IsObject()); + RAPIDJSON_ASSERT(name.IsString()); + MemberIterator member = MemberBegin(); + for ( ; member != MemberEnd(); ++member) + if (name.StringEqual(member->name)) + break; + return member; + } + template ConstMemberIterator FindMember(const GenericValue& name) const { return const_cast(*this).FindMember(name); } + +#if RAPIDJSON_HAS_STDSTRING + //! Find member by string object name. + /*! + \param name Member name to be searched. + \pre IsObject() == true + \return Iterator to member, if it exists. + Otherwise returns \ref MemberEnd(). + */ + MemberIterator FindMember(const std::basic_string& name) { return FindMember(GenericValue(StringRef(name))); } + ConstMemberIterator FindMember(const std::basic_string& name) const { return FindMember(GenericValue(StringRef(name))); } +#endif + + //! Add a member (name-value pair) to the object. + /*! \param name A string value as name of member. + \param value Value of any type. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \note The ownership of \c name and \c value will be transferred to this object on success. + \pre IsObject() && name.IsString() + \post name.IsNull() && value.IsNull() + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(GenericValue& name, GenericValue& value, Allocator& allocator) { + RAPIDJSON_ASSERT(IsObject()); + RAPIDJSON_ASSERT(name.IsString()); + + ObjectData& o = data_.o; + if (o.size >= o.capacity) { + if (o.capacity == 0) { + o.capacity = kDefaultObjectCapacity; + SetMembersPointer(reinterpret_cast(allocator.Malloc(o.capacity * sizeof(Member)))); + } + else { + SizeType oldCapacity = o.capacity; + o.capacity += (oldCapacity + 1) / 2; // grow by factor 1.5 + SetMembersPointer(reinterpret_cast(allocator.Realloc(GetMembersPointer(), oldCapacity * sizeof(Member), o.capacity * sizeof(Member)))); + } + } + Member* members = GetMembersPointer(); + members[o.size].name.RawAssign(name); + members[o.size].value.RawAssign(value); + o.size++; + return *this; + } + + //! Add a constant string value as member (name-value pair) to the object. + /*! \param name A string value as name of member. + \param value constant string reference as value of member. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + \note This overload is needed to avoid clashes with the generic primitive type AddMember(GenericValue&,T,Allocator&) overload below. + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(GenericValue& name, StringRefType value, Allocator& allocator) { + GenericValue v(value); + return AddMember(name, v, allocator); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Add a string object as member (name-value pair) to the object. + /*! \param name A string value as name of member. + \param value constant string reference as value of member. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + \note This overload is needed to avoid clashes with the generic primitive type AddMember(GenericValue&,T,Allocator&) overload below. + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(GenericValue& name, std::basic_string& value, Allocator& allocator) { + GenericValue v(value, allocator); + return AddMember(name, v, allocator); + } +#endif + + //! Add any primitive value as member (name-value pair) to the object. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param name A string value as name of member. + \param value Value of primitive type \c T as value of member + \param allocator Allocator for reallocating memory. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref AddMember(StringRefType, GenericValue&, Allocator&) or \ref + AddMember(StringRefType, StringRefType, Allocator&). + All other pointer types would implicitly convert to \c bool, + use an explicit cast instead, if needed. + \note Amortized Constant time complexity. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericValue&)) + AddMember(GenericValue& name, T value, Allocator& allocator) { + GenericValue v(value); + return AddMember(name, v, allocator); + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericValue& AddMember(GenericValue&& name, GenericValue&& value, Allocator& allocator) { + return AddMember(name, value, allocator); + } + GenericValue& AddMember(GenericValue&& name, GenericValue& value, Allocator& allocator) { + return AddMember(name, value, allocator); + } + GenericValue& AddMember(GenericValue& name, GenericValue&& value, Allocator& allocator) { + return AddMember(name, value, allocator); + } + GenericValue& AddMember(StringRefType name, GenericValue&& value, Allocator& allocator) { + GenericValue n(name); + return AddMember(n, value, allocator); + } +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + + + //! Add a member (name-value pair) to the object. + /*! \param name A constant string reference as name of member. + \param value Value of any type. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \note The ownership of \c value will be transferred to this object on success. + \pre IsObject() + \post value.IsNull() + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(StringRefType name, GenericValue& value, Allocator& allocator) { + GenericValue n(name); + return AddMember(n, value, allocator); + } + + //! Add a constant string value as member (name-value pair) to the object. + /*! \param name A constant string reference as name of member. + \param value constant string reference as value of member. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + \note This overload is needed to avoid clashes with the generic primitive type AddMember(StringRefType,T,Allocator&) overload below. + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(StringRefType name, StringRefType value, Allocator& allocator) { + GenericValue v(value); + return AddMember(name, v, allocator); + } + + //! Add any primitive value as member (name-value pair) to the object. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param name A constant string reference as name of member. + \param value Value of primitive type \c T as value of member + \param allocator Allocator for reallocating memory. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref AddMember(StringRefType, GenericValue&, Allocator&) or \ref + AddMember(StringRefType, StringRefType, Allocator&). + All other pointer types would implicitly convert to \c bool, + use an explicit cast instead, if needed. + \note Amortized Constant time complexity. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericValue&)) + AddMember(StringRefType name, T value, Allocator& allocator) { + GenericValue n(name); + return AddMember(n, value, allocator); + } + + //! Remove all members in the object. + /*! This function do not deallocate memory in the object, i.e. the capacity is unchanged. + \note Linear time complexity. + */ + void RemoveAllMembers() { + RAPIDJSON_ASSERT(IsObject()); + for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m) + m->~Member(); + data_.o.size = 0; + } + + //! Remove a member in object by its name. + /*! \param name Name of member to be removed. + \return Whether the member existed. + \note This function may reorder the object members. Use \ref + EraseMember(ConstMemberIterator) if you need to preserve the + relative order of the remaining members. + \note Linear time complexity. + */ + bool RemoveMember(const Ch* name) { + GenericValue n(StringRef(name)); + return RemoveMember(n); + } + +#if RAPIDJSON_HAS_STDSTRING + bool RemoveMember(const std::basic_string& name) { return RemoveMember(GenericValue(StringRef(name))); } +#endif + + template + bool RemoveMember(const GenericValue& name) { + MemberIterator m = FindMember(name); + if (m != MemberEnd()) { + RemoveMember(m); + return true; + } + else + return false; + } + + //! Remove a member in object by iterator. + /*! \param m member iterator (obtained by FindMember() or MemberBegin()). + \return the new iterator after removal. + \note This function may reorder the object members. Use \ref + EraseMember(ConstMemberIterator) if you need to preserve the + relative order of the remaining members. + \note Constant time complexity. + */ + MemberIterator RemoveMember(MemberIterator m) { + RAPIDJSON_ASSERT(IsObject()); + RAPIDJSON_ASSERT(data_.o.size > 0); + RAPIDJSON_ASSERT(GetMembersPointer() != 0); + RAPIDJSON_ASSERT(m >= MemberBegin() && m < MemberEnd()); + + MemberIterator last(GetMembersPointer() + (data_.o.size - 1)); + if (data_.o.size > 1 && m != last) + *m = *last; // Move the last one to this place + else + m->~Member(); // Only one left, just destroy + --data_.o.size; + return m; + } + + //! Remove a member from an object by iterator. + /*! \param pos iterator to the member to remove + \pre IsObject() == true && \ref MemberBegin() <= \c pos < \ref MemberEnd() + \return Iterator following the removed element. + If the iterator \c pos refers to the last element, the \ref MemberEnd() iterator is returned. + \note This function preserves the relative order of the remaining object + members. If you do not need this, use the more efficient \ref RemoveMember(MemberIterator). + \note Linear time complexity. + */ + MemberIterator EraseMember(ConstMemberIterator pos) { + return EraseMember(pos, pos +1); + } + + //! Remove members in the range [first, last) from an object. + /*! \param first iterator to the first member to remove + \param last iterator following the last member to remove + \pre IsObject() == true && \ref MemberBegin() <= \c first <= \c last <= \ref MemberEnd() + \return Iterator following the last removed element. + \note This function preserves the relative order of the remaining object + members. + \note Linear time complexity. + */ + MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last) { + RAPIDJSON_ASSERT(IsObject()); + RAPIDJSON_ASSERT(data_.o.size > 0); + RAPIDJSON_ASSERT(GetMembersPointer() != 0); + RAPIDJSON_ASSERT(first >= MemberBegin()); + RAPIDJSON_ASSERT(first <= last); + RAPIDJSON_ASSERT(last <= MemberEnd()); + + MemberIterator pos = MemberBegin() + (first - MemberBegin()); + for (MemberIterator itr = pos; itr != last; ++itr) + itr->~Member(); + std::memmove(&*pos, &*last, static_cast(MemberEnd() - last) * sizeof(Member)); + data_.o.size -= static_cast(last - first); + return pos; + } + + //! Erase a member in object by its name. + /*! \param name Name of member to be removed. + \return Whether the member existed. + \note Linear time complexity. + */ + bool EraseMember(const Ch* name) { + GenericValue n(StringRef(name)); + return EraseMember(n); + } + +#if RAPIDJSON_HAS_STDSTRING + bool EraseMember(const std::basic_string& name) { return EraseMember(GenericValue(StringRef(name))); } +#endif + + template + bool EraseMember(const GenericValue& name) { + MemberIterator m = FindMember(name); + if (m != MemberEnd()) { + EraseMember(m); + return true; + } + else + return false; + } + + Object GetObject() { RAPIDJSON_ASSERT(IsObject()); return Object(*this); } + ConstObject GetObject() const { RAPIDJSON_ASSERT(IsObject()); return ConstObject(*this); } + + //@} + + //!@name Array + //@{ + + //! Set this value as an empty array. + /*! \post IsArray == true */ + GenericValue& SetArray() { this->~GenericValue(); new (this) GenericValue(kArrayType); return *this; } + + //! Get the number of elements in array. + SizeType Size() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.size; } + + //! Get the capacity of array. + SizeType Capacity() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.capacity; } + + //! Check whether the array is empty. + bool Empty() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.size == 0; } + + //! Remove all elements in the array. + /*! This function do not deallocate memory in the array, i.e. the capacity is unchanged. + \note Linear time complexity. + */ + void Clear() { + RAPIDJSON_ASSERT(IsArray()); + GenericValue* e = GetElementsPointer(); + for (GenericValue* v = e; v != e + data_.a.size; ++v) + v->~GenericValue(); + data_.a.size = 0; + } + + //! Get an element from array by index. + /*! \pre IsArray() == true + \param index Zero-based index of element. + \see operator[](T*) + */ + GenericValue& operator[](SizeType index) { + RAPIDJSON_ASSERT(IsArray()); + RAPIDJSON_ASSERT(index < data_.a.size); + return GetElementsPointer()[index]; + } + const GenericValue& operator[](SizeType index) const { return const_cast(*this)[index]; } + + //! Element iterator + /*! \pre IsArray() == true */ + ValueIterator Begin() { RAPIDJSON_ASSERT(IsArray()); return GetElementsPointer(); } + //! \em Past-the-end element iterator + /*! \pre IsArray() == true */ + ValueIterator End() { RAPIDJSON_ASSERT(IsArray()); return GetElementsPointer() + data_.a.size; } + //! Constant element iterator + /*! \pre IsArray() == true */ + ConstValueIterator Begin() const { return const_cast(*this).Begin(); } + //! Constant \em past-the-end element iterator + /*! \pre IsArray() == true */ + ConstValueIterator End() const { return const_cast(*this).End(); } + + //! Request the array to have enough capacity to store elements. + /*! \param newCapacity The capacity that the array at least need to have. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \note Linear time complexity. + */ + GenericValue& Reserve(SizeType newCapacity, Allocator &allocator) { + RAPIDJSON_ASSERT(IsArray()); + if (newCapacity > data_.a.capacity) { + SetElementsPointer(reinterpret_cast(allocator.Realloc(GetElementsPointer(), data_.a.capacity * sizeof(GenericValue), newCapacity * sizeof(GenericValue)))); + data_.a.capacity = newCapacity; + } + return *this; + } + + //! Append a GenericValue at the end of the array. + /*! \param value Value to be appended. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \pre IsArray() == true + \post value.IsNull() == true + \return The value itself for fluent API. + \note The ownership of \c value will be transferred to this array on success. + \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient. + \note Amortized constant time complexity. + */ + GenericValue& PushBack(GenericValue& value, Allocator& allocator) { + RAPIDJSON_ASSERT(IsArray()); + if (data_.a.size >= data_.a.capacity) + Reserve(data_.a.capacity == 0 ? kDefaultArrayCapacity : (data_.a.capacity + (data_.a.capacity + 1) / 2), allocator); + GetElementsPointer()[data_.a.size++].RawAssign(value); + return *this; + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericValue& PushBack(GenericValue&& value, Allocator& allocator) { + return PushBack(value, allocator); + } +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + + //! Append a constant string reference at the end of the array. + /*! \param value Constant string reference to be appended. + \param allocator Allocator for reallocating memory. It must be the same one used previously. Commonly use GenericDocument::GetAllocator(). + \pre IsArray() == true + \return The value itself for fluent API. + \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient. + \note Amortized constant time complexity. + \see GenericStringRef + */ + GenericValue& PushBack(StringRefType value, Allocator& allocator) { + return (*this).template PushBack(value, allocator); + } + + //! Append a primitive value at the end of the array. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param value Value of primitive type T to be appended. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \pre IsArray() == true + \return The value itself for fluent API. + \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient. + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref PushBack(GenericValue&, Allocator&) or \ref + PushBack(StringRefType, Allocator&). + All other pointer types would implicitly convert to \c bool, + use an explicit cast instead, if needed. + \note Amortized constant time complexity. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericValue&)) + PushBack(T value, Allocator& allocator) { + GenericValue v(value); + return PushBack(v, allocator); + } + + //! Remove the last element in the array. + /*! + \note Constant time complexity. + */ + GenericValue& PopBack() { + RAPIDJSON_ASSERT(IsArray()); + RAPIDJSON_ASSERT(!Empty()); + GetElementsPointer()[--data_.a.size].~GenericValue(); + return *this; + } + + //! Remove an element of array by iterator. + /*! + \param pos iterator to the element to remove + \pre IsArray() == true && \ref Begin() <= \c pos < \ref End() + \return Iterator following the removed element. If the iterator pos refers to the last element, the End() iterator is returned. + \note Linear time complexity. + */ + ValueIterator Erase(ConstValueIterator pos) { + return Erase(pos, pos + 1); + } + + //! Remove elements in the range [first, last) of the array. + /*! + \param first iterator to the first element to remove + \param last iterator following the last element to remove + \pre IsArray() == true && \ref Begin() <= \c first <= \c last <= \ref End() + \return Iterator following the last removed element. + \note Linear time complexity. + */ + ValueIterator Erase(ConstValueIterator first, ConstValueIterator last) { + RAPIDJSON_ASSERT(IsArray()); + RAPIDJSON_ASSERT(data_.a.size > 0); + RAPIDJSON_ASSERT(GetElementsPointer() != 0); + RAPIDJSON_ASSERT(first >= Begin()); + RAPIDJSON_ASSERT(first <= last); + RAPIDJSON_ASSERT(last <= End()); + ValueIterator pos = Begin() + (first - Begin()); + for (ValueIterator itr = pos; itr != last; ++itr) + itr->~GenericValue(); + std::memmove(pos, last, static_cast(End() - last) * sizeof(GenericValue)); + data_.a.size -= static_cast(last - first); + return pos; + } + + Array GetArray() { RAPIDJSON_ASSERT(IsArray()); return Array(*this); } + ConstArray GetArray() const { RAPIDJSON_ASSERT(IsArray()); return ConstArray(*this); } + + //@} + + //!@name Number + //@{ + + int GetInt() const { RAPIDJSON_ASSERT(data_.f.flags & kIntFlag); return data_.n.i.i; } + unsigned GetUint() const { RAPIDJSON_ASSERT(data_.f.flags & kUintFlag); return data_.n.u.u; } + int64_t GetInt64() const { RAPIDJSON_ASSERT(data_.f.flags & kInt64Flag); return data_.n.i64; } + uint64_t GetUint64() const { RAPIDJSON_ASSERT(data_.f.flags & kUint64Flag); return data_.n.u64; } + + //! Get the value as double type. + /*! \note If the value is 64-bit integer type, it may lose precision. Use \c IsLosslessDouble() to check whether the converison is lossless. + */ + double GetDouble() const { + RAPIDJSON_ASSERT(IsNumber()); + if ((data_.f.flags & kDoubleFlag) != 0) return data_.n.d; // exact type, no conversion. + if ((data_.f.flags & kIntFlag) != 0) return data_.n.i.i; // int -> double + if ((data_.f.flags & kUintFlag) != 0) return data_.n.u.u; // unsigned -> double + if ((data_.f.flags & kInt64Flag) != 0) return static_cast(data_.n.i64); // int64_t -> double (may lose precision) + RAPIDJSON_ASSERT((data_.f.flags & kUint64Flag) != 0); return static_cast(data_.n.u64); // uint64_t -> double (may lose precision) + } + + //! Get the value as float type. + /*! \note If the value is 64-bit integer type, it may lose precision. Use \c IsLosslessFloat() to check whether the converison is lossless. + */ + float GetFloat() const { + return static_cast(GetDouble()); + } + + GenericValue& SetInt(int i) { this->~GenericValue(); new (this) GenericValue(i); return *this; } + GenericValue& SetUint(unsigned u) { this->~GenericValue(); new (this) GenericValue(u); return *this; } + GenericValue& SetInt64(int64_t i64) { this->~GenericValue(); new (this) GenericValue(i64); return *this; } + GenericValue& SetUint64(uint64_t u64) { this->~GenericValue(); new (this) GenericValue(u64); return *this; } + GenericValue& SetDouble(double d) { this->~GenericValue(); new (this) GenericValue(d); return *this; } + GenericValue& SetFloat(float f) { this->~GenericValue(); new (this) GenericValue(f); return *this; } + + //@} + + //!@name String + //@{ + + const Ch* GetString() const { RAPIDJSON_ASSERT(IsString()); return (data_.f.flags & kInlineStrFlag) ? data_.ss.str : GetStringPointer(); } + + //! Get the length of string. + /*! Since rapidjson permits "\\u0000" in the json string, strlen(v.GetString()) may not equal to v.GetStringLength(). + */ + SizeType GetStringLength() const { RAPIDJSON_ASSERT(IsString()); return ((data_.f.flags & kInlineStrFlag) ? (data_.ss.GetLength()) : data_.s.length); } + + //! Set this value as a string without copying source string. + /*! This version has better performance with supplied length, and also support string containing null character. + \param s source string pointer. + \param length The length of source string, excluding the trailing null terminator. + \return The value itself for fluent API. + \post IsString() == true && GetString() == s && GetStringLength() == length + \see SetString(StringRefType) + */ + GenericValue& SetString(const Ch* s, SizeType length) { return SetString(StringRef(s, length)); } + + //! Set this value as a string without copying source string. + /*! \param s source string reference + \return The value itself for fluent API. + \post IsString() == true && GetString() == s && GetStringLength() == s.length + */ + GenericValue& SetString(StringRefType s) { this->~GenericValue(); SetStringRaw(s); return *this; } + + //! Set this value as a string by copying from source string. + /*! This version has better performance with supplied length, and also support string containing null character. + \param s source string. + \param length The length of source string, excluding the trailing null terminator. + \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \post IsString() == true && GetString() != s && strcmp(GetString(),s) == 0 && GetStringLength() == length + */ + GenericValue& SetString(const Ch* s, SizeType length, Allocator& allocator) { this->~GenericValue(); SetStringRaw(StringRef(s, length), allocator); return *this; } + + //! Set this value as a string by copying from source string. + /*! \param s source string. + \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \post IsString() == true && GetString() != s && strcmp(GetString(),s) == 0 && GetStringLength() == length + */ + GenericValue& SetString(const Ch* s, Allocator& allocator) { return SetString(s, internal::StrLen(s), allocator); } + +#if RAPIDJSON_HAS_STDSTRING + //! Set this value as a string by copying from source string. + /*! \param s source string. + \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \post IsString() == true && GetString() != s.data() && strcmp(GetString(),s.data() == 0 && GetStringLength() == s.size() + \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. + */ + GenericValue& SetString(const std::basic_string& s, Allocator& allocator) { return SetString(s.data(), SizeType(s.size()), allocator); } +#endif + + //@} + + //!@name Array + //@{ + + //! Templated version for checking whether this value is type T. + /*! + \tparam T Either \c bool, \c int, \c unsigned, \c int64_t, \c uint64_t, \c double, \c float, \c const \c char*, \c std::basic_string + */ + template + bool Is() const { return internal::TypeHelper::Is(*this); } + + template + T Get() const { return internal::TypeHelper::Get(*this); } + + template + T Get() { return internal::TypeHelper::Get(*this); } + + template + ValueType& Set(const T& data) { return internal::TypeHelper::Set(*this, data); } + + template + ValueType& Set(const T& data, AllocatorType& allocator) { return internal::TypeHelper::Set(*this, data, allocator); } + + //@} + + //! Generate events of this value to a Handler. + /*! This function adopts the GoF visitor pattern. + Typical usage is to output this JSON value as JSON text via Writer, which is a Handler. + It can also be used to deep clone this value via GenericDocument, which is also a Handler. + \tparam Handler type of handler. + \param handler An object implementing concept Handler. + */ + template + bool Accept(Handler& handler) const { + switch(GetType()) { + case kNullType: return handler.Null(); + case kFalseType: return handler.Bool(false); + case kTrueType: return handler.Bool(true); + + case kObjectType: + if (RAPIDJSON_UNLIKELY(!handler.StartObject())) + return false; + for (ConstMemberIterator m = MemberBegin(); m != MemberEnd(); ++m) { + RAPIDJSON_ASSERT(m->name.IsString()); // User may change the type of name by MemberIterator. + if (RAPIDJSON_UNLIKELY(!handler.Key(m->name.GetString(), m->name.GetStringLength(), (m->name.data_.f.flags & kCopyFlag) != 0))) + return false; + if (RAPIDJSON_UNLIKELY(!m->value.Accept(handler))) + return false; + } + return handler.EndObject(data_.o.size); + + case kArrayType: + if (RAPIDJSON_UNLIKELY(!handler.StartArray())) + return false; + for (const GenericValue* v = Begin(); v != End(); ++v) + if (RAPIDJSON_UNLIKELY(!v->Accept(handler))) + return false; + return handler.EndArray(data_.a.size); + + case kStringType: + return handler.String(GetString(), GetStringLength(), (data_.f.flags & kCopyFlag) != 0); + + default: + RAPIDJSON_ASSERT(GetType() == kNumberType); + if (IsDouble()) return handler.Double(data_.n.d); + else if (IsInt()) return handler.Int(data_.n.i.i); + else if (IsUint()) return handler.Uint(data_.n.u.u); + else if (IsInt64()) return handler.Int64(data_.n.i64); + else return handler.Uint64(data_.n.u64); + } + } + +private: + template friend class GenericValue; + template friend class GenericDocument; + + enum { + kBoolFlag = 0x0008, + kNumberFlag = 0x0010, + kIntFlag = 0x0020, + kUintFlag = 0x0040, + kInt64Flag = 0x0080, + kUint64Flag = 0x0100, + kDoubleFlag = 0x0200, + kStringFlag = 0x0400, + kCopyFlag = 0x0800, + kInlineStrFlag = 0x1000, + + // Initial flags of different types. + kNullFlag = kNullType, + kTrueFlag = kTrueType | kBoolFlag, + kFalseFlag = kFalseType | kBoolFlag, + kNumberIntFlag = kNumberType | kNumberFlag | kIntFlag | kInt64Flag, + kNumberUintFlag = kNumberType | kNumberFlag | kUintFlag | kUint64Flag | kInt64Flag, + kNumberInt64Flag = kNumberType | kNumberFlag | kInt64Flag, + kNumberUint64Flag = kNumberType | kNumberFlag | kUint64Flag, + kNumberDoubleFlag = kNumberType | kNumberFlag | kDoubleFlag, + kNumberAnyFlag = kNumberType | kNumberFlag | kIntFlag | kInt64Flag | kUintFlag | kUint64Flag | kDoubleFlag, + kConstStringFlag = kStringType | kStringFlag, + kCopyStringFlag = kStringType | kStringFlag | kCopyFlag, + kShortStringFlag = kStringType | kStringFlag | kCopyFlag | kInlineStrFlag, + kObjectFlag = kObjectType, + kArrayFlag = kArrayType, + + kTypeMask = 0x07 + }; + + static const SizeType kDefaultArrayCapacity = 16; + static const SizeType kDefaultObjectCapacity = 16; + + struct Flag { +#if RAPIDJSON_48BITPOINTER_OPTIMIZATION + char payload[sizeof(SizeType) * 2 + 6]; // 2 x SizeType + lower 48-bit pointer +#elif RAPIDJSON_64BIT + char payload[sizeof(SizeType) * 2 + sizeof(void*) + 6]; // 6 padding bytes +#else + char payload[sizeof(SizeType) * 2 + sizeof(void*) + 2]; // 2 padding bytes +#endif + uint16_t flags; + }; + + struct String { + SizeType length; + SizeType hashcode; //!< reserved + const Ch* str; + }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + // implementation detail: ShortString can represent zero-terminated strings up to MaxSize chars + // (excluding the terminating zero) and store a value to determine the length of the contained + // string in the last character str[LenPos] by storing "MaxSize - length" there. If the string + // to store has the maximal length of MaxSize then str[LenPos] will be 0 and therefore act as + // the string terminator as well. For getting the string length back from that value just use + // "MaxSize - str[LenPos]". + // This allows to store 13-chars strings in 32-bit mode, 21-chars strings in 64-bit mode, + // 13-chars strings for RAPIDJSON_48BITPOINTER_OPTIMIZATION=1 inline (for `UTF8`-encoded strings). + struct ShortString { + enum { MaxChars = sizeof(static_cast(0)->payload) / sizeof(Ch), MaxSize = MaxChars - 1, LenPos = MaxSize }; + Ch str[MaxChars]; + + inline static bool Usable(SizeType len) { return (MaxSize >= len); } + inline void SetLength(SizeType len) { str[LenPos] = static_cast(MaxSize - len); } + inline SizeType GetLength() const { return static_cast(MaxSize - str[LenPos]); } + }; // at most as many bytes as "String" above => 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + // By using proper binary layout, retrieval of different integer types do not need conversions. + union Number { +#if RAPIDJSON_ENDIAN == RAPIDJSON_LITTLEENDIAN + struct I { + int i; + char padding[4]; + }i; + struct U { + unsigned u; + char padding2[4]; + }u; +#else + struct I { + char padding[4]; + int i; + }i; + struct U { + char padding2[4]; + unsigned u; + }u; +#endif + int64_t i64; + uint64_t u64; + double d; + }; // 8 bytes + + struct ObjectData { + SizeType size; + SizeType capacity; + Member* members; + }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + struct ArrayData { + SizeType size; + SizeType capacity; + GenericValue* elements; + }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + union Data { + String s; + ShortString ss; + Number n; + ObjectData o; + ArrayData a; + Flag f; + }; // 16 bytes in 32-bit mode, 24 bytes in 64-bit mode, 16 bytes in 64-bit with RAPIDJSON_48BITPOINTER_OPTIMIZATION + + RAPIDJSON_FORCEINLINE const Ch* GetStringPointer() const { return RAPIDJSON_GETPOINTER(Ch, data_.s.str); } + RAPIDJSON_FORCEINLINE const Ch* SetStringPointer(const Ch* str) { return RAPIDJSON_SETPOINTER(Ch, data_.s.str, str); } + RAPIDJSON_FORCEINLINE GenericValue* GetElementsPointer() const { return RAPIDJSON_GETPOINTER(GenericValue, data_.a.elements); } + RAPIDJSON_FORCEINLINE GenericValue* SetElementsPointer(GenericValue* elements) { return RAPIDJSON_SETPOINTER(GenericValue, data_.a.elements, elements); } + RAPIDJSON_FORCEINLINE Member* GetMembersPointer() const { return RAPIDJSON_GETPOINTER(Member, data_.o.members); } + RAPIDJSON_FORCEINLINE Member* SetMembersPointer(Member* members) { return RAPIDJSON_SETPOINTER(Member, data_.o.members, members); } + + // Initialize this value as array with initial data, without calling destructor. + void SetArrayRaw(GenericValue* values, SizeType count, Allocator& allocator) { + data_.f.flags = kArrayFlag; + if (count) { + GenericValue* e = static_cast(allocator.Malloc(count * sizeof(GenericValue))); + SetElementsPointer(e); + std::memcpy(e, values, count * sizeof(GenericValue)); + } + else + SetElementsPointer(0); + data_.a.size = data_.a.capacity = count; + } + + //! Initialize this value as object with initial data, without calling destructor. + void SetObjectRaw(Member* members, SizeType count, Allocator& allocator) { + data_.f.flags = kObjectFlag; + if (count) { + Member* m = static_cast(allocator.Malloc(count * sizeof(Member))); + SetMembersPointer(m); + std::memcpy(m, members, count * sizeof(Member)); + } + else + SetMembersPointer(0); + data_.o.size = data_.o.capacity = count; + } + + //! Initialize this value as constant string, without calling destructor. + void SetStringRaw(StringRefType s) RAPIDJSON_NOEXCEPT { + data_.f.flags = kConstStringFlag; + SetStringPointer(s); + data_.s.length = s.length; + } + + //! Initialize this value as copy string with initial data, without calling destructor. + void SetStringRaw(StringRefType s, Allocator& allocator) { + Ch* str = 0; + if (ShortString::Usable(s.length)) { + data_.f.flags = kShortStringFlag; + data_.ss.SetLength(s.length); + str = data_.ss.str; + } else { + data_.f.flags = kCopyStringFlag; + data_.s.length = s.length; + str = static_cast(allocator.Malloc((s.length + 1) * sizeof(Ch))); + SetStringPointer(str); + } + std::memcpy(str, s, s.length * sizeof(Ch)); + str[s.length] = '\0'; + } + + //! Assignment without calling destructor + void RawAssign(GenericValue& rhs) RAPIDJSON_NOEXCEPT { + data_ = rhs.data_; + // data_.f.flags = rhs.data_.f.flags; + rhs.data_.f.flags = kNullFlag; + } + + template + bool StringEqual(const GenericValue& rhs) const { + RAPIDJSON_ASSERT(IsString()); + RAPIDJSON_ASSERT(rhs.IsString()); + + const SizeType len1 = GetStringLength(); + const SizeType len2 = rhs.GetStringLength(); + if(len1 != len2) { return false; } + + const Ch* const str1 = GetString(); + const Ch* const str2 = rhs.GetString(); + if(str1 == str2) { return true; } // fast path for constant string + + return (std::memcmp(str1, str2, sizeof(Ch) * len1) == 0); + } + + Data data_; +}; + +//! GenericValue with UTF8 encoding +typedef GenericValue > Value; + +/////////////////////////////////////////////////////////////////////////////// +// GenericDocument + +//! A document for parsing JSON text as DOM. +/*! + \note implements Handler concept + \tparam Encoding Encoding for both parsing and string storage. + \tparam Allocator Allocator for allocating memory for the DOM + \tparam StackAllocator Allocator for allocating memory for stack during parsing. + \warning Although GenericDocument inherits from GenericValue, the API does \b not provide any virtual functions, especially no virtual destructor. To avoid memory leaks, do not \c delete a GenericDocument object via a pointer to a GenericValue. +*/ +template , typename StackAllocator = CrtAllocator> +class GenericDocument : public GenericValue { +public: + typedef typename Encoding::Ch Ch; //!< Character type derived from Encoding. + typedef GenericValue ValueType; //!< Value type of the document. + typedef Allocator AllocatorType; //!< Allocator type from template parameter. + + //! Constructor + /*! Creates an empty document of specified type. + \param type Mandatory type of object to create. + \param allocator Optional allocator for allocating memory. + \param stackCapacity Optional initial capacity of stack in bytes. + \param stackAllocator Optional allocator for allocating memory for stack. + */ + explicit GenericDocument(Type type, Allocator* allocator = 0, size_t stackCapacity = kDefaultStackCapacity, StackAllocator* stackAllocator = 0) : + GenericValue(type), allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_() + { + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator()); + } + + //! Constructor + /*! Creates an empty document which type is Null. + \param allocator Optional allocator for allocating memory. + \param stackCapacity Optional initial capacity of stack in bytes. + \param stackAllocator Optional allocator for allocating memory for stack. + */ + GenericDocument(Allocator* allocator = 0, size_t stackCapacity = kDefaultStackCapacity, StackAllocator* stackAllocator = 0) : + allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_() + { + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator()); + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move constructor in C++11 + GenericDocument(GenericDocument&& rhs) RAPIDJSON_NOEXCEPT + : ValueType(std::forward(rhs)), // explicit cast to avoid prohibited move from Document + allocator_(rhs.allocator_), + ownAllocator_(rhs.ownAllocator_), + stack_(std::move(rhs.stack_)), + parseResult_(rhs.parseResult_) + { + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.parseResult_ = ParseResult(); + } +#endif + + ~GenericDocument() { + Destroy(); + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move assignment in C++11 + GenericDocument& operator=(GenericDocument&& rhs) RAPIDJSON_NOEXCEPT + { + // The cast to ValueType is necessary here, because otherwise it would + // attempt to call GenericValue's templated assignment operator. + ValueType::operator=(std::forward(rhs)); + + // Calling the destructor here would prematurely call stack_'s destructor + Destroy(); + + allocator_ = rhs.allocator_; + ownAllocator_ = rhs.ownAllocator_; + stack_ = std::move(rhs.stack_); + parseResult_ = rhs.parseResult_; + + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.parseResult_ = ParseResult(); + + return *this; + } +#endif + + //! Exchange the contents of this document with those of another. + /*! + \param rhs Another document. + \note Constant complexity. + \see GenericValue::Swap + */ + GenericDocument& Swap(GenericDocument& rhs) RAPIDJSON_NOEXCEPT { + ValueType::Swap(rhs); + stack_.Swap(rhs.stack_); + internal::Swap(allocator_, rhs.allocator_); + internal::Swap(ownAllocator_, rhs.ownAllocator_); + internal::Swap(parseResult_, rhs.parseResult_); + return *this; + } + + //! free-standing swap function helper + /*! + Helper function to enable support for common swap implementation pattern based on \c std::swap: + \code + void swap(MyClass& a, MyClass& b) { + using std::swap; + swap(a.doc, b.doc); + // ... + } + \endcode + \see Swap() + */ + friend inline void swap(GenericDocument& a, GenericDocument& b) RAPIDJSON_NOEXCEPT { a.Swap(b); } + + //! Populate this document by a generator which produces SAX events. + /*! \tparam Generator A functor with bool f(Handler) prototype. + \param g Generator functor which sends SAX events to the parameter. + \return The document itself for fluent API. + */ + template + GenericDocument& Populate(Generator& g) { + ClearStackOnExit scope(*this); + if (g(*this)) { + RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object + ValueType::operator=(*stack_.template Pop(1));// Move value from stack to document + } + return *this; + } + + //!@name Parse from stream + //!@{ + + //! Parse JSON text from an input stream (with Encoding conversion) + /*! \tparam parseFlags Combination of \ref ParseFlag. + \tparam SourceEncoding Encoding of input stream + \tparam InputStream Type of input stream, implementing Stream concept + \param is Input stream to be parsed. + \return The document itself for fluent API. + */ + template + GenericDocument& ParseStream(InputStream& is) { + GenericReader reader( + stack_.HasAllocator() ? &stack_.GetAllocator() : 0); + ClearStackOnExit scope(*this); + parseResult_ = reader.template Parse(is, *this); + if (parseResult_) { + RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object + ValueType::operator=(*stack_.template Pop(1));// Move value from stack to document + } + return *this; + } + + //! Parse JSON text from an input stream + /*! \tparam parseFlags Combination of \ref ParseFlag. + \tparam InputStream Type of input stream, implementing Stream concept + \param is Input stream to be parsed. + \return The document itself for fluent API. + */ + template + GenericDocument& ParseStream(InputStream& is) { + return ParseStream(is); + } + + //! Parse JSON text from an input stream (with \ref kParseDefaultFlags) + /*! \tparam InputStream Type of input stream, implementing Stream concept + \param is Input stream to be parsed. + \return The document itself for fluent API. + */ + template + GenericDocument& ParseStream(InputStream& is) { + return ParseStream(is); + } + //!@} + + //!@name Parse in-place from mutable string + //!@{ + + //! Parse JSON text from a mutable string + /*! \tparam parseFlags Combination of \ref ParseFlag. + \param str Mutable zero-terminated string to be parsed. + \return The document itself for fluent API. + */ + template + GenericDocument& ParseInsitu(Ch* str) { + GenericInsituStringStream s(str); + return ParseStream(s); + } + + //! Parse JSON text from a mutable string (with \ref kParseDefaultFlags) + /*! \param str Mutable zero-terminated string to be parsed. + \return The document itself for fluent API. + */ + GenericDocument& ParseInsitu(Ch* str) { + return ParseInsitu(str); + } + //!@} + + //!@name Parse from read-only string + //!@{ + + //! Parse JSON text from a read-only string (with Encoding conversion) + /*! \tparam parseFlags Combination of \ref ParseFlag (must not contain \ref kParseInsituFlag). + \tparam SourceEncoding Transcoding from input Encoding + \param str Read-only zero-terminated string to be parsed. + */ + template + GenericDocument& Parse(const typename SourceEncoding::Ch* str) { + RAPIDJSON_ASSERT(!(parseFlags & kParseInsituFlag)); + GenericStringStream s(str); + return ParseStream(s); + } + + //! Parse JSON text from a read-only string + /*! \tparam parseFlags Combination of \ref ParseFlag (must not contain \ref kParseInsituFlag). + \param str Read-only zero-terminated string to be parsed. + */ + template + GenericDocument& Parse(const Ch* str) { + return Parse(str); + } + + //! Parse JSON text from a read-only string (with \ref kParseDefaultFlags) + /*! \param str Read-only zero-terminated string to be parsed. + */ + GenericDocument& Parse(const Ch* str) { + return Parse(str); + } + + template + GenericDocument& Parse(const typename SourceEncoding::Ch* str, size_t length) { + RAPIDJSON_ASSERT(!(parseFlags & kParseInsituFlag)); + MemoryStream ms(static_cast(str), length * sizeof(typename SourceEncoding::Ch)); + EncodedInputStream is(ms); + ParseStream(is); + return *this; + } + + template + GenericDocument& Parse(const Ch* str, size_t length) { + return Parse(str, length); + } + + GenericDocument& Parse(const Ch* str, size_t length) { + return Parse(str, length); + } + +#if RAPIDJSON_HAS_STDSTRING + template + GenericDocument& Parse(const std::basic_string& str) { + // c_str() is constant complexity according to standard. Should be faster than Parse(const char*, size_t) + return Parse(str.c_str()); + } + + template + GenericDocument& Parse(const std::basic_string& str) { + return Parse(str.c_str()); + } + + GenericDocument& Parse(const std::basic_string& str) { + return Parse(str); + } +#endif // RAPIDJSON_HAS_STDSTRING + + //!@} + + //!@name Handling parse errors + //!@{ + + //! Whether a parse error has occured in the last parsing. + bool HasParseError() const { return parseResult_.IsError(); } + + //! Get the \ref ParseErrorCode of last parsing. + ParseErrorCode GetParseError() const { return parseResult_.Code(); } + + //! Get the position of last parsing error in input, 0 otherwise. + size_t GetErrorOffset() const { return parseResult_.Offset(); } + + //! Implicit conversion to get the last parse result +#ifndef __clang // -Wdocumentation + /*! \return \ref ParseResult of the last parse operation + + \code + Document doc; + ParseResult ok = doc.Parse(json); + if (!ok) + printf( "JSON parse error: %s (%u)\n", GetParseError_En(ok.Code()), ok.Offset()); + \endcode + */ +#endif + operator ParseResult() const { return parseResult_; } + //!@} + + //! Get the allocator of this document. + Allocator& GetAllocator() { + RAPIDJSON_ASSERT(allocator_); + return *allocator_; + } + + //! Get the capacity of stack in bytes. + size_t GetStackCapacity() const { return stack_.GetCapacity(); } + +private: + // clear stack on any exit from ParseStream, e.g. due to exception + struct ClearStackOnExit { + explicit ClearStackOnExit(GenericDocument& d) : d_(d) {} + ~ClearStackOnExit() { d_.ClearStack(); } + private: + ClearStackOnExit(const ClearStackOnExit&); + ClearStackOnExit& operator=(const ClearStackOnExit&); + GenericDocument& d_; + }; + + // callers of the following private Handler functions + // template friend class GenericReader; // for parsing + template friend class GenericValue; // for deep copying + +public: + // Implementation of Handler + bool Null() { new (stack_.template Push()) ValueType(); return true; } + bool Bool(bool b) { new (stack_.template Push()) ValueType(b); return true; } + bool Int(int i) { new (stack_.template Push()) ValueType(i); return true; } + bool Uint(unsigned i) { new (stack_.template Push()) ValueType(i); return true; } + bool Int64(int64_t i) { new (stack_.template Push()) ValueType(i); return true; } + bool Uint64(uint64_t i) { new (stack_.template Push()) ValueType(i); return true; } + bool Double(double d) { new (stack_.template Push()) ValueType(d); return true; } + + bool RawNumber(const Ch* str, SizeType length, bool copy) { + if (copy) + new (stack_.template Push()) ValueType(str, length, GetAllocator()); + else + new (stack_.template Push()) ValueType(str, length); + return true; + } + + bool String(const Ch* str, SizeType length, bool copy) { + if (copy) + new (stack_.template Push()) ValueType(str, length, GetAllocator()); + else + new (stack_.template Push()) ValueType(str, length); + return true; + } + + bool StartObject() { new (stack_.template Push()) ValueType(kObjectType); return true; } + + bool Key(const Ch* str, SizeType length, bool copy) { return String(str, length, copy); } + + bool EndObject(SizeType memberCount) { + typename ValueType::Member* members = stack_.template Pop(memberCount); + stack_.template Top()->SetObjectRaw(members, memberCount, GetAllocator()); + return true; + } + + bool StartArray() { new (stack_.template Push()) ValueType(kArrayType); return true; } + + bool EndArray(SizeType elementCount) { + ValueType* elements = stack_.template Pop(elementCount); + stack_.template Top()->SetArrayRaw(elements, elementCount, GetAllocator()); + return true; + } + +private: + //! Prohibit copying + GenericDocument(const GenericDocument&); + //! Prohibit assignment + GenericDocument& operator=(const GenericDocument&); + + void ClearStack() { + if (Allocator::kNeedFree) + while (stack_.GetSize() > 0) // Here assumes all elements in stack array are GenericValue (Member is actually 2 GenericValue objects) + (stack_.template Pop(1))->~ValueType(); + else + stack_.Clear(); + stack_.ShrinkToFit(); + } + + void Destroy() { + RAPIDJSON_DELETE(ownAllocator_); + } + + static const size_t kDefaultStackCapacity = 1024; + Allocator* allocator_; + Allocator* ownAllocator_; + internal::Stack stack_; + ParseResult parseResult_; +}; + +//! GenericDocument with UTF8 encoding +typedef GenericDocument > Document; + +// defined here due to the dependency on GenericDocument +template +template +inline +GenericValue::GenericValue(const GenericValue& rhs, Allocator& allocator) +{ + switch (rhs.GetType()) { + case kObjectType: + case kArrayType: { // perform deep copy via SAX Handler + GenericDocument d(&allocator); + rhs.Accept(d); + RawAssign(*d.stack_.template Pop(1)); + } + break; + case kStringType: + if (rhs.data_.f.flags == kConstStringFlag) { + data_.f.flags = rhs.data_.f.flags; + data_ = *reinterpret_cast(&rhs.data_); + } else { + SetStringRaw(StringRef(rhs.GetString(), rhs.GetStringLength()), allocator); + } + break; + default: + data_.f.flags = rhs.data_.f.flags; + data_ = *reinterpret_cast(&rhs.data_); + break; + } +} + +//! Helper class for accessing Value of array type. +/*! + Instance of this helper class is obtained by \c GenericValue::GetArray(). + In addition to all APIs for array type, it provides range-based for loop if \c RAPIDJSON_HAS_CXX11_RANGE_FOR=1. +*/ +template +class GenericArray { +public: + typedef GenericArray ConstArray; + typedef GenericArray Array; + typedef ValueT PlainType; + typedef typename internal::MaybeAddConst::Type ValueType; + typedef ValueType* ValueIterator; // This may be const or non-const iterator + typedef const ValueT* ConstValueIterator; + typedef typename ValueType::AllocatorType AllocatorType; + typedef typename ValueType::StringRefType StringRefType; + + template + friend class GenericValue; + + GenericArray(const GenericArray& rhs) : value_(rhs.value_) {} + GenericArray& operator=(const GenericArray& rhs) { value_ = rhs.value_; return *this; } + ~GenericArray() {} + + SizeType Size() const { return value_.Size(); } + SizeType Capacity() const { return value_.Capacity(); } + bool Empty() const { return value_.Empty(); } + void Clear() const { value_.Clear(); } + ValueType& operator[](SizeType index) const { return value_[index]; } + ValueIterator Begin() const { return value_.Begin(); } + ValueIterator End() const { return value_.End(); } + GenericArray Reserve(SizeType newCapacity, AllocatorType &allocator) const { value_.Reserve(newCapacity, allocator); return *this; } + GenericArray PushBack(ValueType& value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericArray PushBack(ValueType&& value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericArray PushBack(StringRefType value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } + template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (const GenericArray&)) PushBack(T value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } + GenericArray PopBack() const { value_.PopBack(); return *this; } + ValueIterator Erase(ConstValueIterator pos) const { return value_.Erase(pos); } + ValueIterator Erase(ConstValueIterator first, ConstValueIterator last) const { return value_.Erase(first, last); } + +#if RAPIDJSON_HAS_CXX11_RANGE_FOR + ValueIterator begin() const { return value_.Begin(); } + ValueIterator end() const { return value_.End(); } +#endif + +private: + GenericArray(); + GenericArray(ValueType& value) : value_(value) {} + ValueType& value_; +}; + +//! Helper class for accessing Value of object type. +/*! + Instance of this helper class is obtained by \c GenericValue::GetObject(). + In addition to all APIs for array type, it provides range-based for loop if \c RAPIDJSON_HAS_CXX11_RANGE_FOR=1. +*/ +template +class GenericObject { +public: + typedef GenericObject ConstObject; + typedef GenericObject Object; + typedef ValueT PlainType; + typedef typename internal::MaybeAddConst::Type ValueType; + typedef GenericMemberIterator MemberIterator; // This may be const or non-const iterator + typedef GenericMemberIterator ConstMemberIterator; + typedef typename ValueType::AllocatorType AllocatorType; + typedef typename ValueType::StringRefType StringRefType; + typedef typename ValueType::EncodingType EncodingType; + typedef typename ValueType::Ch Ch; + + template + friend class GenericValue; + + GenericObject(const GenericObject& rhs) : value_(rhs.value_) {} + GenericObject& operator=(const GenericObject& rhs) { value_ = rhs.value_; return *this; } + ~GenericObject() {} + + SizeType MemberCount() const { return value_.MemberCount(); } + bool ObjectEmpty() const { return value_.ObjectEmpty(); } + template ValueType& operator[](T* name) const { return value_[name]; } + template ValueType& operator[](const GenericValue& name) const { return value_[name]; } +#if RAPIDJSON_HAS_STDSTRING + ValueType& operator[](const std::basic_string& name) const { return value_[name]; } +#endif + MemberIterator MemberBegin() const { return value_.MemberBegin(); } + MemberIterator MemberEnd() const { return value_.MemberEnd(); } + bool HasMember(const Ch* name) const { return value_.HasMember(name); } +#if RAPIDJSON_HAS_STDSTRING + bool HasMember(const std::basic_string& name) const { return value_.HasMember(name); } +#endif + template bool HasMember(const GenericValue& name) const { return value_.HasMember(name); } + MemberIterator FindMember(const Ch* name) const { return value_.FindMember(name); } + template MemberIterator FindMember(const GenericValue& name) const { return value_.FindMember(name); } +#if RAPIDJSON_HAS_STDSTRING + MemberIterator FindMember(const std::basic_string& name) const { return value_.FindMember(name); } +#endif + GenericObject AddMember(ValueType& name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(ValueType& name, StringRefType value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } +#if RAPIDJSON_HAS_STDSTRING + GenericObject AddMember(ValueType& name, std::basic_string& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } +#endif + template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) AddMember(ValueType& name, T value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericObject AddMember(ValueType&& name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(ValueType&& name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(ValueType& name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(StringRefType name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericObject AddMember(StringRefType name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(StringRefType name, StringRefType value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericObject)) AddMember(StringRefType name, T value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + void RemoveAllMembers() { return value_.RemoveAllMembers(); } + bool RemoveMember(const Ch* name) const { return value_.RemoveMember(name); } +#if RAPIDJSON_HAS_STDSTRING + bool RemoveMember(const std::basic_string& name) const { return value_.RemoveMember(name); } +#endif + template bool RemoveMember(const GenericValue& name) const { return value_.RemoveMember(name); } + MemberIterator RemoveMember(MemberIterator m) const { return value_.RemoveMember(m); } + MemberIterator EraseMember(ConstMemberIterator pos) const { return value_.EraseMember(pos); } + MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last) const { return value_.EraseMember(first, last); } + bool EraseMember(const Ch* name) const { return value_.EraseMember(name); } +#if RAPIDJSON_HAS_STDSTRING + bool EraseMember(const std::basic_string& name) const { return EraseMember(ValueType(StringRef(name))); } +#endif + template bool EraseMember(const GenericValue& name) const { return value_.EraseMember(name); } + +#if RAPIDJSON_HAS_CXX11_RANGE_FOR + MemberIterator begin() const { return value_.MemberBegin(); } + MemberIterator end() const { return value_.MemberEnd(); } +#endif + +private: + GenericObject(); + GenericObject(ValueType& value) : value_(value) {} + ValueType& value_; +}; + +RAPIDJSON_NAMESPACE_END +RAPIDJSON_DIAG_POP + +#endif // RAPIDJSON_DOCUMENT_H_ diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/encodedstream.h b/Externals/discord-rpc/thirdparty/include/rapidjson/encodedstream.h new file mode 100644 index 0000000000..145068386a --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/encodedstream.h @@ -0,0 +1,299 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_ENCODEDSTREAM_H_ +#define RAPIDJSON_ENCODEDSTREAM_H_ + +#include "stream.h" +#include "memorystream.h" + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Input byte stream wrapper with a statically bound encoding. +/*! + \tparam Encoding The interpretation of encoding of the stream. Either UTF8, UTF16LE, UTF16BE, UTF32LE, UTF32BE. + \tparam InputByteStream Type of input byte stream. For example, FileReadStream. +*/ +template +class EncodedInputStream { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); +public: + typedef typename Encoding::Ch Ch; + + EncodedInputStream(InputByteStream& is) : is_(is) { + current_ = Encoding::TakeBOM(is_); + } + + Ch Peek() const { return current_; } + Ch Take() { Ch c = current_; current_ = Encoding::Take(is_); return c; } + size_t Tell() const { return is_.Tell(); } + + // Not implemented + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + EncodedInputStream(const EncodedInputStream&); + EncodedInputStream& operator=(const EncodedInputStream&); + + InputByteStream& is_; + Ch current_; +}; + +//! Specialized for UTF8 MemoryStream. +template <> +class EncodedInputStream, MemoryStream> { +public: + typedef UTF8<>::Ch Ch; + + EncodedInputStream(MemoryStream& is) : is_(is) { + if (static_cast(is_.Peek()) == 0xEFu) is_.Take(); + if (static_cast(is_.Peek()) == 0xBBu) is_.Take(); + if (static_cast(is_.Peek()) == 0xBFu) is_.Take(); + } + Ch Peek() const { return is_.Peek(); } + Ch Take() { return is_.Take(); } + size_t Tell() const { return is_.Tell(); } + + // Not implemented + void Put(Ch) {} + void Flush() {} + Ch* PutBegin() { return 0; } + size_t PutEnd(Ch*) { return 0; } + + MemoryStream& is_; + +private: + EncodedInputStream(const EncodedInputStream&); + EncodedInputStream& operator=(const EncodedInputStream&); +}; + +//! Output byte stream wrapper with statically bound encoding. +/*! + \tparam Encoding The interpretation of encoding of the stream. Either UTF8, UTF16LE, UTF16BE, UTF32LE, UTF32BE. + \tparam OutputByteStream Type of input byte stream. For example, FileWriteStream. +*/ +template +class EncodedOutputStream { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); +public: + typedef typename Encoding::Ch Ch; + + EncodedOutputStream(OutputByteStream& os, bool putBOM = true) : os_(os) { + if (putBOM) + Encoding::PutBOM(os_); + } + + void Put(Ch c) { Encoding::Put(os_, c); } + void Flush() { os_.Flush(); } + + // Not implemented + Ch Peek() const { RAPIDJSON_ASSERT(false); return 0;} + Ch Take() { RAPIDJSON_ASSERT(false); return 0;} + size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + EncodedOutputStream(const EncodedOutputStream&); + EncodedOutputStream& operator=(const EncodedOutputStream&); + + OutputByteStream& os_; +}; + +#define RAPIDJSON_ENCODINGS_FUNC(x) UTF8::x, UTF16LE::x, UTF16BE::x, UTF32LE::x, UTF32BE::x + +//! Input stream wrapper with dynamically bound encoding and automatic encoding detection. +/*! + \tparam CharType Type of character for reading. + \tparam InputByteStream type of input byte stream to be wrapped. +*/ +template +class AutoUTFInputStream { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); +public: + typedef CharType Ch; + + //! Constructor. + /*! + \param is input stream to be wrapped. + \param type UTF encoding type if it is not detected from the stream. + */ + AutoUTFInputStream(InputByteStream& is, UTFType type = kUTF8) : is_(&is), type_(type), hasBOM_(false) { + RAPIDJSON_ASSERT(type >= kUTF8 && type <= kUTF32BE); + DetectType(); + static const TakeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Take) }; + takeFunc_ = f[type_]; + current_ = takeFunc_(*is_); + } + + UTFType GetType() const { return type_; } + bool HasBOM() const { return hasBOM_; } + + Ch Peek() const { return current_; } + Ch Take() { Ch c = current_; current_ = takeFunc_(*is_); return c; } + size_t Tell() const { return is_->Tell(); } + + // Not implemented + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + AutoUTFInputStream(const AutoUTFInputStream&); + AutoUTFInputStream& operator=(const AutoUTFInputStream&); + + // Detect encoding type with BOM or RFC 4627 + void DetectType() { + // BOM (Byte Order Mark): + // 00 00 FE FF UTF-32BE + // FF FE 00 00 UTF-32LE + // FE FF UTF-16BE + // FF FE UTF-16LE + // EF BB BF UTF-8 + + const unsigned char* c = reinterpret_cast(is_->Peek4()); + if (!c) + return; + + unsigned bom = static_cast(c[0] | (c[1] << 8) | (c[2] << 16) | (c[3] << 24)); + hasBOM_ = false; + if (bom == 0xFFFE0000) { type_ = kUTF32BE; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); is_->Take(); } + else if (bom == 0x0000FEFF) { type_ = kUTF32LE; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); is_->Take(); } + else if ((bom & 0xFFFF) == 0xFFFE) { type_ = kUTF16BE; hasBOM_ = true; is_->Take(); is_->Take(); } + else if ((bom & 0xFFFF) == 0xFEFF) { type_ = kUTF16LE; hasBOM_ = true; is_->Take(); is_->Take(); } + else if ((bom & 0xFFFFFF) == 0xBFBBEF) { type_ = kUTF8; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); } + + // RFC 4627: Section 3 + // "Since the first two characters of a JSON text will always be ASCII + // characters [RFC0020], it is possible to determine whether an octet + // stream is UTF-8, UTF-16 (BE or LE), or UTF-32 (BE or LE) by looking + // at the pattern of nulls in the first four octets." + // 00 00 00 xx UTF-32BE + // 00 xx 00 xx UTF-16BE + // xx 00 00 00 UTF-32LE + // xx 00 xx 00 UTF-16LE + // xx xx xx xx UTF-8 + + if (!hasBOM_) { + unsigned pattern = (c[0] ? 1 : 0) | (c[1] ? 2 : 0) | (c[2] ? 4 : 0) | (c[3] ? 8 : 0); + switch (pattern) { + case 0x08: type_ = kUTF32BE; break; + case 0x0A: type_ = kUTF16BE; break; + case 0x01: type_ = kUTF32LE; break; + case 0x05: type_ = kUTF16LE; break; + case 0x0F: type_ = kUTF8; break; + default: break; // Use type defined by user. + } + } + + // Runtime check whether the size of character type is sufficient. It only perform checks with assertion. + if (type_ == kUTF16LE || type_ == kUTF16BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 2); + if (type_ == kUTF32LE || type_ == kUTF32BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 4); + } + + typedef Ch (*TakeFunc)(InputByteStream& is); + InputByteStream* is_; + UTFType type_; + Ch current_; + TakeFunc takeFunc_; + bool hasBOM_; +}; + +//! Output stream wrapper with dynamically bound encoding and automatic encoding detection. +/*! + \tparam CharType Type of character for writing. + \tparam OutputByteStream type of output byte stream to be wrapped. +*/ +template +class AutoUTFOutputStream { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); +public: + typedef CharType Ch; + + //! Constructor. + /*! + \param os output stream to be wrapped. + \param type UTF encoding type. + \param putBOM Whether to write BOM at the beginning of the stream. + */ + AutoUTFOutputStream(OutputByteStream& os, UTFType type, bool putBOM) : os_(&os), type_(type) { + RAPIDJSON_ASSERT(type >= kUTF8 && type <= kUTF32BE); + + // Runtime check whether the size of character type is sufficient. It only perform checks with assertion. + if (type_ == kUTF16LE || type_ == kUTF16BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 2); + if (type_ == kUTF32LE || type_ == kUTF32BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 4); + + static const PutFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Put) }; + putFunc_ = f[type_]; + + if (putBOM) + PutBOM(); + } + + UTFType GetType() const { return type_; } + + void Put(Ch c) { putFunc_(*os_, c); } + void Flush() { os_->Flush(); } + + // Not implemented + Ch Peek() const { RAPIDJSON_ASSERT(false); return 0;} + Ch Take() { RAPIDJSON_ASSERT(false); return 0;} + size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + AutoUTFOutputStream(const AutoUTFOutputStream&); + AutoUTFOutputStream& operator=(const AutoUTFOutputStream&); + + void PutBOM() { + typedef void (*PutBOMFunc)(OutputByteStream&); + static const PutBOMFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(PutBOM) }; + f[type_](*os_); + } + + typedef void (*PutFunc)(OutputByteStream&, Ch); + + OutputByteStream* os_; + UTFType type_; + PutFunc putFunc_; +}; + +#undef RAPIDJSON_ENCODINGS_FUNC + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_FILESTREAM_H_ diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/encodings.h b/Externals/discord-rpc/thirdparty/include/rapidjson/encodings.h new file mode 100644 index 0000000000..baa7c2b17f --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/encodings.h @@ -0,0 +1,716 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_ENCODINGS_H_ +#define RAPIDJSON_ENCODINGS_H_ + +#include "rapidjson.h" + +#ifdef _MSC_VER +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4244) // conversion from 'type1' to 'type2', possible loss of data +RAPIDJSON_DIAG_OFF(4702) // unreachable code +#elif defined(__GNUC__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +RAPIDJSON_DIAG_OFF(overflow) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// Encoding + +/*! \class rapidjson::Encoding + \brief Concept for encoding of Unicode characters. + +\code +concept Encoding { + typename Ch; //! Type of character. A "character" is actually a code unit in unicode's definition. + + enum { supportUnicode = 1 }; // or 0 if not supporting unicode + + //! \brief Encode a Unicode codepoint to an output stream. + //! \param os Output stream. + //! \param codepoint An unicode codepoint, ranging from 0x0 to 0x10FFFF inclusively. + template + static void Encode(OutputStream& os, unsigned codepoint); + + //! \brief Decode a Unicode codepoint from an input stream. + //! \param is Input stream. + //! \param codepoint Output of the unicode codepoint. + //! \return true if a valid codepoint can be decoded from the stream. + template + static bool Decode(InputStream& is, unsigned* codepoint); + + //! \brief Validate one Unicode codepoint from an encoded stream. + //! \param is Input stream to obtain codepoint. + //! \param os Output for copying one codepoint. + //! \return true if it is valid. + //! \note This function just validating and copying the codepoint without actually decode it. + template + static bool Validate(InputStream& is, OutputStream& os); + + // The following functions are deal with byte streams. + + //! Take a character from input byte stream, skip BOM if exist. + template + static CharType TakeBOM(InputByteStream& is); + + //! Take a character from input byte stream. + template + static Ch Take(InputByteStream& is); + + //! Put BOM to output byte stream. + template + static void PutBOM(OutputByteStream& os); + + //! Put a character to output byte stream. + template + static void Put(OutputByteStream& os, Ch c); +}; +\endcode +*/ + +/////////////////////////////////////////////////////////////////////////////// +// UTF8 + +//! UTF-8 encoding. +/*! http://en.wikipedia.org/wiki/UTF-8 + http://tools.ietf.org/html/rfc3629 + \tparam CharType Code unit for storing 8-bit UTF-8 data. Default is char. + \note implements Encoding concept +*/ +template +struct UTF8 { + typedef CharType Ch; + + enum { supportUnicode = 1 }; + + template + static void Encode(OutputStream& os, unsigned codepoint) { + if (codepoint <= 0x7F) + os.Put(static_cast(codepoint & 0xFF)); + else if (codepoint <= 0x7FF) { + os.Put(static_cast(0xC0 | ((codepoint >> 6) & 0xFF))); + os.Put(static_cast(0x80 | ((codepoint & 0x3F)))); + } + else if (codepoint <= 0xFFFF) { + os.Put(static_cast(0xE0 | ((codepoint >> 12) & 0xFF))); + os.Put(static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + os.Put(static_cast(0x80 | (codepoint & 0x3F))); + } + else { + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + os.Put(static_cast(0xF0 | ((codepoint >> 18) & 0xFF))); + os.Put(static_cast(0x80 | ((codepoint >> 12) & 0x3F))); + os.Put(static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + os.Put(static_cast(0x80 | (codepoint & 0x3F))); + } + } + + template + static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + if (codepoint <= 0x7F) + PutUnsafe(os, static_cast(codepoint & 0xFF)); + else if (codepoint <= 0x7FF) { + PutUnsafe(os, static_cast(0xC0 | ((codepoint >> 6) & 0xFF))); + PutUnsafe(os, static_cast(0x80 | ((codepoint & 0x3F)))); + } + else if (codepoint <= 0xFFFF) { + PutUnsafe(os, static_cast(0xE0 | ((codepoint >> 12) & 0xFF))); + PutUnsafe(os, static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + PutUnsafe(os, static_cast(0x80 | (codepoint & 0x3F))); + } + else { + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + PutUnsafe(os, static_cast(0xF0 | ((codepoint >> 18) & 0xFF))); + PutUnsafe(os, static_cast(0x80 | ((codepoint >> 12) & 0x3F))); + PutUnsafe(os, static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + PutUnsafe(os, static_cast(0x80 | (codepoint & 0x3F))); + } + } + + template + static bool Decode(InputStream& is, unsigned* codepoint) { +#define COPY() c = is.Take(); *codepoint = (*codepoint << 6) | (static_cast(c) & 0x3Fu) +#define TRANS(mask) result &= ((GetRange(static_cast(c)) & mask) != 0) +#define TAIL() COPY(); TRANS(0x70) + typename InputStream::Ch c = is.Take(); + if (!(c & 0x80)) { + *codepoint = static_cast(c); + return true; + } + + unsigned char type = GetRange(static_cast(c)); + if (type >= 32) { + *codepoint = 0; + } else { + *codepoint = (0xFF >> type) & static_cast(c); + } + bool result = true; + switch (type) { + case 2: TAIL(); return result; + case 3: TAIL(); TAIL(); return result; + case 4: COPY(); TRANS(0x50); TAIL(); return result; + case 5: COPY(); TRANS(0x10); TAIL(); TAIL(); return result; + case 6: TAIL(); TAIL(); TAIL(); return result; + case 10: COPY(); TRANS(0x20); TAIL(); return result; + case 11: COPY(); TRANS(0x60); TAIL(); TAIL(); return result; + default: return false; + } +#undef COPY +#undef TRANS +#undef TAIL + } + + template + static bool Validate(InputStream& is, OutputStream& os) { +#define COPY() os.Put(c = is.Take()) +#define TRANS(mask) result &= ((GetRange(static_cast(c)) & mask) != 0) +#define TAIL() COPY(); TRANS(0x70) + Ch c; + COPY(); + if (!(c & 0x80)) + return true; + + bool result = true; + switch (GetRange(static_cast(c))) { + case 2: TAIL(); return result; + case 3: TAIL(); TAIL(); return result; + case 4: COPY(); TRANS(0x50); TAIL(); return result; + case 5: COPY(); TRANS(0x10); TAIL(); TAIL(); return result; + case 6: TAIL(); TAIL(); TAIL(); return result; + case 10: COPY(); TRANS(0x20); TAIL(); return result; + case 11: COPY(); TRANS(0x60); TAIL(); TAIL(); return result; + default: return false; + } +#undef COPY +#undef TRANS +#undef TAIL + } + + static unsigned char GetRange(unsigned char c) { + // Referring to DFA of http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ + // With new mapping 1 -> 0x10, 7 -> 0x20, 9 -> 0x40, such that AND operation can test multiple types. + static const unsigned char type[] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, + 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8, + }; + return type[c]; + } + + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + typename InputByteStream::Ch c = Take(is); + if (static_cast(c) != 0xEFu) return c; + c = is.Take(); + if (static_cast(c) != 0xBBu) return c; + c = is.Take(); + if (static_cast(c) != 0xBFu) return c; + c = is.Take(); + return c; + } + + template + static Ch Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + return static_cast(is.Take()); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0xEFu)); + os.Put(static_cast(0xBBu)); + os.Put(static_cast(0xBFu)); + } + + template + static void Put(OutputByteStream& os, Ch c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(c)); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// UTF16 + +//! UTF-16 encoding. +/*! http://en.wikipedia.org/wiki/UTF-16 + http://tools.ietf.org/html/rfc2781 + \tparam CharType Type for storing 16-bit UTF-16 data. Default is wchar_t. C++11 may use char16_t instead. + \note implements Encoding concept + + \note For in-memory access, no need to concern endianness. The code units and code points are represented by CPU's endianness. + For streaming, use UTF16LE and UTF16BE, which handle endianness. +*/ +template +struct UTF16 { + typedef CharType Ch; + RAPIDJSON_STATIC_ASSERT(sizeof(Ch) >= 2); + + enum { supportUnicode = 1 }; + + template + static void Encode(OutputStream& os, unsigned codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2); + if (codepoint <= 0xFFFF) { + RAPIDJSON_ASSERT(codepoint < 0xD800 || codepoint > 0xDFFF); // Code point itself cannot be surrogate pair + os.Put(static_cast(codepoint)); + } + else { + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + unsigned v = codepoint - 0x10000; + os.Put(static_cast((v >> 10) | 0xD800)); + os.Put((v & 0x3FF) | 0xDC00); + } + } + + + template + static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2); + if (codepoint <= 0xFFFF) { + RAPIDJSON_ASSERT(codepoint < 0xD800 || codepoint > 0xDFFF); // Code point itself cannot be surrogate pair + PutUnsafe(os, static_cast(codepoint)); + } + else { + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + unsigned v = codepoint - 0x10000; + PutUnsafe(os, static_cast((v >> 10) | 0xD800)); + PutUnsafe(os, (v & 0x3FF) | 0xDC00); + } + } + + template + static bool Decode(InputStream& is, unsigned* codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 2); + typename InputStream::Ch c = is.Take(); + if (c < 0xD800 || c > 0xDFFF) { + *codepoint = static_cast(c); + return true; + } + else if (c <= 0xDBFF) { + *codepoint = (static_cast(c) & 0x3FF) << 10; + c = is.Take(); + *codepoint |= (static_cast(c) & 0x3FF); + *codepoint += 0x10000; + return c >= 0xDC00 && c <= 0xDFFF; + } + return false; + } + + template + static bool Validate(InputStream& is, OutputStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 2); + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2); + typename InputStream::Ch c; + os.Put(static_cast(c = is.Take())); + if (c < 0xD800 || c > 0xDFFF) + return true; + else if (c <= 0xDBFF) { + os.Put(c = is.Take()); + return c >= 0xDC00 && c <= 0xDFFF; + } + return false; + } +}; + +//! UTF-16 little endian encoding. +template +struct UTF16LE : UTF16 { + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return static_cast(c) == 0xFEFFu ? Take(is) : c; + } + + template + static CharType Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + unsigned c = static_cast(is.Take()); + c |= static_cast(static_cast(is.Take())) << 8; + return static_cast(c); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0xFFu)); + os.Put(static_cast(0xFEu)); + } + + template + static void Put(OutputByteStream& os, CharType c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(static_cast(c) & 0xFFu)); + os.Put(static_cast((static_cast(c) >> 8) & 0xFFu)); + } +}; + +//! UTF-16 big endian encoding. +template +struct UTF16BE : UTF16 { + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return static_cast(c) == 0xFEFFu ? Take(is) : c; + } + + template + static CharType Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + unsigned c = static_cast(static_cast(is.Take())) << 8; + c |= static_cast(is.Take()); + return static_cast(c); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0xFEu)); + os.Put(static_cast(0xFFu)); + } + + template + static void Put(OutputByteStream& os, CharType c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast((static_cast(c) >> 8) & 0xFFu)); + os.Put(static_cast(static_cast(c) & 0xFFu)); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// UTF32 + +//! UTF-32 encoding. +/*! http://en.wikipedia.org/wiki/UTF-32 + \tparam CharType Type for storing 32-bit UTF-32 data. Default is unsigned. C++11 may use char32_t instead. + \note implements Encoding concept + + \note For in-memory access, no need to concern endianness. The code units and code points are represented by CPU's endianness. + For streaming, use UTF32LE and UTF32BE, which handle endianness. +*/ +template +struct UTF32 { + typedef CharType Ch; + RAPIDJSON_STATIC_ASSERT(sizeof(Ch) >= 4); + + enum { supportUnicode = 1 }; + + template + static void Encode(OutputStream& os, unsigned codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 4); + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + os.Put(codepoint); + } + + template + static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 4); + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + PutUnsafe(os, codepoint); + } + + template + static bool Decode(InputStream& is, unsigned* codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 4); + Ch c = is.Take(); + *codepoint = c; + return c <= 0x10FFFF; + } + + template + static bool Validate(InputStream& is, OutputStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 4); + Ch c; + os.Put(c = is.Take()); + return c <= 0x10FFFF; + } +}; + +//! UTF-32 little endian enocoding. +template +struct UTF32LE : UTF32 { + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return static_cast(c) == 0x0000FEFFu ? Take(is) : c; + } + + template + static CharType Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + unsigned c = static_cast(is.Take()); + c |= static_cast(static_cast(is.Take())) << 8; + c |= static_cast(static_cast(is.Take())) << 16; + c |= static_cast(static_cast(is.Take())) << 24; + return static_cast(c); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0xFFu)); + os.Put(static_cast(0xFEu)); + os.Put(static_cast(0x00u)); + os.Put(static_cast(0x00u)); + } + + template + static void Put(OutputByteStream& os, CharType c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(c & 0xFFu)); + os.Put(static_cast((c >> 8) & 0xFFu)); + os.Put(static_cast((c >> 16) & 0xFFu)); + os.Put(static_cast((c >> 24) & 0xFFu)); + } +}; + +//! UTF-32 big endian encoding. +template +struct UTF32BE : UTF32 { + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return static_cast(c) == 0x0000FEFFu ? Take(is) : c; + } + + template + static CharType Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + unsigned c = static_cast(static_cast(is.Take())) << 24; + c |= static_cast(static_cast(is.Take())) << 16; + c |= static_cast(static_cast(is.Take())) << 8; + c |= static_cast(static_cast(is.Take())); + return static_cast(c); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0x00u)); + os.Put(static_cast(0x00u)); + os.Put(static_cast(0xFEu)); + os.Put(static_cast(0xFFu)); + } + + template + static void Put(OutputByteStream& os, CharType c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast((c >> 24) & 0xFFu)); + os.Put(static_cast((c >> 16) & 0xFFu)); + os.Put(static_cast((c >> 8) & 0xFFu)); + os.Put(static_cast(c & 0xFFu)); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// ASCII + +//! ASCII encoding. +/*! http://en.wikipedia.org/wiki/ASCII + \tparam CharType Code unit for storing 7-bit ASCII data. Default is char. + \note implements Encoding concept +*/ +template +struct ASCII { + typedef CharType Ch; + + enum { supportUnicode = 0 }; + + template + static void Encode(OutputStream& os, unsigned codepoint) { + RAPIDJSON_ASSERT(codepoint <= 0x7F); + os.Put(static_cast(codepoint & 0xFF)); + } + + template + static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + RAPIDJSON_ASSERT(codepoint <= 0x7F); + PutUnsafe(os, static_cast(codepoint & 0xFF)); + } + + template + static bool Decode(InputStream& is, unsigned* codepoint) { + uint8_t c = static_cast(is.Take()); + *codepoint = c; + return c <= 0X7F; + } + + template + static bool Validate(InputStream& is, OutputStream& os) { + uint8_t c = static_cast(is.Take()); + os.Put(static_cast(c)); + return c <= 0x7F; + } + + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + uint8_t c = static_cast(Take(is)); + return static_cast(c); + } + + template + static Ch Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + return static_cast(is.Take()); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + (void)os; + } + + template + static void Put(OutputByteStream& os, Ch c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(c)); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// AutoUTF + +//! Runtime-specified UTF encoding type of a stream. +enum UTFType { + kUTF8 = 0, //!< UTF-8. + kUTF16LE = 1, //!< UTF-16 little endian. + kUTF16BE = 2, //!< UTF-16 big endian. + kUTF32LE = 3, //!< UTF-32 little endian. + kUTF32BE = 4 //!< UTF-32 big endian. +}; + +//! Dynamically select encoding according to stream's runtime-specified UTF encoding type. +/*! \note This class can be used with AutoUTFInputtStream and AutoUTFOutputStream, which provides GetType(). +*/ +template +struct AutoUTF { + typedef CharType Ch; + + enum { supportUnicode = 1 }; + +#define RAPIDJSON_ENCODINGS_FUNC(x) UTF8::x, UTF16LE::x, UTF16BE::x, UTF32LE::x, UTF32BE::x + + template + RAPIDJSON_FORCEINLINE static void Encode(OutputStream& os, unsigned codepoint) { + typedef void (*EncodeFunc)(OutputStream&, unsigned); + static const EncodeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Encode) }; + (*f[os.GetType()])(os, codepoint); + } + + template + RAPIDJSON_FORCEINLINE static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + typedef void (*EncodeFunc)(OutputStream&, unsigned); + static const EncodeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(EncodeUnsafe) }; + (*f[os.GetType()])(os, codepoint); + } + + template + RAPIDJSON_FORCEINLINE static bool Decode(InputStream& is, unsigned* codepoint) { + typedef bool (*DecodeFunc)(InputStream&, unsigned*); + static const DecodeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Decode) }; + return (*f[is.GetType()])(is, codepoint); + } + + template + RAPIDJSON_FORCEINLINE static bool Validate(InputStream& is, OutputStream& os) { + typedef bool (*ValidateFunc)(InputStream&, OutputStream&); + static const ValidateFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Validate) }; + return (*f[is.GetType()])(is, os); + } + +#undef RAPIDJSON_ENCODINGS_FUNC +}; + +/////////////////////////////////////////////////////////////////////////////// +// Transcoder + +//! Encoding conversion. +template +struct Transcoder { + //! Take one Unicode codepoint from source encoding, convert it to target encoding and put it to the output stream. + template + RAPIDJSON_FORCEINLINE static bool Transcode(InputStream& is, OutputStream& os) { + unsigned codepoint; + if (!SourceEncoding::Decode(is, &codepoint)) + return false; + TargetEncoding::Encode(os, codepoint); + return true; + } + + template + RAPIDJSON_FORCEINLINE static bool TranscodeUnsafe(InputStream& is, OutputStream& os) { + unsigned codepoint; + if (!SourceEncoding::Decode(is, &codepoint)) + return false; + TargetEncoding::EncodeUnsafe(os, codepoint); + return true; + } + + //! Validate one Unicode codepoint from an encoded stream. + template + RAPIDJSON_FORCEINLINE static bool Validate(InputStream& is, OutputStream& os) { + return Transcode(is, os); // Since source/target encoding is different, must transcode. + } +}; + +// Forward declaration. +template +inline void PutUnsafe(Stream& stream, typename Stream::Ch c); + +//! Specialization of Transcoder with same source and target encoding. +template +struct Transcoder { + template + RAPIDJSON_FORCEINLINE static bool Transcode(InputStream& is, OutputStream& os) { + os.Put(is.Take()); // Just copy one code unit. This semantic is different from primary template class. + return true; + } + + template + RAPIDJSON_FORCEINLINE static bool TranscodeUnsafe(InputStream& is, OutputStream& os) { + PutUnsafe(os, is.Take()); // Just copy one code unit. This semantic is different from primary template class. + return true; + } + + template + RAPIDJSON_FORCEINLINE static bool Validate(InputStream& is, OutputStream& os) { + return Encoding::Validate(is, os); // source/target encoding are the same + } +}; + +RAPIDJSON_NAMESPACE_END + +#if defined(__GNUC__) || defined(_MSC_VER) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_ENCODINGS_H_ diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/error/en.h b/Externals/discord-rpc/thirdparty/include/rapidjson/error/en.h new file mode 100644 index 0000000000..2db838bff2 --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/error/en.h @@ -0,0 +1,74 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_ERROR_EN_H_ +#define RAPIDJSON_ERROR_EN_H_ + +#include "error.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(switch-enum) +RAPIDJSON_DIAG_OFF(covered-switch-default) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Maps error code of parsing into error message. +/*! + \ingroup RAPIDJSON_ERRORS + \param parseErrorCode Error code obtained in parsing. + \return the error message. + \note User can make a copy of this function for localization. + Using switch-case is safer for future modification of error codes. +*/ +inline const RAPIDJSON_ERROR_CHARTYPE* GetParseError_En(ParseErrorCode parseErrorCode) { + switch (parseErrorCode) { + case kParseErrorNone: return RAPIDJSON_ERROR_STRING("No error."); + + case kParseErrorDocumentEmpty: return RAPIDJSON_ERROR_STRING("The document is empty."); + case kParseErrorDocumentRootNotSingular: return RAPIDJSON_ERROR_STRING("The document root must not be followed by other values."); + + case kParseErrorValueInvalid: return RAPIDJSON_ERROR_STRING("Invalid value."); + + case kParseErrorObjectMissName: return RAPIDJSON_ERROR_STRING("Missing a name for object member."); + case kParseErrorObjectMissColon: return RAPIDJSON_ERROR_STRING("Missing a colon after a name of object member."); + case kParseErrorObjectMissCommaOrCurlyBracket: return RAPIDJSON_ERROR_STRING("Missing a comma or '}' after an object member."); + + case kParseErrorArrayMissCommaOrSquareBracket: return RAPIDJSON_ERROR_STRING("Missing a comma or ']' after an array element."); + + case kParseErrorStringUnicodeEscapeInvalidHex: return RAPIDJSON_ERROR_STRING("Incorrect hex digit after \\u escape in string."); + case kParseErrorStringUnicodeSurrogateInvalid: return RAPIDJSON_ERROR_STRING("The surrogate pair in string is invalid."); + case kParseErrorStringEscapeInvalid: return RAPIDJSON_ERROR_STRING("Invalid escape character in string."); + case kParseErrorStringMissQuotationMark: return RAPIDJSON_ERROR_STRING("Missing a closing quotation mark in string."); + case kParseErrorStringInvalidEncoding: return RAPIDJSON_ERROR_STRING("Invalid encoding in string."); + + case kParseErrorNumberTooBig: return RAPIDJSON_ERROR_STRING("Number too big to be stored in double."); + case kParseErrorNumberMissFraction: return RAPIDJSON_ERROR_STRING("Miss fraction part in number."); + case kParseErrorNumberMissExponent: return RAPIDJSON_ERROR_STRING("Miss exponent in number."); + + case kParseErrorTermination: return RAPIDJSON_ERROR_STRING("Terminate parsing due to Handler error."); + case kParseErrorUnspecificSyntaxError: return RAPIDJSON_ERROR_STRING("Unspecific syntax error."); + + default: return RAPIDJSON_ERROR_STRING("Unknown error."); + } +} + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_ERROR_EN_H_ diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/error/error.h b/Externals/discord-rpc/thirdparty/include/rapidjson/error/error.h new file mode 100644 index 0000000000..95cb31a72f --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/error/error.h @@ -0,0 +1,155 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_ERROR_ERROR_H_ +#define RAPIDJSON_ERROR_ERROR_H_ + +#include "../rapidjson.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#endif + +/*! \file error.h */ + +/*! \defgroup RAPIDJSON_ERRORS RapidJSON error handling */ + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ERROR_CHARTYPE + +//! Character type of error messages. +/*! \ingroup RAPIDJSON_ERRORS + The default character type is \c char. + On Windows, user can define this macro as \c TCHAR for supporting both + unicode/non-unicode settings. +*/ +#ifndef RAPIDJSON_ERROR_CHARTYPE +#define RAPIDJSON_ERROR_CHARTYPE char +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ERROR_STRING + +//! Macro for converting string literial to \ref RAPIDJSON_ERROR_CHARTYPE[]. +/*! \ingroup RAPIDJSON_ERRORS + By default this conversion macro does nothing. + On Windows, user can define this macro as \c _T(x) for supporting both + unicode/non-unicode settings. +*/ +#ifndef RAPIDJSON_ERROR_STRING +#define RAPIDJSON_ERROR_STRING(x) x +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// ParseErrorCode + +//! Error code of parsing. +/*! \ingroup RAPIDJSON_ERRORS + \see GenericReader::Parse, GenericReader::GetParseErrorCode +*/ +enum ParseErrorCode { + kParseErrorNone = 0, //!< No error. + + kParseErrorDocumentEmpty, //!< The document is empty. + kParseErrorDocumentRootNotSingular, //!< The document root must not follow by other values. + + kParseErrorValueInvalid, //!< Invalid value. + + kParseErrorObjectMissName, //!< Missing a name for object member. + kParseErrorObjectMissColon, //!< Missing a colon after a name of object member. + kParseErrorObjectMissCommaOrCurlyBracket, //!< Missing a comma or '}' after an object member. + + kParseErrorArrayMissCommaOrSquareBracket, //!< Missing a comma or ']' after an array element. + + kParseErrorStringUnicodeEscapeInvalidHex, //!< Incorrect hex digit after \\u escape in string. + kParseErrorStringUnicodeSurrogateInvalid, //!< The surrogate pair in string is invalid. + kParseErrorStringEscapeInvalid, //!< Invalid escape character in string. + kParseErrorStringMissQuotationMark, //!< Missing a closing quotation mark in string. + kParseErrorStringInvalidEncoding, //!< Invalid encoding in string. + + kParseErrorNumberTooBig, //!< Number too big to be stored in double. + kParseErrorNumberMissFraction, //!< Miss fraction part in number. + kParseErrorNumberMissExponent, //!< Miss exponent in number. + + kParseErrorTermination, //!< Parsing was terminated. + kParseErrorUnspecificSyntaxError //!< Unspecific syntax error. +}; + +//! Result of parsing (wraps ParseErrorCode) +/*! + \ingroup RAPIDJSON_ERRORS + \code + Document doc; + ParseResult ok = doc.Parse("[42]"); + if (!ok) { + fprintf(stderr, "JSON parse error: %s (%u)", + GetParseError_En(ok.Code()), ok.Offset()); + exit(EXIT_FAILURE); + } + \endcode + \see GenericReader::Parse, GenericDocument::Parse +*/ +struct ParseResult { +public: + //! Default constructor, no error. + ParseResult() : code_(kParseErrorNone), offset_(0) {} + //! Constructor to set an error. + ParseResult(ParseErrorCode code, size_t offset) : code_(code), offset_(offset) {} + + //! Get the error code. + ParseErrorCode Code() const { return code_; } + //! Get the error offset, if \ref IsError(), 0 otherwise. + size_t Offset() const { return offset_; } + + //! Conversion to \c bool, returns \c true, iff !\ref IsError(). + operator bool() const { return !IsError(); } + //! Whether the result is an error. + bool IsError() const { return code_ != kParseErrorNone; } + + bool operator==(const ParseResult& that) const { return code_ == that.code_; } + bool operator==(ParseErrorCode code) const { return code_ == code; } + friend bool operator==(ParseErrorCode code, const ParseResult & err) { return code == err.code_; } + + //! Reset error code. + void Clear() { Set(kParseErrorNone); } + //! Update error code and offset. + void Set(ParseErrorCode code, size_t offset = 0) { code_ = code; offset_ = offset; } + +private: + ParseErrorCode code_; + size_t offset_; +}; + +//! Function pointer type of GetParseError(). +/*! \ingroup RAPIDJSON_ERRORS + + This is the prototype for \c GetParseError_X(), where \c X is a locale. + User can dynamically change locale in runtime, e.g.: +\code + GetParseErrorFunc GetParseError = GetParseError_En; // or whatever + const RAPIDJSON_ERROR_CHARTYPE* s = GetParseError(document.GetParseErrorCode()); +\endcode +*/ +typedef const RAPIDJSON_ERROR_CHARTYPE* (*GetParseErrorFunc)(ParseErrorCode); + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_ERROR_ERROR_H_ diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/filereadstream.h b/Externals/discord-rpc/thirdparty/include/rapidjson/filereadstream.h new file mode 100644 index 0000000000..b56ea13b34 --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/filereadstream.h @@ -0,0 +1,99 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_FILEREADSTREAM_H_ +#define RAPIDJSON_FILEREADSTREAM_H_ + +#include "stream.h" +#include + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(unreachable-code) +RAPIDJSON_DIAG_OFF(missing-noreturn) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! File byte stream for input using fread(). +/*! + \note implements Stream concept +*/ +class FileReadStream { +public: + typedef char Ch; //!< Character type (byte). + + //! Constructor. + /*! + \param fp File pointer opened for read. + \param buffer user-supplied buffer. + \param bufferSize size of buffer in bytes. Must >=4 bytes. + */ + FileReadStream(std::FILE* fp, char* buffer, size_t bufferSize) : fp_(fp), buffer_(buffer), bufferSize_(bufferSize), bufferLast_(0), current_(buffer_), readCount_(0), count_(0), eof_(false) { + RAPIDJSON_ASSERT(fp_ != 0); + RAPIDJSON_ASSERT(bufferSize >= 4); + Read(); + } + + Ch Peek() const { return *current_; } + Ch Take() { Ch c = *current_; Read(); return c; } + size_t Tell() const { return count_ + static_cast(current_ - buffer_); } + + // Not implemented + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + + // For encoding detection only. + const Ch* Peek4() const { + return (current_ + 4 <= bufferLast_) ? current_ : 0; + } + +private: + void Read() { + if (current_ < bufferLast_) + ++current_; + else if (!eof_) { + count_ += readCount_; + readCount_ = fread(buffer_, 1, bufferSize_, fp_); + bufferLast_ = buffer_ + readCount_ - 1; + current_ = buffer_; + + if (readCount_ < bufferSize_) { + buffer_[readCount_] = '\0'; + ++bufferLast_; + eof_ = true; + } + } + } + + std::FILE* fp_; + Ch *buffer_; + size_t bufferSize_; + Ch *bufferLast_; + Ch *current_; + size_t readCount_; + size_t count_; //!< Number of characters read + bool eof_; +}; + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_FILESTREAM_H_ diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/filewritestream.h b/Externals/discord-rpc/thirdparty/include/rapidjson/filewritestream.h new file mode 100644 index 0000000000..6378dd60ed --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/filewritestream.h @@ -0,0 +1,104 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_FILEWRITESTREAM_H_ +#define RAPIDJSON_FILEWRITESTREAM_H_ + +#include "stream.h" +#include + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(unreachable-code) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Wrapper of C file stream for input using fread(). +/*! + \note implements Stream concept +*/ +class FileWriteStream { +public: + typedef char Ch; //!< Character type. Only support char. + + FileWriteStream(std::FILE* fp, char* buffer, size_t bufferSize) : fp_(fp), buffer_(buffer), bufferEnd_(buffer + bufferSize), current_(buffer_) { + RAPIDJSON_ASSERT(fp_ != 0); + } + + void Put(char c) { + if (current_ >= bufferEnd_) + Flush(); + + *current_++ = c; + } + + void PutN(char c, size_t n) { + size_t avail = static_cast(bufferEnd_ - current_); + while (n > avail) { + std::memset(current_, c, avail); + current_ += avail; + Flush(); + n -= avail; + avail = static_cast(bufferEnd_ - current_); + } + + if (n > 0) { + std::memset(current_, c, n); + current_ += n; + } + } + + void Flush() { + if (current_ != buffer_) { + size_t result = fwrite(buffer_, 1, static_cast(current_ - buffer_), fp_); + if (result < static_cast(current_ - buffer_)) { + // failure deliberately ignored at this time + // added to avoid warn_unused_result build errors + } + current_ = buffer_; + } + } + + // Not implemented + char Peek() const { RAPIDJSON_ASSERT(false); return 0; } + char Take() { RAPIDJSON_ASSERT(false); return 0; } + size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } + char* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(char*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + // Prohibit copy constructor & assignment operator. + FileWriteStream(const FileWriteStream&); + FileWriteStream& operator=(const FileWriteStream&); + + std::FILE* fp_; + char *buffer_; + char *bufferEnd_; + char *current_; +}; + +//! Implement specialized version of PutN() with memset() for better performance. +template<> +inline void PutN(FileWriteStream& stream, char c, size_t n) { + stream.PutN(c, n); +} + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_FILESTREAM_H_ diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/fwd.h b/Externals/discord-rpc/thirdparty/include/rapidjson/fwd.h new file mode 100644 index 0000000000..e8104e841b --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/fwd.h @@ -0,0 +1,151 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_FWD_H_ +#define RAPIDJSON_FWD_H_ + +#include "rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN + +// encodings.h + +template struct UTF8; +template struct UTF16; +template struct UTF16BE; +template struct UTF16LE; +template struct UTF32; +template struct UTF32BE; +template struct UTF32LE; +template struct ASCII; +template struct AutoUTF; + +template +struct Transcoder; + +// allocators.h + +class CrtAllocator; + +template +class MemoryPoolAllocator; + +// stream.h + +template +struct GenericStringStream; + +typedef GenericStringStream > StringStream; + +template +struct GenericInsituStringStream; + +typedef GenericInsituStringStream > InsituStringStream; + +// stringbuffer.h + +template +class GenericStringBuffer; + +typedef GenericStringBuffer, CrtAllocator> StringBuffer; + +// filereadstream.h + +class FileReadStream; + +// filewritestream.h + +class FileWriteStream; + +// memorybuffer.h + +template +struct GenericMemoryBuffer; + +typedef GenericMemoryBuffer MemoryBuffer; + +// memorystream.h + +struct MemoryStream; + +// reader.h + +template +struct BaseReaderHandler; + +template +class GenericReader; + +typedef GenericReader, UTF8, CrtAllocator> Reader; + +// writer.h + +template +class Writer; + +// prettywriter.h + +template +class PrettyWriter; + +// document.h + +template +struct GenericMember; + +template +class GenericMemberIterator; + +template +struct GenericStringRef; + +template +class GenericValue; + +typedef GenericValue, MemoryPoolAllocator > Value; + +template +class GenericDocument; + +typedef GenericDocument, MemoryPoolAllocator, CrtAllocator> Document; + +// pointer.h + +template +class GenericPointer; + +typedef GenericPointer Pointer; + +// schema.h + +template +class IGenericRemoteSchemaDocumentProvider; + +template +class GenericSchemaDocument; + +typedef GenericSchemaDocument SchemaDocument; +typedef IGenericRemoteSchemaDocumentProvider IRemoteSchemaDocumentProvider; + +template < + typename SchemaDocumentType, + typename OutputHandler, + typename StateAllocator> +class GenericSchemaValidator; + +typedef GenericSchemaValidator, void>, CrtAllocator> SchemaValidator; + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_RAPIDJSONFWD_H_ diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/internal/biginteger.h b/Externals/discord-rpc/thirdparty/include/rapidjson/internal/biginteger.h new file mode 100644 index 0000000000..9d3e88c998 --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/internal/biginteger.h @@ -0,0 +1,290 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_BIGINTEGER_H_ +#define RAPIDJSON_BIGINTEGER_H_ + +#include "../rapidjson.h" + +#if defined(_MSC_VER) && defined(_M_AMD64) +#include // for _umul128 +#pragma intrinsic(_umul128) +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +class BigInteger { +public: + typedef uint64_t Type; + + BigInteger(const BigInteger& rhs) : count_(rhs.count_) { + std::memcpy(digits_, rhs.digits_, count_ * sizeof(Type)); + } + + explicit BigInteger(uint64_t u) : count_(1) { + digits_[0] = u; + } + + BigInteger(const char* decimals, size_t length) : count_(1) { + RAPIDJSON_ASSERT(length > 0); + digits_[0] = 0; + size_t i = 0; + const size_t kMaxDigitPerIteration = 19; // 2^64 = 18446744073709551616 > 10^19 + while (length >= kMaxDigitPerIteration) { + AppendDecimal64(decimals + i, decimals + i + kMaxDigitPerIteration); + length -= kMaxDigitPerIteration; + i += kMaxDigitPerIteration; + } + + if (length > 0) + AppendDecimal64(decimals + i, decimals + i + length); + } + + BigInteger& operator=(const BigInteger &rhs) + { + if (this != &rhs) { + count_ = rhs.count_; + std::memcpy(digits_, rhs.digits_, count_ * sizeof(Type)); + } + return *this; + } + + BigInteger& operator=(uint64_t u) { + digits_[0] = u; + count_ = 1; + return *this; + } + + BigInteger& operator+=(uint64_t u) { + Type backup = digits_[0]; + digits_[0] += u; + for (size_t i = 0; i < count_ - 1; i++) { + if (digits_[i] >= backup) + return *this; // no carry + backup = digits_[i + 1]; + digits_[i + 1] += 1; + } + + // Last carry + if (digits_[count_ - 1] < backup) + PushBack(1); + + return *this; + } + + BigInteger& operator*=(uint64_t u) { + if (u == 0) return *this = 0; + if (u == 1) return *this; + if (*this == 1) return *this = u; + + uint64_t k = 0; + for (size_t i = 0; i < count_; i++) { + uint64_t hi; + digits_[i] = MulAdd64(digits_[i], u, k, &hi); + k = hi; + } + + if (k > 0) + PushBack(k); + + return *this; + } + + BigInteger& operator*=(uint32_t u) { + if (u == 0) return *this = 0; + if (u == 1) return *this; + if (*this == 1) return *this = u; + + uint64_t k = 0; + for (size_t i = 0; i < count_; i++) { + const uint64_t c = digits_[i] >> 32; + const uint64_t d = digits_[i] & 0xFFFFFFFF; + const uint64_t uc = u * c; + const uint64_t ud = u * d; + const uint64_t p0 = ud + k; + const uint64_t p1 = uc + (p0 >> 32); + digits_[i] = (p0 & 0xFFFFFFFF) | (p1 << 32); + k = p1 >> 32; + } + + if (k > 0) + PushBack(k); + + return *this; + } + + BigInteger& operator<<=(size_t shift) { + if (IsZero() || shift == 0) return *this; + + size_t offset = shift / kTypeBit; + size_t interShift = shift % kTypeBit; + RAPIDJSON_ASSERT(count_ + offset <= kCapacity); + + if (interShift == 0) { + std::memmove(&digits_[count_ - 1 + offset], &digits_[count_ - 1], count_ * sizeof(Type)); + count_ += offset; + } + else { + digits_[count_] = 0; + for (size_t i = count_; i > 0; i--) + digits_[i + offset] = (digits_[i] << interShift) | (digits_[i - 1] >> (kTypeBit - interShift)); + digits_[offset] = digits_[0] << interShift; + count_ += offset; + if (digits_[count_]) + count_++; + } + + std::memset(digits_, 0, offset * sizeof(Type)); + + return *this; + } + + bool operator==(const BigInteger& rhs) const { + return count_ == rhs.count_ && std::memcmp(digits_, rhs.digits_, count_ * sizeof(Type)) == 0; + } + + bool operator==(const Type rhs) const { + return count_ == 1 && digits_[0] == rhs; + } + + BigInteger& MultiplyPow5(unsigned exp) { + static const uint32_t kPow5[12] = { + 5, + 5 * 5, + 5 * 5 * 5, + 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 + }; + if (exp == 0) return *this; + for (; exp >= 27; exp -= 27) *this *= RAPIDJSON_UINT64_C2(0X6765C793, 0XFA10079D); // 5^27 + for (; exp >= 13; exp -= 13) *this *= static_cast(1220703125u); // 5^13 + if (exp > 0) *this *= kPow5[exp - 1]; + return *this; + } + + // Compute absolute difference of this and rhs. + // Assume this != rhs + bool Difference(const BigInteger& rhs, BigInteger* out) const { + int cmp = Compare(rhs); + RAPIDJSON_ASSERT(cmp != 0); + const BigInteger *a, *b; // Makes a > b + bool ret; + if (cmp < 0) { a = &rhs; b = this; ret = true; } + else { a = this; b = &rhs; ret = false; } + + Type borrow = 0; + for (size_t i = 0; i < a->count_; i++) { + Type d = a->digits_[i] - borrow; + if (i < b->count_) + d -= b->digits_[i]; + borrow = (d > a->digits_[i]) ? 1 : 0; + out->digits_[i] = d; + if (d != 0) + out->count_ = i + 1; + } + + return ret; + } + + int Compare(const BigInteger& rhs) const { + if (count_ != rhs.count_) + return count_ < rhs.count_ ? -1 : 1; + + for (size_t i = count_; i-- > 0;) + if (digits_[i] != rhs.digits_[i]) + return digits_[i] < rhs.digits_[i] ? -1 : 1; + + return 0; + } + + size_t GetCount() const { return count_; } + Type GetDigit(size_t index) const { RAPIDJSON_ASSERT(index < count_); return digits_[index]; } + bool IsZero() const { return count_ == 1 && digits_[0] == 0; } + +private: + void AppendDecimal64(const char* begin, const char* end) { + uint64_t u = ParseUint64(begin, end); + if (IsZero()) + *this = u; + else { + unsigned exp = static_cast(end - begin); + (MultiplyPow5(exp) <<= exp) += u; // *this = *this * 10^exp + u + } + } + + void PushBack(Type digit) { + RAPIDJSON_ASSERT(count_ < kCapacity); + digits_[count_++] = digit; + } + + static uint64_t ParseUint64(const char* begin, const char* end) { + uint64_t r = 0; + for (const char* p = begin; p != end; ++p) { + RAPIDJSON_ASSERT(*p >= '0' && *p <= '9'); + r = r * 10u + static_cast(*p - '0'); + } + return r; + } + + // Assume a * b + k < 2^128 + static uint64_t MulAdd64(uint64_t a, uint64_t b, uint64_t k, uint64_t* outHigh) { +#if defined(_MSC_VER) && defined(_M_AMD64) + uint64_t low = _umul128(a, b, outHigh) + k; + if (low < k) + (*outHigh)++; + return low; +#elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__x86_64__) + __extension__ typedef unsigned __int128 uint128; + uint128 p = static_cast(a) * static_cast(b); + p += k; + *outHigh = static_cast(p >> 64); + return static_cast(p); +#else + const uint64_t a0 = a & 0xFFFFFFFF, a1 = a >> 32, b0 = b & 0xFFFFFFFF, b1 = b >> 32; + uint64_t x0 = a0 * b0, x1 = a0 * b1, x2 = a1 * b0, x3 = a1 * b1; + x1 += (x0 >> 32); // can't give carry + x1 += x2; + if (x1 < x2) + x3 += (static_cast(1) << 32); + uint64_t lo = (x1 << 32) + (x0 & 0xFFFFFFFF); + uint64_t hi = x3 + (x1 >> 32); + + lo += k; + if (lo < k) + hi++; + *outHigh = hi; + return lo; +#endif + } + + static const size_t kBitCount = 3328; // 64bit * 54 > 10^1000 + static const size_t kCapacity = kBitCount / sizeof(Type); + static const size_t kTypeBit = sizeof(Type) * 8; + + Type digits_[kCapacity]; + size_t count_; +}; + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_BIGINTEGER_H_ diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/internal/diyfp.h b/Externals/discord-rpc/thirdparty/include/rapidjson/internal/diyfp.h new file mode 100644 index 0000000000..c9fefdc613 --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/internal/diyfp.h @@ -0,0 +1,258 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +// This is a C++ header-only implementation of Grisu2 algorithm from the publication: +// Loitsch, Florian. "Printing floating-point numbers quickly and accurately with +// integers." ACM Sigplan Notices 45.6 (2010): 233-243. + +#ifndef RAPIDJSON_DIYFP_H_ +#define RAPIDJSON_DIYFP_H_ + +#include "../rapidjson.h" + +#if defined(_MSC_VER) && defined(_M_AMD64) +#include +#pragma intrinsic(_BitScanReverse64) +#pragma intrinsic(_umul128) +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#endif + +struct DiyFp { + DiyFp() : f(), e() {} + + DiyFp(uint64_t fp, int exp) : f(fp), e(exp) {} + + explicit DiyFp(double d) { + union { + double d; + uint64_t u64; + } u = { d }; + + int biased_e = static_cast((u.u64 & kDpExponentMask) >> kDpSignificandSize); + uint64_t significand = (u.u64 & kDpSignificandMask); + if (biased_e != 0) { + f = significand + kDpHiddenBit; + e = biased_e - kDpExponentBias; + } + else { + f = significand; + e = kDpMinExponent + 1; + } + } + + DiyFp operator-(const DiyFp& rhs) const { + return DiyFp(f - rhs.f, e); + } + + DiyFp operator*(const DiyFp& rhs) const { +#if defined(_MSC_VER) && defined(_M_AMD64) + uint64_t h; + uint64_t l = _umul128(f, rhs.f, &h); + if (l & (uint64_t(1) << 63)) // rounding + h++; + return DiyFp(h, e + rhs.e + 64); +#elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__x86_64__) + __extension__ typedef unsigned __int128 uint128; + uint128 p = static_cast(f) * static_cast(rhs.f); + uint64_t h = static_cast(p >> 64); + uint64_t l = static_cast(p); + if (l & (uint64_t(1) << 63)) // rounding + h++; + return DiyFp(h, e + rhs.e + 64); +#else + const uint64_t M32 = 0xFFFFFFFF; + const uint64_t a = f >> 32; + const uint64_t b = f & M32; + const uint64_t c = rhs.f >> 32; + const uint64_t d = rhs.f & M32; + const uint64_t ac = a * c; + const uint64_t bc = b * c; + const uint64_t ad = a * d; + const uint64_t bd = b * d; + uint64_t tmp = (bd >> 32) + (ad & M32) + (bc & M32); + tmp += 1U << 31; /// mult_round + return DiyFp(ac + (ad >> 32) + (bc >> 32) + (tmp >> 32), e + rhs.e + 64); +#endif + } + + DiyFp Normalize() const { +#if defined(_MSC_VER) && defined(_M_AMD64) + unsigned long index; + _BitScanReverse64(&index, f); + return DiyFp(f << (63 - index), e - (63 - index)); +#elif defined(__GNUC__) && __GNUC__ >= 4 + int s = __builtin_clzll(f); + return DiyFp(f << s, e - s); +#else + DiyFp res = *this; + while (!(res.f & (static_cast(1) << 63))) { + res.f <<= 1; + res.e--; + } + return res; +#endif + } + + DiyFp NormalizeBoundary() const { + DiyFp res = *this; + while (!(res.f & (kDpHiddenBit << 1))) { + res.f <<= 1; + res.e--; + } + res.f <<= (kDiySignificandSize - kDpSignificandSize - 2); + res.e = res.e - (kDiySignificandSize - kDpSignificandSize - 2); + return res; + } + + void NormalizedBoundaries(DiyFp* minus, DiyFp* plus) const { + DiyFp pl = DiyFp((f << 1) + 1, e - 1).NormalizeBoundary(); + DiyFp mi = (f == kDpHiddenBit) ? DiyFp((f << 2) - 1, e - 2) : DiyFp((f << 1) - 1, e - 1); + mi.f <<= mi.e - pl.e; + mi.e = pl.e; + *plus = pl; + *minus = mi; + } + + double ToDouble() const { + union { + double d; + uint64_t u64; + }u; + const uint64_t be = (e == kDpDenormalExponent && (f & kDpHiddenBit) == 0) ? 0 : + static_cast(e + kDpExponentBias); + u.u64 = (f & kDpSignificandMask) | (be << kDpSignificandSize); + return u.d; + } + + static const int kDiySignificandSize = 64; + static const int kDpSignificandSize = 52; + static const int kDpExponentBias = 0x3FF + kDpSignificandSize; + static const int kDpMaxExponent = 0x7FF - kDpExponentBias; + static const int kDpMinExponent = -kDpExponentBias; + static const int kDpDenormalExponent = -kDpExponentBias + 1; + static const uint64_t kDpExponentMask = RAPIDJSON_UINT64_C2(0x7FF00000, 0x00000000); + static const uint64_t kDpSignificandMask = RAPIDJSON_UINT64_C2(0x000FFFFF, 0xFFFFFFFF); + static const uint64_t kDpHiddenBit = RAPIDJSON_UINT64_C2(0x00100000, 0x00000000); + + uint64_t f; + int e; +}; + +inline DiyFp GetCachedPowerByIndex(size_t index) { + // 10^-348, 10^-340, ..., 10^340 + static const uint64_t kCachedPowers_F[] = { + RAPIDJSON_UINT64_C2(0xfa8fd5a0, 0x081c0288), RAPIDJSON_UINT64_C2(0xbaaee17f, 0xa23ebf76), + RAPIDJSON_UINT64_C2(0x8b16fb20, 0x3055ac76), RAPIDJSON_UINT64_C2(0xcf42894a, 0x5dce35ea), + RAPIDJSON_UINT64_C2(0x9a6bb0aa, 0x55653b2d), RAPIDJSON_UINT64_C2(0xe61acf03, 0x3d1a45df), + RAPIDJSON_UINT64_C2(0xab70fe17, 0xc79ac6ca), RAPIDJSON_UINT64_C2(0xff77b1fc, 0xbebcdc4f), + RAPIDJSON_UINT64_C2(0xbe5691ef, 0x416bd60c), RAPIDJSON_UINT64_C2(0x8dd01fad, 0x907ffc3c), + RAPIDJSON_UINT64_C2(0xd3515c28, 0x31559a83), RAPIDJSON_UINT64_C2(0x9d71ac8f, 0xada6c9b5), + RAPIDJSON_UINT64_C2(0xea9c2277, 0x23ee8bcb), RAPIDJSON_UINT64_C2(0xaecc4991, 0x4078536d), + RAPIDJSON_UINT64_C2(0x823c1279, 0x5db6ce57), RAPIDJSON_UINT64_C2(0xc2109436, 0x4dfb5637), + RAPIDJSON_UINT64_C2(0x9096ea6f, 0x3848984f), RAPIDJSON_UINT64_C2(0xd77485cb, 0x25823ac7), + RAPIDJSON_UINT64_C2(0xa086cfcd, 0x97bf97f4), RAPIDJSON_UINT64_C2(0xef340a98, 0x172aace5), + RAPIDJSON_UINT64_C2(0xb23867fb, 0x2a35b28e), RAPIDJSON_UINT64_C2(0x84c8d4df, 0xd2c63f3b), + RAPIDJSON_UINT64_C2(0xc5dd4427, 0x1ad3cdba), RAPIDJSON_UINT64_C2(0x936b9fce, 0xbb25c996), + RAPIDJSON_UINT64_C2(0xdbac6c24, 0x7d62a584), RAPIDJSON_UINT64_C2(0xa3ab6658, 0x0d5fdaf6), + RAPIDJSON_UINT64_C2(0xf3e2f893, 0xdec3f126), RAPIDJSON_UINT64_C2(0xb5b5ada8, 0xaaff80b8), + RAPIDJSON_UINT64_C2(0x87625f05, 0x6c7c4a8b), RAPIDJSON_UINT64_C2(0xc9bcff60, 0x34c13053), + RAPIDJSON_UINT64_C2(0x964e858c, 0x91ba2655), RAPIDJSON_UINT64_C2(0xdff97724, 0x70297ebd), + RAPIDJSON_UINT64_C2(0xa6dfbd9f, 0xb8e5b88f), RAPIDJSON_UINT64_C2(0xf8a95fcf, 0x88747d94), + RAPIDJSON_UINT64_C2(0xb9447093, 0x8fa89bcf), RAPIDJSON_UINT64_C2(0x8a08f0f8, 0xbf0f156b), + RAPIDJSON_UINT64_C2(0xcdb02555, 0x653131b6), RAPIDJSON_UINT64_C2(0x993fe2c6, 0xd07b7fac), + RAPIDJSON_UINT64_C2(0xe45c10c4, 0x2a2b3b06), RAPIDJSON_UINT64_C2(0xaa242499, 0x697392d3), + RAPIDJSON_UINT64_C2(0xfd87b5f2, 0x8300ca0e), RAPIDJSON_UINT64_C2(0xbce50864, 0x92111aeb), + RAPIDJSON_UINT64_C2(0x8cbccc09, 0x6f5088cc), RAPIDJSON_UINT64_C2(0xd1b71758, 0xe219652c), + RAPIDJSON_UINT64_C2(0x9c400000, 0x00000000), RAPIDJSON_UINT64_C2(0xe8d4a510, 0x00000000), + RAPIDJSON_UINT64_C2(0xad78ebc5, 0xac620000), RAPIDJSON_UINT64_C2(0x813f3978, 0xf8940984), + RAPIDJSON_UINT64_C2(0xc097ce7b, 0xc90715b3), RAPIDJSON_UINT64_C2(0x8f7e32ce, 0x7bea5c70), + RAPIDJSON_UINT64_C2(0xd5d238a4, 0xabe98068), RAPIDJSON_UINT64_C2(0x9f4f2726, 0x179a2245), + RAPIDJSON_UINT64_C2(0xed63a231, 0xd4c4fb27), RAPIDJSON_UINT64_C2(0xb0de6538, 0x8cc8ada8), + RAPIDJSON_UINT64_C2(0x83c7088e, 0x1aab65db), RAPIDJSON_UINT64_C2(0xc45d1df9, 0x42711d9a), + RAPIDJSON_UINT64_C2(0x924d692c, 0xa61be758), RAPIDJSON_UINT64_C2(0xda01ee64, 0x1a708dea), + RAPIDJSON_UINT64_C2(0xa26da399, 0x9aef774a), RAPIDJSON_UINT64_C2(0xf209787b, 0xb47d6b85), + RAPIDJSON_UINT64_C2(0xb454e4a1, 0x79dd1877), RAPIDJSON_UINT64_C2(0x865b8692, 0x5b9bc5c2), + RAPIDJSON_UINT64_C2(0xc83553c5, 0xc8965d3d), RAPIDJSON_UINT64_C2(0x952ab45c, 0xfa97a0b3), + RAPIDJSON_UINT64_C2(0xde469fbd, 0x99a05fe3), RAPIDJSON_UINT64_C2(0xa59bc234, 0xdb398c25), + RAPIDJSON_UINT64_C2(0xf6c69a72, 0xa3989f5c), RAPIDJSON_UINT64_C2(0xb7dcbf53, 0x54e9bece), + RAPIDJSON_UINT64_C2(0x88fcf317, 0xf22241e2), RAPIDJSON_UINT64_C2(0xcc20ce9b, 0xd35c78a5), + RAPIDJSON_UINT64_C2(0x98165af3, 0x7b2153df), RAPIDJSON_UINT64_C2(0xe2a0b5dc, 0x971f303a), + RAPIDJSON_UINT64_C2(0xa8d9d153, 0x5ce3b396), RAPIDJSON_UINT64_C2(0xfb9b7cd9, 0xa4a7443c), + RAPIDJSON_UINT64_C2(0xbb764c4c, 0xa7a44410), RAPIDJSON_UINT64_C2(0x8bab8eef, 0xb6409c1a), + RAPIDJSON_UINT64_C2(0xd01fef10, 0xa657842c), RAPIDJSON_UINT64_C2(0x9b10a4e5, 0xe9913129), + RAPIDJSON_UINT64_C2(0xe7109bfb, 0xa19c0c9d), RAPIDJSON_UINT64_C2(0xac2820d9, 0x623bf429), + RAPIDJSON_UINT64_C2(0x80444b5e, 0x7aa7cf85), RAPIDJSON_UINT64_C2(0xbf21e440, 0x03acdd2d), + RAPIDJSON_UINT64_C2(0x8e679c2f, 0x5e44ff8f), RAPIDJSON_UINT64_C2(0xd433179d, 0x9c8cb841), + RAPIDJSON_UINT64_C2(0x9e19db92, 0xb4e31ba9), RAPIDJSON_UINT64_C2(0xeb96bf6e, 0xbadf77d9), + RAPIDJSON_UINT64_C2(0xaf87023b, 0x9bf0ee6b) + }; + static const int16_t kCachedPowers_E[] = { + -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007, -980, + -954, -927, -901, -874, -847, -821, -794, -768, -741, -715, + -688, -661, -635, -608, -582, -555, -529, -502, -475, -449, + -422, -396, -369, -343, -316, -289, -263, -236, -210, -183, + -157, -130, -103, -77, -50, -24, 3, 30, 56, 83, + 109, 136, 162, 189, 216, 242, 269, 295, 322, 348, + 375, 402, 428, 455, 481, 508, 534, 561, 588, 614, + 641, 667, 694, 720, 747, 774, 800, 827, 853, 880, + 907, 933, 960, 986, 1013, 1039, 1066 + }; + return DiyFp(kCachedPowers_F[index], kCachedPowers_E[index]); +} + +inline DiyFp GetCachedPower(int e, int* K) { + + //int k = static_cast(ceil((-61 - e) * 0.30102999566398114)) + 374; + double dk = (-61 - e) * 0.30102999566398114 + 347; // dk must be positive, so can do ceiling in positive + int k = static_cast(dk); + if (dk - k > 0.0) + k++; + + unsigned index = static_cast((k >> 3) + 1); + *K = -(-348 + static_cast(index << 3)); // decimal exponent no need lookup table + + return GetCachedPowerByIndex(index); +} + +inline DiyFp GetCachedPower10(int exp, int *outExp) { + unsigned index = (static_cast(exp) + 348u) / 8u; + *outExp = -348 + static_cast(index) * 8; + return GetCachedPowerByIndex(index); + } + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +RAPIDJSON_DIAG_OFF(padded) +#endif + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_DIYFP_H_ diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/internal/dtoa.h b/Externals/discord-rpc/thirdparty/include/rapidjson/internal/dtoa.h new file mode 100644 index 0000000000..8d6350e626 --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/internal/dtoa.h @@ -0,0 +1,245 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +// This is a C++ header-only implementation of Grisu2 algorithm from the publication: +// Loitsch, Florian. "Printing floating-point numbers quickly and accurately with +// integers." ACM Sigplan Notices 45.6 (2010): 233-243. + +#ifndef RAPIDJSON_DTOA_ +#define RAPIDJSON_DTOA_ + +#include "itoa.h" // GetDigitsLut() +#include "diyfp.h" +#include "ieee754.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +RAPIDJSON_DIAG_OFF(array-bounds) // some gcc versions generate wrong warnings https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59124 +#endif + +inline void GrisuRound(char* buffer, int len, uint64_t delta, uint64_t rest, uint64_t ten_kappa, uint64_t wp_w) { + while (rest < wp_w && delta - rest >= ten_kappa && + (rest + ten_kappa < wp_w || /// closer + wp_w - rest > rest + ten_kappa - wp_w)) { + buffer[len - 1]--; + rest += ten_kappa; + } +} + +inline unsigned CountDecimalDigit32(uint32_t n) { + // Simple pure C++ implementation was faster than __builtin_clz version in this situation. + if (n < 10) return 1; + if (n < 100) return 2; + if (n < 1000) return 3; + if (n < 10000) return 4; + if (n < 100000) return 5; + if (n < 1000000) return 6; + if (n < 10000000) return 7; + if (n < 100000000) return 8; + // Will not reach 10 digits in DigitGen() + //if (n < 1000000000) return 9; + //return 10; + return 9; +} + +inline void DigitGen(const DiyFp& W, const DiyFp& Mp, uint64_t delta, char* buffer, int* len, int* K) { + static const uint32_t kPow10[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 }; + const DiyFp one(uint64_t(1) << -Mp.e, Mp.e); + const DiyFp wp_w = Mp - W; + uint32_t p1 = static_cast(Mp.f >> -one.e); + uint64_t p2 = Mp.f & (one.f - 1); + unsigned kappa = CountDecimalDigit32(p1); // kappa in [0, 9] + *len = 0; + + while (kappa > 0) { + uint32_t d = 0; + switch (kappa) { + case 9: d = p1 / 100000000; p1 %= 100000000; break; + case 8: d = p1 / 10000000; p1 %= 10000000; break; + case 7: d = p1 / 1000000; p1 %= 1000000; break; + case 6: d = p1 / 100000; p1 %= 100000; break; + case 5: d = p1 / 10000; p1 %= 10000; break; + case 4: d = p1 / 1000; p1 %= 1000; break; + case 3: d = p1 / 100; p1 %= 100; break; + case 2: d = p1 / 10; p1 %= 10; break; + case 1: d = p1; p1 = 0; break; + default:; + } + if (d || *len) + buffer[(*len)++] = static_cast('0' + static_cast(d)); + kappa--; + uint64_t tmp = (static_cast(p1) << -one.e) + p2; + if (tmp <= delta) { + *K += kappa; + GrisuRound(buffer, *len, delta, tmp, static_cast(kPow10[kappa]) << -one.e, wp_w.f); + return; + } + } + + // kappa = 0 + for (;;) { + p2 *= 10; + delta *= 10; + char d = static_cast(p2 >> -one.e); + if (d || *len) + buffer[(*len)++] = static_cast('0' + d); + p2 &= one.f - 1; + kappa--; + if (p2 < delta) { + *K += kappa; + int index = -static_cast(kappa); + GrisuRound(buffer, *len, delta, p2, one.f, wp_w.f * (index < 9 ? kPow10[-static_cast(kappa)] : 0)); + return; + } + } +} + +inline void Grisu2(double value, char* buffer, int* length, int* K) { + const DiyFp v(value); + DiyFp w_m, w_p; + v.NormalizedBoundaries(&w_m, &w_p); + + const DiyFp c_mk = GetCachedPower(w_p.e, K); + const DiyFp W = v.Normalize() * c_mk; + DiyFp Wp = w_p * c_mk; + DiyFp Wm = w_m * c_mk; + Wm.f++; + Wp.f--; + DigitGen(W, Wp, Wp.f - Wm.f, buffer, length, K); +} + +inline char* WriteExponent(int K, char* buffer) { + if (K < 0) { + *buffer++ = '-'; + K = -K; + } + + if (K >= 100) { + *buffer++ = static_cast('0' + static_cast(K / 100)); + K %= 100; + const char* d = GetDigitsLut() + K * 2; + *buffer++ = d[0]; + *buffer++ = d[1]; + } + else if (K >= 10) { + const char* d = GetDigitsLut() + K * 2; + *buffer++ = d[0]; + *buffer++ = d[1]; + } + else + *buffer++ = static_cast('0' + static_cast(K)); + + return buffer; +} + +inline char* Prettify(char* buffer, int length, int k, int maxDecimalPlaces) { + const int kk = length + k; // 10^(kk-1) <= v < 10^kk + + if (0 <= k && kk <= 21) { + // 1234e7 -> 12340000000 + for (int i = length; i < kk; i++) + buffer[i] = '0'; + buffer[kk] = '.'; + buffer[kk + 1] = '0'; + return &buffer[kk + 2]; + } + else if (0 < kk && kk <= 21) { + // 1234e-2 -> 12.34 + std::memmove(&buffer[kk + 1], &buffer[kk], static_cast(length - kk)); + buffer[kk] = '.'; + if (0 > k + maxDecimalPlaces) { + // When maxDecimalPlaces = 2, 1.2345 -> 1.23, 1.102 -> 1.1 + // Remove extra trailing zeros (at least one) after truncation. + for (int i = kk + maxDecimalPlaces; i > kk + 1; i--) + if (buffer[i] != '0') + return &buffer[i + 1]; + return &buffer[kk + 2]; // Reserve one zero + } + else + return &buffer[length + 1]; + } + else if (-6 < kk && kk <= 0) { + // 1234e-6 -> 0.001234 + const int offset = 2 - kk; + std::memmove(&buffer[offset], &buffer[0], static_cast(length)); + buffer[0] = '0'; + buffer[1] = '.'; + for (int i = 2; i < offset; i++) + buffer[i] = '0'; + if (length - kk > maxDecimalPlaces) { + // When maxDecimalPlaces = 2, 0.123 -> 0.12, 0.102 -> 0.1 + // Remove extra trailing zeros (at least one) after truncation. + for (int i = maxDecimalPlaces + 1; i > 2; i--) + if (buffer[i] != '0') + return &buffer[i + 1]; + return &buffer[3]; // Reserve one zero + } + else + return &buffer[length + offset]; + } + else if (kk < -maxDecimalPlaces) { + // Truncate to zero + buffer[0] = '0'; + buffer[1] = '.'; + buffer[2] = '0'; + return &buffer[3]; + } + else if (length == 1) { + // 1e30 + buffer[1] = 'e'; + return WriteExponent(kk - 1, &buffer[2]); + } + else { + // 1234e30 -> 1.234e33 + std::memmove(&buffer[2], &buffer[1], static_cast(length - 1)); + buffer[1] = '.'; + buffer[length + 1] = 'e'; + return WriteExponent(kk - 1, &buffer[0 + length + 2]); + } +} + +inline char* dtoa(double value, char* buffer, int maxDecimalPlaces = 324) { + RAPIDJSON_ASSERT(maxDecimalPlaces >= 1); + Double d(value); + if (d.IsZero()) { + if (d.Sign()) + *buffer++ = '-'; // -0.0, Issue #289 + buffer[0] = '0'; + buffer[1] = '.'; + buffer[2] = '0'; + return &buffer[3]; + } + else { + if (value < 0) { + *buffer++ = '-'; + value = -value; + } + int length, K; + Grisu2(value, buffer, &length, &K); + return Prettify(buffer, length, K, maxDecimalPlaces); + } +} + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_DTOA_ diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/internal/ieee754.h b/Externals/discord-rpc/thirdparty/include/rapidjson/internal/ieee754.h new file mode 100644 index 0000000000..82bb0b99e5 --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/internal/ieee754.h @@ -0,0 +1,78 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_IEEE754_ +#define RAPIDJSON_IEEE754_ + +#include "../rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +class Double { +public: + Double() {} + Double(double d) : d_(d) {} + Double(uint64_t u) : u_(u) {} + + double Value() const { return d_; } + uint64_t Uint64Value() const { return u_; } + + double NextPositiveDouble() const { + RAPIDJSON_ASSERT(!Sign()); + return Double(u_ + 1).Value(); + } + + bool Sign() const { return (u_ & kSignMask) != 0; } + uint64_t Significand() const { return u_ & kSignificandMask; } + int Exponent() const { return static_cast(((u_ & kExponentMask) >> kSignificandSize) - kExponentBias); } + + bool IsNan() const { return (u_ & kExponentMask) == kExponentMask && Significand() != 0; } + bool IsInf() const { return (u_ & kExponentMask) == kExponentMask && Significand() == 0; } + bool IsNanOrInf() const { return (u_ & kExponentMask) == kExponentMask; } + bool IsNormal() const { return (u_ & kExponentMask) != 0 || Significand() == 0; } + bool IsZero() const { return (u_ & (kExponentMask | kSignificandMask)) == 0; } + + uint64_t IntegerSignificand() const { return IsNormal() ? Significand() | kHiddenBit : Significand(); } + int IntegerExponent() const { return (IsNormal() ? Exponent() : kDenormalExponent) - kSignificandSize; } + uint64_t ToBias() const { return (u_ & kSignMask) ? ~u_ + 1 : u_ | kSignMask; } + + static unsigned EffectiveSignificandSize(int order) { + if (order >= -1021) + return 53; + else if (order <= -1074) + return 0; + else + return static_cast(order) + 1074; + } + +private: + static const int kSignificandSize = 52; + static const int kExponentBias = 0x3FF; + static const int kDenormalExponent = 1 - kExponentBias; + static const uint64_t kSignMask = RAPIDJSON_UINT64_C2(0x80000000, 0x00000000); + static const uint64_t kExponentMask = RAPIDJSON_UINT64_C2(0x7FF00000, 0x00000000); + static const uint64_t kSignificandMask = RAPIDJSON_UINT64_C2(0x000FFFFF, 0xFFFFFFFF); + static const uint64_t kHiddenBit = RAPIDJSON_UINT64_C2(0x00100000, 0x00000000); + + union { + double d_; + uint64_t u_; + }; +}; + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_IEEE754_ diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/internal/itoa.h b/Externals/discord-rpc/thirdparty/include/rapidjson/internal/itoa.h new file mode 100644 index 0000000000..01a4e7e72d --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/internal/itoa.h @@ -0,0 +1,304 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_ITOA_ +#define RAPIDJSON_ITOA_ + +#include "../rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +inline const char* GetDigitsLut() { + static const char cDigitsLut[200] = { + '0','0','0','1','0','2','0','3','0','4','0','5','0','6','0','7','0','8','0','9', + '1','0','1','1','1','2','1','3','1','4','1','5','1','6','1','7','1','8','1','9', + '2','0','2','1','2','2','2','3','2','4','2','5','2','6','2','7','2','8','2','9', + '3','0','3','1','3','2','3','3','3','4','3','5','3','6','3','7','3','8','3','9', + '4','0','4','1','4','2','4','3','4','4','4','5','4','6','4','7','4','8','4','9', + '5','0','5','1','5','2','5','3','5','4','5','5','5','6','5','7','5','8','5','9', + '6','0','6','1','6','2','6','3','6','4','6','5','6','6','6','7','6','8','6','9', + '7','0','7','1','7','2','7','3','7','4','7','5','7','6','7','7','7','8','7','9', + '8','0','8','1','8','2','8','3','8','4','8','5','8','6','8','7','8','8','8','9', + '9','0','9','1','9','2','9','3','9','4','9','5','9','6','9','7','9','8','9','9' + }; + return cDigitsLut; +} + +inline char* u32toa(uint32_t value, char* buffer) { + const char* cDigitsLut = GetDigitsLut(); + + if (value < 10000) { + const uint32_t d1 = (value / 100) << 1; + const uint32_t d2 = (value % 100) << 1; + + if (value >= 1000) + *buffer++ = cDigitsLut[d1]; + if (value >= 100) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= 10) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + } + else if (value < 100000000) { + // value = bbbbcccc + const uint32_t b = value / 10000; + const uint32_t c = value % 10000; + + const uint32_t d1 = (b / 100) << 1; + const uint32_t d2 = (b % 100) << 1; + + const uint32_t d3 = (c / 100) << 1; + const uint32_t d4 = (c % 100) << 1; + + if (value >= 10000000) + *buffer++ = cDigitsLut[d1]; + if (value >= 1000000) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= 100000) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + } + else { + // value = aabbbbcccc in decimal + + const uint32_t a = value / 100000000; // 1 to 42 + value %= 100000000; + + if (a >= 10) { + const unsigned i = a << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + } + else + *buffer++ = static_cast('0' + static_cast(a)); + + const uint32_t b = value / 10000; // 0 to 9999 + const uint32_t c = value % 10000; // 0 to 9999 + + const uint32_t d1 = (b / 100) << 1; + const uint32_t d2 = (b % 100) << 1; + + const uint32_t d3 = (c / 100) << 1; + const uint32_t d4 = (c % 100) << 1; + + *buffer++ = cDigitsLut[d1]; + *buffer++ = cDigitsLut[d1 + 1]; + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + } + return buffer; +} + +inline char* i32toa(int32_t value, char* buffer) { + uint32_t u = static_cast(value); + if (value < 0) { + *buffer++ = '-'; + u = ~u + 1; + } + + return u32toa(u, buffer); +} + +inline char* u64toa(uint64_t value, char* buffer) { + const char* cDigitsLut = GetDigitsLut(); + const uint64_t kTen8 = 100000000; + const uint64_t kTen9 = kTen8 * 10; + const uint64_t kTen10 = kTen8 * 100; + const uint64_t kTen11 = kTen8 * 1000; + const uint64_t kTen12 = kTen8 * 10000; + const uint64_t kTen13 = kTen8 * 100000; + const uint64_t kTen14 = kTen8 * 1000000; + const uint64_t kTen15 = kTen8 * 10000000; + const uint64_t kTen16 = kTen8 * kTen8; + + if (value < kTen8) { + uint32_t v = static_cast(value); + if (v < 10000) { + const uint32_t d1 = (v / 100) << 1; + const uint32_t d2 = (v % 100) << 1; + + if (v >= 1000) + *buffer++ = cDigitsLut[d1]; + if (v >= 100) + *buffer++ = cDigitsLut[d1 + 1]; + if (v >= 10) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + } + else { + // value = bbbbcccc + const uint32_t b = v / 10000; + const uint32_t c = v % 10000; + + const uint32_t d1 = (b / 100) << 1; + const uint32_t d2 = (b % 100) << 1; + + const uint32_t d3 = (c / 100) << 1; + const uint32_t d4 = (c % 100) << 1; + + if (value >= 10000000) + *buffer++ = cDigitsLut[d1]; + if (value >= 1000000) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= 100000) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + } + } + else if (value < kTen16) { + const uint32_t v0 = static_cast(value / kTen8); + const uint32_t v1 = static_cast(value % kTen8); + + const uint32_t b0 = v0 / 10000; + const uint32_t c0 = v0 % 10000; + + const uint32_t d1 = (b0 / 100) << 1; + const uint32_t d2 = (b0 % 100) << 1; + + const uint32_t d3 = (c0 / 100) << 1; + const uint32_t d4 = (c0 % 100) << 1; + + const uint32_t b1 = v1 / 10000; + const uint32_t c1 = v1 % 10000; + + const uint32_t d5 = (b1 / 100) << 1; + const uint32_t d6 = (b1 % 100) << 1; + + const uint32_t d7 = (c1 / 100) << 1; + const uint32_t d8 = (c1 % 100) << 1; + + if (value >= kTen15) + *buffer++ = cDigitsLut[d1]; + if (value >= kTen14) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= kTen13) + *buffer++ = cDigitsLut[d2]; + if (value >= kTen12) + *buffer++ = cDigitsLut[d2 + 1]; + if (value >= kTen11) + *buffer++ = cDigitsLut[d3]; + if (value >= kTen10) + *buffer++ = cDigitsLut[d3 + 1]; + if (value >= kTen9) + *buffer++ = cDigitsLut[d4]; + if (value >= kTen8) + *buffer++ = cDigitsLut[d4 + 1]; + + *buffer++ = cDigitsLut[d5]; + *buffer++ = cDigitsLut[d5 + 1]; + *buffer++ = cDigitsLut[d6]; + *buffer++ = cDigitsLut[d6 + 1]; + *buffer++ = cDigitsLut[d7]; + *buffer++ = cDigitsLut[d7 + 1]; + *buffer++ = cDigitsLut[d8]; + *buffer++ = cDigitsLut[d8 + 1]; + } + else { + const uint32_t a = static_cast(value / kTen16); // 1 to 1844 + value %= kTen16; + + if (a < 10) + *buffer++ = static_cast('0' + static_cast(a)); + else if (a < 100) { + const uint32_t i = a << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + } + else if (a < 1000) { + *buffer++ = static_cast('0' + static_cast(a / 100)); + + const uint32_t i = (a % 100) << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + } + else { + const uint32_t i = (a / 100) << 1; + const uint32_t j = (a % 100) << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + *buffer++ = cDigitsLut[j]; + *buffer++ = cDigitsLut[j + 1]; + } + + const uint32_t v0 = static_cast(value / kTen8); + const uint32_t v1 = static_cast(value % kTen8); + + const uint32_t b0 = v0 / 10000; + const uint32_t c0 = v0 % 10000; + + const uint32_t d1 = (b0 / 100) << 1; + const uint32_t d2 = (b0 % 100) << 1; + + const uint32_t d3 = (c0 / 100) << 1; + const uint32_t d4 = (c0 % 100) << 1; + + const uint32_t b1 = v1 / 10000; + const uint32_t c1 = v1 % 10000; + + const uint32_t d5 = (b1 / 100) << 1; + const uint32_t d6 = (b1 % 100) << 1; + + const uint32_t d7 = (c1 / 100) << 1; + const uint32_t d8 = (c1 % 100) << 1; + + *buffer++ = cDigitsLut[d1]; + *buffer++ = cDigitsLut[d1 + 1]; + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + *buffer++ = cDigitsLut[d5]; + *buffer++ = cDigitsLut[d5 + 1]; + *buffer++ = cDigitsLut[d6]; + *buffer++ = cDigitsLut[d6 + 1]; + *buffer++ = cDigitsLut[d7]; + *buffer++ = cDigitsLut[d7 + 1]; + *buffer++ = cDigitsLut[d8]; + *buffer++ = cDigitsLut[d8 + 1]; + } + + return buffer; +} + +inline char* i64toa(int64_t value, char* buffer) { + uint64_t u = static_cast(value); + if (value < 0) { + *buffer++ = '-'; + u = ~u + 1; + } + + return u64toa(u, buffer); +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_ITOA_ diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/internal/meta.h b/Externals/discord-rpc/thirdparty/include/rapidjson/internal/meta.h new file mode 100644 index 0000000000..5a9aaa4286 --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/internal/meta.h @@ -0,0 +1,181 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_INTERNAL_META_H_ +#define RAPIDJSON_INTERNAL_META_H_ + +#include "../rapidjson.h" + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif +#if defined(_MSC_VER) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(6334) +#endif + +#if RAPIDJSON_HAS_CXX11_TYPETRAITS +#include +#endif + +//@cond RAPIDJSON_INTERNAL +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +// Helper to wrap/convert arbitrary types to void, useful for arbitrary type matching +template struct Void { typedef void Type; }; + +/////////////////////////////////////////////////////////////////////////////// +// BoolType, TrueType, FalseType +// +template struct BoolType { + static const bool Value = Cond; + typedef BoolType Type; +}; +typedef BoolType TrueType; +typedef BoolType FalseType; + + +/////////////////////////////////////////////////////////////////////////////// +// SelectIf, BoolExpr, NotExpr, AndExpr, OrExpr +// + +template struct SelectIfImpl { template struct Apply { typedef T1 Type; }; }; +template <> struct SelectIfImpl { template struct Apply { typedef T2 Type; }; }; +template struct SelectIfCond : SelectIfImpl::template Apply {}; +template struct SelectIf : SelectIfCond {}; + +template struct AndExprCond : FalseType {}; +template <> struct AndExprCond : TrueType {}; +template struct OrExprCond : TrueType {}; +template <> struct OrExprCond : FalseType {}; + +template struct BoolExpr : SelectIf::Type {}; +template struct NotExpr : SelectIf::Type {}; +template struct AndExpr : AndExprCond::Type {}; +template struct OrExpr : OrExprCond::Type {}; + + +/////////////////////////////////////////////////////////////////////////////// +// AddConst, MaybeAddConst, RemoveConst +template struct AddConst { typedef const T Type; }; +template struct MaybeAddConst : SelectIfCond {}; +template struct RemoveConst { typedef T Type; }; +template struct RemoveConst { typedef T Type; }; + + +/////////////////////////////////////////////////////////////////////////////// +// IsSame, IsConst, IsMoreConst, IsPointer +// +template struct IsSame : FalseType {}; +template struct IsSame : TrueType {}; + +template struct IsConst : FalseType {}; +template struct IsConst : TrueType {}; + +template +struct IsMoreConst + : AndExpr::Type, typename RemoveConst::Type>, + BoolType::Value >= IsConst::Value> >::Type {}; + +template struct IsPointer : FalseType {}; +template struct IsPointer : TrueType {}; + +/////////////////////////////////////////////////////////////////////////////// +// IsBaseOf +// +#if RAPIDJSON_HAS_CXX11_TYPETRAITS + +template struct IsBaseOf + : BoolType< ::std::is_base_of::value> {}; + +#else // simplified version adopted from Boost + +template struct IsBaseOfImpl { + RAPIDJSON_STATIC_ASSERT(sizeof(B) != 0); + RAPIDJSON_STATIC_ASSERT(sizeof(D) != 0); + + typedef char (&Yes)[1]; + typedef char (&No) [2]; + + template + static Yes Check(const D*, T); + static No Check(const B*, int); + + struct Host { + operator const B*() const; + operator const D*(); + }; + + enum { Value = (sizeof(Check(Host(), 0)) == sizeof(Yes)) }; +}; + +template struct IsBaseOf + : OrExpr, BoolExpr > >::Type {}; + +#endif // RAPIDJSON_HAS_CXX11_TYPETRAITS + + +////////////////////////////////////////////////////////////////////////// +// EnableIf / DisableIf +// +template struct EnableIfCond { typedef T Type; }; +template struct EnableIfCond { /* empty */ }; + +template struct DisableIfCond { typedef T Type; }; +template struct DisableIfCond { /* empty */ }; + +template +struct EnableIf : EnableIfCond {}; + +template +struct DisableIf : DisableIfCond {}; + +// SFINAE helpers +struct SfinaeTag {}; +template struct RemoveSfinaeTag; +template struct RemoveSfinaeTag { typedef T Type; }; + +#define RAPIDJSON_REMOVEFPTR_(type) \ + typename ::RAPIDJSON_NAMESPACE::internal::RemoveSfinaeTag \ + < ::RAPIDJSON_NAMESPACE::internal::SfinaeTag&(*) type>::Type + +#define RAPIDJSON_ENABLEIF(cond) \ + typename ::RAPIDJSON_NAMESPACE::internal::EnableIf \ + ::Type * = NULL + +#define RAPIDJSON_DISABLEIF(cond) \ + typename ::RAPIDJSON_NAMESPACE::internal::DisableIf \ + ::Type * = NULL + +#define RAPIDJSON_ENABLEIF_RETURN(cond,returntype) \ + typename ::RAPIDJSON_NAMESPACE::internal::EnableIf \ + ::Type + +#define RAPIDJSON_DISABLEIF_RETURN(cond,returntype) \ + typename ::RAPIDJSON_NAMESPACE::internal::DisableIf \ + ::Type + +} // namespace internal +RAPIDJSON_NAMESPACE_END +//@endcond + +#if defined(__GNUC__) || defined(_MSC_VER) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_INTERNAL_META_H_ diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/internal/pow10.h b/Externals/discord-rpc/thirdparty/include/rapidjson/internal/pow10.h new file mode 100644 index 0000000000..02f475d705 --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/internal/pow10.h @@ -0,0 +1,55 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_POW10_ +#define RAPIDJSON_POW10_ + +#include "../rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +//! Computes integer powers of 10 in double (10.0^n). +/*! This function uses lookup table for fast and accurate results. + \param n non-negative exponent. Must <= 308. + \return 10.0^n +*/ +inline double Pow10(int n) { + static const double e[] = { // 1e-0...1e308: 309 * 8 bytes = 2472 bytes + 1e+0, + 1e+1, 1e+2, 1e+3, 1e+4, 1e+5, 1e+6, 1e+7, 1e+8, 1e+9, 1e+10, 1e+11, 1e+12, 1e+13, 1e+14, 1e+15, 1e+16, 1e+17, 1e+18, 1e+19, 1e+20, + 1e+21, 1e+22, 1e+23, 1e+24, 1e+25, 1e+26, 1e+27, 1e+28, 1e+29, 1e+30, 1e+31, 1e+32, 1e+33, 1e+34, 1e+35, 1e+36, 1e+37, 1e+38, 1e+39, 1e+40, + 1e+41, 1e+42, 1e+43, 1e+44, 1e+45, 1e+46, 1e+47, 1e+48, 1e+49, 1e+50, 1e+51, 1e+52, 1e+53, 1e+54, 1e+55, 1e+56, 1e+57, 1e+58, 1e+59, 1e+60, + 1e+61, 1e+62, 1e+63, 1e+64, 1e+65, 1e+66, 1e+67, 1e+68, 1e+69, 1e+70, 1e+71, 1e+72, 1e+73, 1e+74, 1e+75, 1e+76, 1e+77, 1e+78, 1e+79, 1e+80, + 1e+81, 1e+82, 1e+83, 1e+84, 1e+85, 1e+86, 1e+87, 1e+88, 1e+89, 1e+90, 1e+91, 1e+92, 1e+93, 1e+94, 1e+95, 1e+96, 1e+97, 1e+98, 1e+99, 1e+100, + 1e+101,1e+102,1e+103,1e+104,1e+105,1e+106,1e+107,1e+108,1e+109,1e+110,1e+111,1e+112,1e+113,1e+114,1e+115,1e+116,1e+117,1e+118,1e+119,1e+120, + 1e+121,1e+122,1e+123,1e+124,1e+125,1e+126,1e+127,1e+128,1e+129,1e+130,1e+131,1e+132,1e+133,1e+134,1e+135,1e+136,1e+137,1e+138,1e+139,1e+140, + 1e+141,1e+142,1e+143,1e+144,1e+145,1e+146,1e+147,1e+148,1e+149,1e+150,1e+151,1e+152,1e+153,1e+154,1e+155,1e+156,1e+157,1e+158,1e+159,1e+160, + 1e+161,1e+162,1e+163,1e+164,1e+165,1e+166,1e+167,1e+168,1e+169,1e+170,1e+171,1e+172,1e+173,1e+174,1e+175,1e+176,1e+177,1e+178,1e+179,1e+180, + 1e+181,1e+182,1e+183,1e+184,1e+185,1e+186,1e+187,1e+188,1e+189,1e+190,1e+191,1e+192,1e+193,1e+194,1e+195,1e+196,1e+197,1e+198,1e+199,1e+200, + 1e+201,1e+202,1e+203,1e+204,1e+205,1e+206,1e+207,1e+208,1e+209,1e+210,1e+211,1e+212,1e+213,1e+214,1e+215,1e+216,1e+217,1e+218,1e+219,1e+220, + 1e+221,1e+222,1e+223,1e+224,1e+225,1e+226,1e+227,1e+228,1e+229,1e+230,1e+231,1e+232,1e+233,1e+234,1e+235,1e+236,1e+237,1e+238,1e+239,1e+240, + 1e+241,1e+242,1e+243,1e+244,1e+245,1e+246,1e+247,1e+248,1e+249,1e+250,1e+251,1e+252,1e+253,1e+254,1e+255,1e+256,1e+257,1e+258,1e+259,1e+260, + 1e+261,1e+262,1e+263,1e+264,1e+265,1e+266,1e+267,1e+268,1e+269,1e+270,1e+271,1e+272,1e+273,1e+274,1e+275,1e+276,1e+277,1e+278,1e+279,1e+280, + 1e+281,1e+282,1e+283,1e+284,1e+285,1e+286,1e+287,1e+288,1e+289,1e+290,1e+291,1e+292,1e+293,1e+294,1e+295,1e+296,1e+297,1e+298,1e+299,1e+300, + 1e+301,1e+302,1e+303,1e+304,1e+305,1e+306,1e+307,1e+308 + }; + RAPIDJSON_ASSERT(n >= 0 && n <= 308); + return e[n]; +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_POW10_ diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/internal/regex.h b/Externals/discord-rpc/thirdparty/include/rapidjson/internal/regex.h new file mode 100644 index 0000000000..422a5240bf --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/internal/regex.h @@ -0,0 +1,701 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_INTERNAL_REGEX_H_ +#define RAPIDJSON_INTERNAL_REGEX_H_ + +#include "../allocators.h" +#include "../stream.h" +#include "stack.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(switch-enum) +RAPIDJSON_DIAG_OFF(implicit-fallthrough) +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +#ifndef RAPIDJSON_REGEX_VERBOSE +#define RAPIDJSON_REGEX_VERBOSE 0 +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +/////////////////////////////////////////////////////////////////////////////// +// GenericRegex + +static const SizeType kRegexInvalidState = ~SizeType(0); //!< Represents an invalid index in GenericRegex::State::out, out1 +static const SizeType kRegexInvalidRange = ~SizeType(0); + +//! Regular expression engine with subset of ECMAscript grammar. +/*! + Supported regular expression syntax: + - \c ab Concatenation + - \c a|b Alternation + - \c a? Zero or one + - \c a* Zero or more + - \c a+ One or more + - \c a{3} Exactly 3 times + - \c a{3,} At least 3 times + - \c a{3,5} 3 to 5 times + - \c (ab) Grouping + - \c ^a At the beginning + - \c a$ At the end + - \c . Any character + - \c [abc] Character classes + - \c [a-c] Character class range + - \c [a-z0-9_] Character class combination + - \c [^abc] Negated character classes + - \c [^a-c] Negated character class range + - \c [\b] Backspace (U+0008) + - \c \\| \\\\ ... Escape characters + - \c \\f Form feed (U+000C) + - \c \\n Line feed (U+000A) + - \c \\r Carriage return (U+000D) + - \c \\t Tab (U+0009) + - \c \\v Vertical tab (U+000B) + + \note This is a Thompson NFA engine, implemented with reference to + Cox, Russ. "Regular Expression Matching Can Be Simple And Fast (but is slow in Java, Perl, PHP, Python, Ruby,...).", + https://swtch.com/~rsc/regexp/regexp1.html +*/ +template +class GenericRegex { +public: + typedef typename Encoding::Ch Ch; + + GenericRegex(const Ch* source, Allocator* allocator = 0) : + states_(allocator, 256), ranges_(allocator, 256), root_(kRegexInvalidState), stateCount_(), rangeCount_(), + stateSet_(), state0_(allocator, 0), state1_(allocator, 0), anchorBegin_(), anchorEnd_() + { + GenericStringStream ss(source); + DecodedStream > ds(ss); + Parse(ds); + } + + ~GenericRegex() { + Allocator::Free(stateSet_); + } + + bool IsValid() const { + return root_ != kRegexInvalidState; + } + + template + bool Match(InputStream& is) const { + return SearchWithAnchoring(is, true, true); + } + + bool Match(const Ch* s) const { + GenericStringStream is(s); + return Match(is); + } + + template + bool Search(InputStream& is) const { + return SearchWithAnchoring(is, anchorBegin_, anchorEnd_); + } + + bool Search(const Ch* s) const { + GenericStringStream is(s); + return Search(is); + } + +private: + enum Operator { + kZeroOrOne, + kZeroOrMore, + kOneOrMore, + kConcatenation, + kAlternation, + kLeftParenthesis + }; + + static const unsigned kAnyCharacterClass = 0xFFFFFFFF; //!< For '.' + static const unsigned kRangeCharacterClass = 0xFFFFFFFE; + static const unsigned kRangeNegationFlag = 0x80000000; + + struct Range { + unsigned start; // + unsigned end; + SizeType next; + }; + + struct State { + SizeType out; //!< Equals to kInvalid for matching state + SizeType out1; //!< Equals to non-kInvalid for split + SizeType rangeStart; + unsigned codepoint; + }; + + struct Frag { + Frag(SizeType s, SizeType o, SizeType m) : start(s), out(o), minIndex(m) {} + SizeType start; + SizeType out; //!< link-list of all output states + SizeType minIndex; + }; + + template + class DecodedStream { + public: + DecodedStream(SourceStream& ss) : ss_(ss), codepoint_() { Decode(); } + unsigned Peek() { return codepoint_; } + unsigned Take() { + unsigned c = codepoint_; + if (c) // No further decoding when '\0' + Decode(); + return c; + } + + private: + void Decode() { + if (!Encoding::Decode(ss_, &codepoint_)) + codepoint_ = 0; + } + + SourceStream& ss_; + unsigned codepoint_; + }; + + State& GetState(SizeType index) { + RAPIDJSON_ASSERT(index < stateCount_); + return states_.template Bottom()[index]; + } + + const State& GetState(SizeType index) const { + RAPIDJSON_ASSERT(index < stateCount_); + return states_.template Bottom()[index]; + } + + Range& GetRange(SizeType index) { + RAPIDJSON_ASSERT(index < rangeCount_); + return ranges_.template Bottom()[index]; + } + + const Range& GetRange(SizeType index) const { + RAPIDJSON_ASSERT(index < rangeCount_); + return ranges_.template Bottom()[index]; + } + + template + void Parse(DecodedStream& ds) { + Allocator allocator; + Stack operandStack(&allocator, 256); // Frag + Stack operatorStack(&allocator, 256); // Operator + Stack atomCountStack(&allocator, 256); // unsigned (Atom per parenthesis) + + *atomCountStack.template Push() = 0; + + unsigned codepoint; + while (ds.Peek() != 0) { + switch (codepoint = ds.Take()) { + case '^': + anchorBegin_ = true; + break; + + case '$': + anchorEnd_ = true; + break; + + case '|': + while (!operatorStack.Empty() && *operatorStack.template Top() < kAlternation) + if (!Eval(operandStack, *operatorStack.template Pop(1))) + return; + *operatorStack.template Push() = kAlternation; + *atomCountStack.template Top() = 0; + break; + + case '(': + *operatorStack.template Push() = kLeftParenthesis; + *atomCountStack.template Push() = 0; + break; + + case ')': + while (!operatorStack.Empty() && *operatorStack.template Top() != kLeftParenthesis) + if (!Eval(operandStack, *operatorStack.template Pop(1))) + return; + if (operatorStack.Empty()) + return; + operatorStack.template Pop(1); + atomCountStack.template Pop(1); + ImplicitConcatenation(atomCountStack, operatorStack); + break; + + case '?': + if (!Eval(operandStack, kZeroOrOne)) + return; + break; + + case '*': + if (!Eval(operandStack, kZeroOrMore)) + return; + break; + + case '+': + if (!Eval(operandStack, kOneOrMore)) + return; + break; + + case '{': + { + unsigned n, m; + if (!ParseUnsigned(ds, &n)) + return; + + if (ds.Peek() == ',') { + ds.Take(); + if (ds.Peek() == '}') + m = kInfinityQuantifier; + else if (!ParseUnsigned(ds, &m) || m < n) + return; + } + else + m = n; + + if (!EvalQuantifier(operandStack, n, m) || ds.Peek() != '}') + return; + ds.Take(); + } + break; + + case '.': + PushOperand(operandStack, kAnyCharacterClass); + ImplicitConcatenation(atomCountStack, operatorStack); + break; + + case '[': + { + SizeType range; + if (!ParseRange(ds, &range)) + return; + SizeType s = NewState(kRegexInvalidState, kRegexInvalidState, kRangeCharacterClass); + GetState(s).rangeStart = range; + *operandStack.template Push() = Frag(s, s, s); + } + ImplicitConcatenation(atomCountStack, operatorStack); + break; + + case '\\': // Escape character + if (!CharacterEscape(ds, &codepoint)) + return; // Unsupported escape character + // fall through to default + + default: // Pattern character + PushOperand(operandStack, codepoint); + ImplicitConcatenation(atomCountStack, operatorStack); + } + } + + while (!operatorStack.Empty()) + if (!Eval(operandStack, *operatorStack.template Pop(1))) + return; + + // Link the operand to matching state. + if (operandStack.GetSize() == sizeof(Frag)) { + Frag* e = operandStack.template Pop(1); + Patch(e->out, NewState(kRegexInvalidState, kRegexInvalidState, 0)); + root_ = e->start; + +#if RAPIDJSON_REGEX_VERBOSE + printf("root: %d\n", root_); + for (SizeType i = 0; i < stateCount_ ; i++) { + State& s = GetState(i); + printf("[%2d] out: %2d out1: %2d c: '%c'\n", i, s.out, s.out1, (char)s.codepoint); + } + printf("\n"); +#endif + } + + // Preallocate buffer for SearchWithAnchoring() + RAPIDJSON_ASSERT(stateSet_ == 0); + if (stateCount_ > 0) { + stateSet_ = static_cast(states_.GetAllocator().Malloc(GetStateSetSize())); + state0_.template Reserve(stateCount_); + state1_.template Reserve(stateCount_); + } + } + + SizeType NewState(SizeType out, SizeType out1, unsigned codepoint) { + State* s = states_.template Push(); + s->out = out; + s->out1 = out1; + s->codepoint = codepoint; + s->rangeStart = kRegexInvalidRange; + return stateCount_++; + } + + void PushOperand(Stack& operandStack, unsigned codepoint) { + SizeType s = NewState(kRegexInvalidState, kRegexInvalidState, codepoint); + *operandStack.template Push() = Frag(s, s, s); + } + + void ImplicitConcatenation(Stack& atomCountStack, Stack& operatorStack) { + if (*atomCountStack.template Top()) + *operatorStack.template Push() = kConcatenation; + (*atomCountStack.template Top())++; + } + + SizeType Append(SizeType l1, SizeType l2) { + SizeType old = l1; + while (GetState(l1).out != kRegexInvalidState) + l1 = GetState(l1).out; + GetState(l1).out = l2; + return old; + } + + void Patch(SizeType l, SizeType s) { + for (SizeType next; l != kRegexInvalidState; l = next) { + next = GetState(l).out; + GetState(l).out = s; + } + } + + bool Eval(Stack& operandStack, Operator op) { + switch (op) { + case kConcatenation: + RAPIDJSON_ASSERT(operandStack.GetSize() >= sizeof(Frag) * 2); + { + Frag e2 = *operandStack.template Pop(1); + Frag e1 = *operandStack.template Pop(1); + Patch(e1.out, e2.start); + *operandStack.template Push() = Frag(e1.start, e2.out, Min(e1.minIndex, e2.minIndex)); + } + return true; + + case kAlternation: + if (operandStack.GetSize() >= sizeof(Frag) * 2) { + Frag e2 = *operandStack.template Pop(1); + Frag e1 = *operandStack.template Pop(1); + SizeType s = NewState(e1.start, e2.start, 0); + *operandStack.template Push() = Frag(s, Append(e1.out, e2.out), Min(e1.minIndex, e2.minIndex)); + return true; + } + return false; + + case kZeroOrOne: + if (operandStack.GetSize() >= sizeof(Frag)) { + Frag e = *operandStack.template Pop(1); + SizeType s = NewState(kRegexInvalidState, e.start, 0); + *operandStack.template Push() = Frag(s, Append(e.out, s), e.minIndex); + return true; + } + return false; + + case kZeroOrMore: + if (operandStack.GetSize() >= sizeof(Frag)) { + Frag e = *operandStack.template Pop(1); + SizeType s = NewState(kRegexInvalidState, e.start, 0); + Patch(e.out, s); + *operandStack.template Push() = Frag(s, s, e.minIndex); + return true; + } + return false; + + default: + RAPIDJSON_ASSERT(op == kOneOrMore); + if (operandStack.GetSize() >= sizeof(Frag)) { + Frag e = *operandStack.template Pop(1); + SizeType s = NewState(kRegexInvalidState, e.start, 0); + Patch(e.out, s); + *operandStack.template Push() = Frag(e.start, s, e.minIndex); + return true; + } + return false; + } + } + + bool EvalQuantifier(Stack& operandStack, unsigned n, unsigned m) { + RAPIDJSON_ASSERT(n <= m); + RAPIDJSON_ASSERT(operandStack.GetSize() >= sizeof(Frag)); + + if (n == 0) { + if (m == 0) // a{0} not support + return false; + else if (m == kInfinityQuantifier) + Eval(operandStack, kZeroOrMore); // a{0,} -> a* + else { + Eval(operandStack, kZeroOrOne); // a{0,5} -> a? + for (unsigned i = 0; i < m - 1; i++) + CloneTopOperand(operandStack); // a{0,5} -> a? a? a? a? a? + for (unsigned i = 0; i < m - 1; i++) + Eval(operandStack, kConcatenation); // a{0,5} -> a?a?a?a?a? + } + return true; + } + + for (unsigned i = 0; i < n - 1; i++) // a{3} -> a a a + CloneTopOperand(operandStack); + + if (m == kInfinityQuantifier) + Eval(operandStack, kOneOrMore); // a{3,} -> a a a+ + else if (m > n) { + CloneTopOperand(operandStack); // a{3,5} -> a a a a + Eval(operandStack, kZeroOrOne); // a{3,5} -> a a a a? + for (unsigned i = n; i < m - 1; i++) + CloneTopOperand(operandStack); // a{3,5} -> a a a a? a? + for (unsigned i = n; i < m; i++) + Eval(operandStack, kConcatenation); // a{3,5} -> a a aa?a? + } + + for (unsigned i = 0; i < n - 1; i++) + Eval(operandStack, kConcatenation); // a{3} -> aaa, a{3,} -> aaa+, a{3.5} -> aaaa?a? + + return true; + } + + static SizeType Min(SizeType a, SizeType b) { return a < b ? a : b; } + + void CloneTopOperand(Stack& operandStack) { + const Frag src = *operandStack.template Top(); // Copy constructor to prevent invalidation + SizeType count = stateCount_ - src.minIndex; // Assumes top operand contains states in [src->minIndex, stateCount_) + State* s = states_.template Push(count); + memcpy(s, &GetState(src.minIndex), count * sizeof(State)); + for (SizeType j = 0; j < count; j++) { + if (s[j].out != kRegexInvalidState) + s[j].out += count; + if (s[j].out1 != kRegexInvalidState) + s[j].out1 += count; + } + *operandStack.template Push() = Frag(src.start + count, src.out + count, src.minIndex + count); + stateCount_ += count; + } + + template + bool ParseUnsigned(DecodedStream& ds, unsigned* u) { + unsigned r = 0; + if (ds.Peek() < '0' || ds.Peek() > '9') + return false; + while (ds.Peek() >= '0' && ds.Peek() <= '9') { + if (r >= 429496729 && ds.Peek() > '5') // 2^32 - 1 = 4294967295 + return false; // overflow + r = r * 10 + (ds.Take() - '0'); + } + *u = r; + return true; + } + + template + bool ParseRange(DecodedStream& ds, SizeType* range) { + bool isBegin = true; + bool negate = false; + int step = 0; + SizeType start = kRegexInvalidRange; + SizeType current = kRegexInvalidRange; + unsigned codepoint; + while ((codepoint = ds.Take()) != 0) { + if (isBegin) { + isBegin = false; + if (codepoint == '^') { + negate = true; + continue; + } + } + + switch (codepoint) { + case ']': + if (start == kRegexInvalidRange) + return false; // Error: nothing inside [] + if (step == 2) { // Add trailing '-' + SizeType r = NewRange('-'); + RAPIDJSON_ASSERT(current != kRegexInvalidRange); + GetRange(current).next = r; + } + if (negate) + GetRange(start).start |= kRangeNegationFlag; + *range = start; + return true; + + case '\\': + if (ds.Peek() == 'b') { + ds.Take(); + codepoint = 0x0008; // Escape backspace character + } + else if (!CharacterEscape(ds, &codepoint)) + return false; + // fall through to default + + default: + switch (step) { + case 1: + if (codepoint == '-') { + step++; + break; + } + // fall through to step 0 for other characters + + case 0: + { + SizeType r = NewRange(codepoint); + if (current != kRegexInvalidRange) + GetRange(current).next = r; + if (start == kRegexInvalidRange) + start = r; + current = r; + } + step = 1; + break; + + default: + RAPIDJSON_ASSERT(step == 2); + GetRange(current).end = codepoint; + step = 0; + } + } + } + return false; + } + + SizeType NewRange(unsigned codepoint) { + Range* r = ranges_.template Push(); + r->start = r->end = codepoint; + r->next = kRegexInvalidRange; + return rangeCount_++; + } + + template + bool CharacterEscape(DecodedStream& ds, unsigned* escapedCodepoint) { + unsigned codepoint; + switch (codepoint = ds.Take()) { + case '^': + case '$': + case '|': + case '(': + case ')': + case '?': + case '*': + case '+': + case '.': + case '[': + case ']': + case '{': + case '}': + case '\\': + *escapedCodepoint = codepoint; return true; + case 'f': *escapedCodepoint = 0x000C; return true; + case 'n': *escapedCodepoint = 0x000A; return true; + case 'r': *escapedCodepoint = 0x000D; return true; + case 't': *escapedCodepoint = 0x0009; return true; + case 'v': *escapedCodepoint = 0x000B; return true; + default: + return false; // Unsupported escape character + } + } + + template + bool SearchWithAnchoring(InputStream& is, bool anchorBegin, bool anchorEnd) const { + RAPIDJSON_ASSERT(IsValid()); + DecodedStream ds(is); + + state0_.Clear(); + Stack *current = &state0_, *next = &state1_; + const size_t stateSetSize = GetStateSetSize(); + std::memset(stateSet_, 0, stateSetSize); + + bool matched = AddState(*current, root_); + unsigned codepoint; + while (!current->Empty() && (codepoint = ds.Take()) != 0) { + std::memset(stateSet_, 0, stateSetSize); + next->Clear(); + matched = false; + for (const SizeType* s = current->template Bottom(); s != current->template End(); ++s) { + const State& sr = GetState(*s); + if (sr.codepoint == codepoint || + sr.codepoint == kAnyCharacterClass || + (sr.codepoint == kRangeCharacterClass && MatchRange(sr.rangeStart, codepoint))) + { + matched = AddState(*next, sr.out) || matched; + if (!anchorEnd && matched) + return true; + } + if (!anchorBegin) + AddState(*next, root_); + } + internal::Swap(current, next); + } + + return matched; + } + + size_t GetStateSetSize() const { + return (stateCount_ + 31) / 32 * 4; + } + + // Return whether the added states is a match state + bool AddState(Stack& l, SizeType index) const { + RAPIDJSON_ASSERT(index != kRegexInvalidState); + + const State& s = GetState(index); + if (s.out1 != kRegexInvalidState) { // Split + bool matched = AddState(l, s.out); + return AddState(l, s.out1) || matched; + } + else if (!(stateSet_[index >> 5] & (1 << (index & 31)))) { + stateSet_[index >> 5] |= (1 << (index & 31)); + *l.template PushUnsafe() = index; + } + return s.out == kRegexInvalidState; // by using PushUnsafe() above, we can ensure s is not validated due to reallocation. + } + + bool MatchRange(SizeType rangeIndex, unsigned codepoint) const { + bool yes = (GetRange(rangeIndex).start & kRangeNegationFlag) == 0; + while (rangeIndex != kRegexInvalidRange) { + const Range& r = GetRange(rangeIndex); + if (codepoint >= (r.start & ~kRangeNegationFlag) && codepoint <= r.end) + return yes; + rangeIndex = r.next; + } + return !yes; + } + + Stack states_; + Stack ranges_; + SizeType root_; + SizeType stateCount_; + SizeType rangeCount_; + + static const unsigned kInfinityQuantifier = ~0u; + + // For SearchWithAnchoring() + uint32_t* stateSet_; // allocated by states_.GetAllocator() + mutable Stack state0_; + mutable Stack state1_; + bool anchorBegin_; + bool anchorEnd_; +}; + +typedef GenericRegex > Regex; + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_INTERNAL_REGEX_H_ diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/internal/stack.h b/Externals/discord-rpc/thirdparty/include/rapidjson/internal/stack.h new file mode 100644 index 0000000000..022c9aab41 --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/internal/stack.h @@ -0,0 +1,230 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_INTERNAL_STACK_H_ +#define RAPIDJSON_INTERNAL_STACK_H_ + +#include "../allocators.h" +#include "swap.h" + +#if defined(__clang__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(c++98-compat) +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +/////////////////////////////////////////////////////////////////////////////// +// Stack + +//! A type-unsafe stack for storing different types of data. +/*! \tparam Allocator Allocator for allocating stack memory. +*/ +template +class Stack { +public: + // Optimization note: Do not allocate memory for stack_ in constructor. + // Do it lazily when first Push() -> Expand() -> Resize(). + Stack(Allocator* allocator, size_t stackCapacity) : allocator_(allocator), ownAllocator_(0), stack_(0), stackTop_(0), stackEnd_(0), initialCapacity_(stackCapacity) { + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + Stack(Stack&& rhs) + : allocator_(rhs.allocator_), + ownAllocator_(rhs.ownAllocator_), + stack_(rhs.stack_), + stackTop_(rhs.stackTop_), + stackEnd_(rhs.stackEnd_), + initialCapacity_(rhs.initialCapacity_) + { + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.stack_ = 0; + rhs.stackTop_ = 0; + rhs.stackEnd_ = 0; + rhs.initialCapacity_ = 0; + } +#endif + + ~Stack() { + Destroy(); + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + Stack& operator=(Stack&& rhs) { + if (&rhs != this) + { + Destroy(); + + allocator_ = rhs.allocator_; + ownAllocator_ = rhs.ownAllocator_; + stack_ = rhs.stack_; + stackTop_ = rhs.stackTop_; + stackEnd_ = rhs.stackEnd_; + initialCapacity_ = rhs.initialCapacity_; + + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.stack_ = 0; + rhs.stackTop_ = 0; + rhs.stackEnd_ = 0; + rhs.initialCapacity_ = 0; + } + return *this; + } +#endif + + void Swap(Stack& rhs) RAPIDJSON_NOEXCEPT { + internal::Swap(allocator_, rhs.allocator_); + internal::Swap(ownAllocator_, rhs.ownAllocator_); + internal::Swap(stack_, rhs.stack_); + internal::Swap(stackTop_, rhs.stackTop_); + internal::Swap(stackEnd_, rhs.stackEnd_); + internal::Swap(initialCapacity_, rhs.initialCapacity_); + } + + void Clear() { stackTop_ = stack_; } + + void ShrinkToFit() { + if (Empty()) { + // If the stack is empty, completely deallocate the memory. + Allocator::Free(stack_); + stack_ = 0; + stackTop_ = 0; + stackEnd_ = 0; + } + else + Resize(GetSize()); + } + + // Optimization note: try to minimize the size of this function for force inline. + // Expansion is run very infrequently, so it is moved to another (probably non-inline) function. + template + RAPIDJSON_FORCEINLINE void Reserve(size_t count = 1) { + // Expand the stack if needed + if (RAPIDJSON_UNLIKELY(stackTop_ + sizeof(T) * count > stackEnd_)) + Expand(count); + } + + template + RAPIDJSON_FORCEINLINE T* Push(size_t count = 1) { + Reserve(count); + return PushUnsafe(count); + } + + template + RAPIDJSON_FORCEINLINE T* PushUnsafe(size_t count = 1) { + RAPIDJSON_ASSERT(stackTop_ + sizeof(T) * count <= stackEnd_); + T* ret = reinterpret_cast(stackTop_); + stackTop_ += sizeof(T) * count; + return ret; + } + + template + T* Pop(size_t count) { + RAPIDJSON_ASSERT(GetSize() >= count * sizeof(T)); + stackTop_ -= count * sizeof(T); + return reinterpret_cast(stackTop_); + } + + template + T* Top() { + RAPIDJSON_ASSERT(GetSize() >= sizeof(T)); + return reinterpret_cast(stackTop_ - sizeof(T)); + } + + template + const T* Top() const { + RAPIDJSON_ASSERT(GetSize() >= sizeof(T)); + return reinterpret_cast(stackTop_ - sizeof(T)); + } + + template + T* End() { return reinterpret_cast(stackTop_); } + + template + const T* End() const { return reinterpret_cast(stackTop_); } + + template + T* Bottom() { return reinterpret_cast(stack_); } + + template + const T* Bottom() const { return reinterpret_cast(stack_); } + + bool HasAllocator() const { + return allocator_ != 0; + } + + Allocator& GetAllocator() { + RAPIDJSON_ASSERT(allocator_); + return *allocator_; + } + + bool Empty() const { return stackTop_ == stack_; } + size_t GetSize() const { return static_cast(stackTop_ - stack_); } + size_t GetCapacity() const { return static_cast(stackEnd_ - stack_); } + +private: + template + void Expand(size_t count) { + // Only expand the capacity if the current stack exists. Otherwise just create a stack with initial capacity. + size_t newCapacity; + if (stack_ == 0) { + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator()); + newCapacity = initialCapacity_; + } else { + newCapacity = GetCapacity(); + newCapacity += (newCapacity + 1) / 2; + } + size_t newSize = GetSize() + sizeof(T) * count; + if (newCapacity < newSize) + newCapacity = newSize; + + Resize(newCapacity); + } + + void Resize(size_t newCapacity) { + const size_t size = GetSize(); // Backup the current size + stack_ = static_cast(allocator_->Realloc(stack_, GetCapacity(), newCapacity)); + stackTop_ = stack_ + size; + stackEnd_ = stack_ + newCapacity; + } + + void Destroy() { + Allocator::Free(stack_); + RAPIDJSON_DELETE(ownAllocator_); // Only delete if it is owned by the stack + } + + // Prohibit copy constructor & assignment operator. + Stack(const Stack&); + Stack& operator=(const Stack&); + + Allocator* allocator_; + Allocator* ownAllocator_; + char *stack_; + char *stackTop_; + char *stackEnd_; + size_t initialCapacity_; +}; + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_STACK_H_ diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/internal/strfunc.h b/Externals/discord-rpc/thirdparty/include/rapidjson/internal/strfunc.h new file mode 100644 index 0000000000..2edfae5267 --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/internal/strfunc.h @@ -0,0 +1,55 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_INTERNAL_STRFUNC_H_ +#define RAPIDJSON_INTERNAL_STRFUNC_H_ + +#include "../stream.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +//! Custom strlen() which works on different character types. +/*! \tparam Ch Character type (e.g. char, wchar_t, short) + \param s Null-terminated input string. + \return Number of characters in the string. + \note This has the same semantics as strlen(), the return value is not number of Unicode codepoints. +*/ +template +inline SizeType StrLen(const Ch* s) { + const Ch* p = s; + while (*p) ++p; + return SizeType(p - s); +} + +//! Returns number of code points in a encoded string. +template +bool CountStringCodePoint(const typename Encoding::Ch* s, SizeType length, SizeType* outCount) { + GenericStringStream is(s); + const typename Encoding::Ch* end = s + length; + SizeType count = 0; + while (is.src_ < end) { + unsigned codepoint; + if (!Encoding::Decode(is, &codepoint)) + return false; + count++; + } + *outCount = count; + return true; +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_INTERNAL_STRFUNC_H_ diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/internal/strtod.h b/Externals/discord-rpc/thirdparty/include/rapidjson/internal/strtod.h new file mode 100644 index 0000000000..289c413b07 --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/internal/strtod.h @@ -0,0 +1,269 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_STRTOD_ +#define RAPIDJSON_STRTOD_ + +#include "ieee754.h" +#include "biginteger.h" +#include "diyfp.h" +#include "pow10.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +inline double FastPath(double significand, int exp) { + if (exp < -308) + return 0.0; + else if (exp >= 0) + return significand * internal::Pow10(exp); + else + return significand / internal::Pow10(-exp); +} + +inline double StrtodNormalPrecision(double d, int p) { + if (p < -308) { + // Prevent expSum < -308, making Pow10(p) = 0 + d = FastPath(d, -308); + d = FastPath(d, p + 308); + } + else + d = FastPath(d, p); + return d; +} + +template +inline T Min3(T a, T b, T c) { + T m = a; + if (m > b) m = b; + if (m > c) m = c; + return m; +} + +inline int CheckWithinHalfULP(double b, const BigInteger& d, int dExp) { + const Double db(b); + const uint64_t bInt = db.IntegerSignificand(); + const int bExp = db.IntegerExponent(); + const int hExp = bExp - 1; + + int dS_Exp2 = 0, dS_Exp5 = 0, bS_Exp2 = 0, bS_Exp5 = 0, hS_Exp2 = 0, hS_Exp5 = 0; + + // Adjust for decimal exponent + if (dExp >= 0) { + dS_Exp2 += dExp; + dS_Exp5 += dExp; + } + else { + bS_Exp2 -= dExp; + bS_Exp5 -= dExp; + hS_Exp2 -= dExp; + hS_Exp5 -= dExp; + } + + // Adjust for binary exponent + if (bExp >= 0) + bS_Exp2 += bExp; + else { + dS_Exp2 -= bExp; + hS_Exp2 -= bExp; + } + + // Adjust for half ulp exponent + if (hExp >= 0) + hS_Exp2 += hExp; + else { + dS_Exp2 -= hExp; + bS_Exp2 -= hExp; + } + + // Remove common power of two factor from all three scaled values + int common_Exp2 = Min3(dS_Exp2, bS_Exp2, hS_Exp2); + dS_Exp2 -= common_Exp2; + bS_Exp2 -= common_Exp2; + hS_Exp2 -= common_Exp2; + + BigInteger dS = d; + dS.MultiplyPow5(static_cast(dS_Exp5)) <<= static_cast(dS_Exp2); + + BigInteger bS(bInt); + bS.MultiplyPow5(static_cast(bS_Exp5)) <<= static_cast(bS_Exp2); + + BigInteger hS(1); + hS.MultiplyPow5(static_cast(hS_Exp5)) <<= static_cast(hS_Exp2); + + BigInteger delta(0); + dS.Difference(bS, &delta); + + return delta.Compare(hS); +} + +inline bool StrtodFast(double d, int p, double* result) { + // Use fast path for string-to-double conversion if possible + // see http://www.exploringbinary.com/fast-path-decimal-to-floating-point-conversion/ + if (p > 22 && p < 22 + 16) { + // Fast Path Cases In Disguise + d *= internal::Pow10(p - 22); + p = 22; + } + + if (p >= -22 && p <= 22 && d <= 9007199254740991.0) { // 2^53 - 1 + *result = FastPath(d, p); + return true; + } + else + return false; +} + +// Compute an approximation and see if it is within 1/2 ULP +inline bool StrtodDiyFp(const char* decimals, size_t length, size_t decimalPosition, int exp, double* result) { + uint64_t significand = 0; + size_t i = 0; // 2^64 - 1 = 18446744073709551615, 1844674407370955161 = 0x1999999999999999 + for (; i < length; i++) { + if (significand > RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) || + (significand == RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) && decimals[i] > '5')) + break; + significand = significand * 10u + static_cast(decimals[i] - '0'); + } + + if (i < length && decimals[i] >= '5') // Rounding + significand++; + + size_t remaining = length - i; + const unsigned kUlpShift = 3; + const unsigned kUlp = 1 << kUlpShift; + int64_t error = (remaining == 0) ? 0 : kUlp / 2; + + DiyFp v(significand, 0); + v = v.Normalize(); + error <<= -v.e; + + const int dExp = static_cast(decimalPosition) - static_cast(i) + exp; + + int actualExp; + DiyFp cachedPower = GetCachedPower10(dExp, &actualExp); + if (actualExp != dExp) { + static const DiyFp kPow10[] = { + DiyFp(RAPIDJSON_UINT64_C2(0xa0000000, 00000000), -60), // 10^1 + DiyFp(RAPIDJSON_UINT64_C2(0xc8000000, 00000000), -57), // 10^2 + DiyFp(RAPIDJSON_UINT64_C2(0xfa000000, 00000000), -54), // 10^3 + DiyFp(RAPIDJSON_UINT64_C2(0x9c400000, 00000000), -50), // 10^4 + DiyFp(RAPIDJSON_UINT64_C2(0xc3500000, 00000000), -47), // 10^5 + DiyFp(RAPIDJSON_UINT64_C2(0xf4240000, 00000000), -44), // 10^6 + DiyFp(RAPIDJSON_UINT64_C2(0x98968000, 00000000), -40) // 10^7 + }; + int adjustment = dExp - actualExp - 1; + RAPIDJSON_ASSERT(adjustment >= 0 && adjustment < 7); + v = v * kPow10[adjustment]; + if (length + static_cast(adjustment)> 19u) // has more digits than decimal digits in 64-bit + error += kUlp / 2; + } + + v = v * cachedPower; + + error += kUlp + (error == 0 ? 0 : 1); + + const int oldExp = v.e; + v = v.Normalize(); + error <<= oldExp - v.e; + + const unsigned effectiveSignificandSize = Double::EffectiveSignificandSize(64 + v.e); + unsigned precisionSize = 64 - effectiveSignificandSize; + if (precisionSize + kUlpShift >= 64) { + unsigned scaleExp = (precisionSize + kUlpShift) - 63; + v.f >>= scaleExp; + v.e += scaleExp; + error = (error >> scaleExp) + 1 + static_cast(kUlp); + precisionSize -= scaleExp; + } + + DiyFp rounded(v.f >> precisionSize, v.e + static_cast(precisionSize)); + const uint64_t precisionBits = (v.f & ((uint64_t(1) << precisionSize) - 1)) * kUlp; + const uint64_t halfWay = (uint64_t(1) << (precisionSize - 1)) * kUlp; + if (precisionBits >= halfWay + static_cast(error)) { + rounded.f++; + if (rounded.f & (DiyFp::kDpHiddenBit << 1)) { // rounding overflows mantissa (issue #340) + rounded.f >>= 1; + rounded.e++; + } + } + + *result = rounded.ToDouble(); + + return halfWay - static_cast(error) >= precisionBits || precisionBits >= halfWay + static_cast(error); +} + +inline double StrtodBigInteger(double approx, const char* decimals, size_t length, size_t decimalPosition, int exp) { + const BigInteger dInt(decimals, length); + const int dExp = static_cast(decimalPosition) - static_cast(length) + exp; + Double a(approx); + int cmp = CheckWithinHalfULP(a.Value(), dInt, dExp); + if (cmp < 0) + return a.Value(); // within half ULP + else if (cmp == 0) { + // Round towards even + if (a.Significand() & 1) + return a.NextPositiveDouble(); + else + return a.Value(); + } + else // adjustment + return a.NextPositiveDouble(); +} + +inline double StrtodFullPrecision(double d, int p, const char* decimals, size_t length, size_t decimalPosition, int exp) { + RAPIDJSON_ASSERT(d >= 0.0); + RAPIDJSON_ASSERT(length >= 1); + + double result; + if (StrtodFast(d, p, &result)) + return result; + + // Trim leading zeros + while (*decimals == '0' && length > 1) { + length--; + decimals++; + decimalPosition--; + } + + // Trim trailing zeros + while (decimals[length - 1] == '0' && length > 1) { + length--; + decimalPosition--; + exp++; + } + + // Trim right-most digits + const int kMaxDecimalDigit = 780; + if (static_cast(length) > kMaxDecimalDigit) { + int delta = (static_cast(length) - kMaxDecimalDigit); + exp += delta; + decimalPosition -= static_cast(delta); + length = kMaxDecimalDigit; + } + + // If too small, underflow to zero + if (int(length) + exp < -324) + return 0.0; + + if (StrtodDiyFp(decimals, length, decimalPosition, exp, &result)) + return result; + + // Use approximation from StrtodDiyFp and make adjustment with BigInteger comparison + return StrtodBigInteger(result, decimals, length, decimalPosition, exp); +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_STRTOD_ diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/internal/swap.h b/Externals/discord-rpc/thirdparty/include/rapidjson/internal/swap.h new file mode 100644 index 0000000000..666e49f97b --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/internal/swap.h @@ -0,0 +1,46 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_INTERNAL_SWAP_H_ +#define RAPIDJSON_INTERNAL_SWAP_H_ + +#include "../rapidjson.h" + +#if defined(__clang__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(c++98-compat) +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +//! Custom swap() to avoid dependency on C++ header +/*! \tparam T Type of the arguments to swap, should be instantiated with primitive C++ types only. + \note This has the same semantics as std::swap(). +*/ +template +inline void Swap(T& a, T& b) RAPIDJSON_NOEXCEPT { + T tmp = a; + a = b; + b = tmp; +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_INTERNAL_SWAP_H_ diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/istreamwrapper.h b/Externals/discord-rpc/thirdparty/include/rapidjson/istreamwrapper.h new file mode 100644 index 0000000000..f5fe28977e --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/istreamwrapper.h @@ -0,0 +1,115 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_ISTREAMWRAPPER_H_ +#define RAPIDJSON_ISTREAMWRAPPER_H_ + +#include "stream.h" +#include + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4351) // new behavior: elements of array 'array' will be default initialized +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Wrapper of \c std::basic_istream into RapidJSON's Stream concept. +/*! + The classes can be wrapped including but not limited to: + + - \c std::istringstream + - \c std::stringstream + - \c std::wistringstream + - \c std::wstringstream + - \c std::ifstream + - \c std::fstream + - \c std::wifstream + - \c std::wfstream + + \tparam StreamType Class derived from \c std::basic_istream. +*/ + +template +class BasicIStreamWrapper { +public: + typedef typename StreamType::char_type Ch; + BasicIStreamWrapper(StreamType& stream) : stream_(stream), count_(), peekBuffer_() {} + + Ch Peek() const { + typename StreamType::int_type c = stream_.peek(); + return RAPIDJSON_LIKELY(c != StreamType::traits_type::eof()) ? static_cast(c) : '\0'; + } + + Ch Take() { + typename StreamType::int_type c = stream_.get(); + if (RAPIDJSON_LIKELY(c != StreamType::traits_type::eof())) { + count_++; + return static_cast(c); + } + else + return '\0'; + } + + // tellg() may return -1 when failed. So we count by ourself. + size_t Tell() const { return count_; } + + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + + // For encoding detection only. + const Ch* Peek4() const { + RAPIDJSON_ASSERT(sizeof(Ch) == 1); // Only usable for byte stream. + int i; + bool hasError = false; + for (i = 0; i < 4; ++i) { + typename StreamType::int_type c = stream_.get(); + if (c == StreamType::traits_type::eof()) { + hasError = true; + stream_.clear(); + break; + } + peekBuffer_[i] = static_cast(c); + } + for (--i; i >= 0; --i) + stream_.putback(peekBuffer_[i]); + return !hasError ? peekBuffer_ : 0; + } + +private: + BasicIStreamWrapper(const BasicIStreamWrapper&); + BasicIStreamWrapper& operator=(const BasicIStreamWrapper&); + + StreamType& stream_; + size_t count_; //!< Number of characters read. Note: + mutable Ch peekBuffer_[4]; +}; + +typedef BasicIStreamWrapper IStreamWrapper; +typedef BasicIStreamWrapper WIStreamWrapper; + +#if defined(__clang__) || defined(_MSC_VER) +RAPIDJSON_DIAG_POP +#endif + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_ISTREAMWRAPPER_H_ diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/memorybuffer.h b/Externals/discord-rpc/thirdparty/include/rapidjson/memorybuffer.h new file mode 100644 index 0000000000..39bee1dec1 --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/memorybuffer.h @@ -0,0 +1,70 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_MEMORYBUFFER_H_ +#define RAPIDJSON_MEMORYBUFFER_H_ + +#include "stream.h" +#include "internal/stack.h" + +RAPIDJSON_NAMESPACE_BEGIN + +//! Represents an in-memory output byte stream. +/*! + This class is mainly for being wrapped by EncodedOutputStream or AutoUTFOutputStream. + + It is similar to FileWriteBuffer but the destination is an in-memory buffer instead of a file. + + Differences between MemoryBuffer and StringBuffer: + 1. StringBuffer has Encoding but MemoryBuffer is only a byte buffer. + 2. StringBuffer::GetString() returns a null-terminated string. MemoryBuffer::GetBuffer() returns a buffer without terminator. + + \tparam Allocator type for allocating memory buffer. + \note implements Stream concept +*/ +template +struct GenericMemoryBuffer { + typedef char Ch; // byte + + GenericMemoryBuffer(Allocator* allocator = 0, size_t capacity = kDefaultCapacity) : stack_(allocator, capacity) {} + + void Put(Ch c) { *stack_.template Push() = c; } + void Flush() {} + + void Clear() { stack_.Clear(); } + void ShrinkToFit() { stack_.ShrinkToFit(); } + Ch* Push(size_t count) { return stack_.template Push(count); } + void Pop(size_t count) { stack_.template Pop(count); } + + const Ch* GetBuffer() const { + return stack_.template Bottom(); + } + + size_t GetSize() const { return stack_.GetSize(); } + + static const size_t kDefaultCapacity = 256; + mutable internal::Stack stack_; +}; + +typedef GenericMemoryBuffer<> MemoryBuffer; + +//! Implement specialized version of PutN() with memset() for better performance. +template<> +inline void PutN(MemoryBuffer& memoryBuffer, char c, size_t n) { + std::memset(memoryBuffer.stack_.Push(n), c, n * sizeof(c)); +} + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_MEMORYBUFFER_H_ diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/memorystream.h b/Externals/discord-rpc/thirdparty/include/rapidjson/memorystream.h new file mode 100644 index 0000000000..1d71d8a4f0 --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/memorystream.h @@ -0,0 +1,71 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_MEMORYSTREAM_H_ +#define RAPIDJSON_MEMORYSTREAM_H_ + +#include "stream.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(unreachable-code) +RAPIDJSON_DIAG_OFF(missing-noreturn) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Represents an in-memory input byte stream. +/*! + This class is mainly for being wrapped by EncodedInputStream or AutoUTFInputStream. + + It is similar to FileReadBuffer but the source is an in-memory buffer instead of a file. + + Differences between MemoryStream and StringStream: + 1. StringStream has encoding but MemoryStream is a byte stream. + 2. MemoryStream needs size of the source buffer and the buffer don't need to be null terminated. StringStream assume null-terminated string as source. + 3. MemoryStream supports Peek4() for encoding detection. StringStream is specified with an encoding so it should not have Peek4(). + \note implements Stream concept +*/ +struct MemoryStream { + typedef char Ch; // byte + + MemoryStream(const Ch *src, size_t size) : src_(src), begin_(src), end_(src + size), size_(size) {} + + Ch Peek() const { return RAPIDJSON_UNLIKELY(src_ == end_) ? '\0' : *src_; } + Ch Take() { return RAPIDJSON_UNLIKELY(src_ == end_) ? '\0' : *src_++; } + size_t Tell() const { return static_cast(src_ - begin_); } + + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + + // For encoding detection only. + const Ch* Peek4() const { + return Tell() + 4 <= size_ ? src_ : 0; + } + + const Ch* src_; //!< Current read position. + const Ch* begin_; //!< Original head of the string. + const Ch* end_; //!< End of stream. + size_t size_; //!< Size of the stream. +}; + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_MEMORYBUFFER_H_ diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/msinttypes/inttypes.h b/Externals/discord-rpc/thirdparty/include/rapidjson/msinttypes/inttypes.h new file mode 100644 index 0000000000..18111286bf --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/msinttypes/inttypes.h @@ -0,0 +1,316 @@ +// ISO C9x compliant inttypes.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 +// +// Copyright (c) 2006-2013 Alexander Chemeris +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the product nor the names of its contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////////// + +// The above software in this distribution may have been modified by +// THL A29 Limited ("Tencent Modifications"). +// All Tencent Modifications are Copyright (C) 2015 THL A29 Limited. + +#ifndef _MSC_VER // [ +#error "Use this header only with Microsoft Visual C++ compilers!" +#endif // _MSC_VER ] + +#ifndef _MSC_INTTYPES_H_ // [ +#define _MSC_INTTYPES_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +#include "stdint.h" + +// miloyip: VC supports inttypes.h since VC2013 +#if _MSC_VER >= 1800 +#include +#else + +// 7.8 Format conversion of integer types + +typedef struct { + intmax_t quot; + intmax_t rem; +} imaxdiv_t; + +// 7.8.1 Macros for format specifiers + +#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) // [ See footnote 185 at page 198 + +// The fprintf macros for signed integers are: +#define PRId8 "d" +#define PRIi8 "i" +#define PRIdLEAST8 "d" +#define PRIiLEAST8 "i" +#define PRIdFAST8 "d" +#define PRIiFAST8 "i" + +#define PRId16 "hd" +#define PRIi16 "hi" +#define PRIdLEAST16 "hd" +#define PRIiLEAST16 "hi" +#define PRIdFAST16 "hd" +#define PRIiFAST16 "hi" + +#define PRId32 "I32d" +#define PRIi32 "I32i" +#define PRIdLEAST32 "I32d" +#define PRIiLEAST32 "I32i" +#define PRIdFAST32 "I32d" +#define PRIiFAST32 "I32i" + +#define PRId64 "I64d" +#define PRIi64 "I64i" +#define PRIdLEAST64 "I64d" +#define PRIiLEAST64 "I64i" +#define PRIdFAST64 "I64d" +#define PRIiFAST64 "I64i" + +#define PRIdMAX "I64d" +#define PRIiMAX "I64i" + +#define PRIdPTR "Id" +#define PRIiPTR "Ii" + +// The fprintf macros for unsigned integers are: +#define PRIo8 "o" +#define PRIu8 "u" +#define PRIx8 "x" +#define PRIX8 "X" +#define PRIoLEAST8 "o" +#define PRIuLEAST8 "u" +#define PRIxLEAST8 "x" +#define PRIXLEAST8 "X" +#define PRIoFAST8 "o" +#define PRIuFAST8 "u" +#define PRIxFAST8 "x" +#define PRIXFAST8 "X" + +#define PRIo16 "ho" +#define PRIu16 "hu" +#define PRIx16 "hx" +#define PRIX16 "hX" +#define PRIoLEAST16 "ho" +#define PRIuLEAST16 "hu" +#define PRIxLEAST16 "hx" +#define PRIXLEAST16 "hX" +#define PRIoFAST16 "ho" +#define PRIuFAST16 "hu" +#define PRIxFAST16 "hx" +#define PRIXFAST16 "hX" + +#define PRIo32 "I32o" +#define PRIu32 "I32u" +#define PRIx32 "I32x" +#define PRIX32 "I32X" +#define PRIoLEAST32 "I32o" +#define PRIuLEAST32 "I32u" +#define PRIxLEAST32 "I32x" +#define PRIXLEAST32 "I32X" +#define PRIoFAST32 "I32o" +#define PRIuFAST32 "I32u" +#define PRIxFAST32 "I32x" +#define PRIXFAST32 "I32X" + +#define PRIo64 "I64o" +#define PRIu64 "I64u" +#define PRIx64 "I64x" +#define PRIX64 "I64X" +#define PRIoLEAST64 "I64o" +#define PRIuLEAST64 "I64u" +#define PRIxLEAST64 "I64x" +#define PRIXLEAST64 "I64X" +#define PRIoFAST64 "I64o" +#define PRIuFAST64 "I64u" +#define PRIxFAST64 "I64x" +#define PRIXFAST64 "I64X" + +#define PRIoMAX "I64o" +#define PRIuMAX "I64u" +#define PRIxMAX "I64x" +#define PRIXMAX "I64X" + +#define PRIoPTR "Io" +#define PRIuPTR "Iu" +#define PRIxPTR "Ix" +#define PRIXPTR "IX" + +// The fscanf macros for signed integers are: +#define SCNd8 "d" +#define SCNi8 "i" +#define SCNdLEAST8 "d" +#define SCNiLEAST8 "i" +#define SCNdFAST8 "d" +#define SCNiFAST8 "i" + +#define SCNd16 "hd" +#define SCNi16 "hi" +#define SCNdLEAST16 "hd" +#define SCNiLEAST16 "hi" +#define SCNdFAST16 "hd" +#define SCNiFAST16 "hi" + +#define SCNd32 "ld" +#define SCNi32 "li" +#define SCNdLEAST32 "ld" +#define SCNiLEAST32 "li" +#define SCNdFAST32 "ld" +#define SCNiFAST32 "li" + +#define SCNd64 "I64d" +#define SCNi64 "I64i" +#define SCNdLEAST64 "I64d" +#define SCNiLEAST64 "I64i" +#define SCNdFAST64 "I64d" +#define SCNiFAST64 "I64i" + +#define SCNdMAX "I64d" +#define SCNiMAX "I64i" + +#ifdef _WIN64 // [ +# define SCNdPTR "I64d" +# define SCNiPTR "I64i" +#else // _WIN64 ][ +# define SCNdPTR "ld" +# define SCNiPTR "li" +#endif // _WIN64 ] + +// The fscanf macros for unsigned integers are: +#define SCNo8 "o" +#define SCNu8 "u" +#define SCNx8 "x" +#define SCNX8 "X" +#define SCNoLEAST8 "o" +#define SCNuLEAST8 "u" +#define SCNxLEAST8 "x" +#define SCNXLEAST8 "X" +#define SCNoFAST8 "o" +#define SCNuFAST8 "u" +#define SCNxFAST8 "x" +#define SCNXFAST8 "X" + +#define SCNo16 "ho" +#define SCNu16 "hu" +#define SCNx16 "hx" +#define SCNX16 "hX" +#define SCNoLEAST16 "ho" +#define SCNuLEAST16 "hu" +#define SCNxLEAST16 "hx" +#define SCNXLEAST16 "hX" +#define SCNoFAST16 "ho" +#define SCNuFAST16 "hu" +#define SCNxFAST16 "hx" +#define SCNXFAST16 "hX" + +#define SCNo32 "lo" +#define SCNu32 "lu" +#define SCNx32 "lx" +#define SCNX32 "lX" +#define SCNoLEAST32 "lo" +#define SCNuLEAST32 "lu" +#define SCNxLEAST32 "lx" +#define SCNXLEAST32 "lX" +#define SCNoFAST32 "lo" +#define SCNuFAST32 "lu" +#define SCNxFAST32 "lx" +#define SCNXFAST32 "lX" + +#define SCNo64 "I64o" +#define SCNu64 "I64u" +#define SCNx64 "I64x" +#define SCNX64 "I64X" +#define SCNoLEAST64 "I64o" +#define SCNuLEAST64 "I64u" +#define SCNxLEAST64 "I64x" +#define SCNXLEAST64 "I64X" +#define SCNoFAST64 "I64o" +#define SCNuFAST64 "I64u" +#define SCNxFAST64 "I64x" +#define SCNXFAST64 "I64X" + +#define SCNoMAX "I64o" +#define SCNuMAX "I64u" +#define SCNxMAX "I64x" +#define SCNXMAX "I64X" + +#ifdef _WIN64 // [ +# define SCNoPTR "I64o" +# define SCNuPTR "I64u" +# define SCNxPTR "I64x" +# define SCNXPTR "I64X" +#else // _WIN64 ][ +# define SCNoPTR "lo" +# define SCNuPTR "lu" +# define SCNxPTR "lx" +# define SCNXPTR "lX" +#endif // _WIN64 ] + +#endif // __STDC_FORMAT_MACROS ] + +// 7.8.2 Functions for greatest-width integer types + +// 7.8.2.1 The imaxabs function +#define imaxabs _abs64 + +// 7.8.2.2 The imaxdiv function + +// This is modified version of div() function from Microsoft's div.c found +// in %MSVC.NET%\crt\src\div.c +#ifdef STATIC_IMAXDIV // [ +static +#else // STATIC_IMAXDIV ][ +_inline +#endif // STATIC_IMAXDIV ] +imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom) +{ + imaxdiv_t result; + + result.quot = numer / denom; + result.rem = numer % denom; + + if (numer < 0 && result.rem > 0) { + // did division wrong; must fix up + ++result.quot; + result.rem -= denom; + } + + return result; +} + +// 7.8.2.3 The strtoimax and strtoumax functions +#define strtoimax _strtoi64 +#define strtoumax _strtoui64 + +// 7.8.2.4 The wcstoimax and wcstoumax functions +#define wcstoimax _wcstoi64 +#define wcstoumax _wcstoui64 + +#endif // _MSC_VER >= 1800 + +#endif // _MSC_INTTYPES_H_ ] diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/msinttypes/stdint.h b/Externals/discord-rpc/thirdparty/include/rapidjson/msinttypes/stdint.h new file mode 100644 index 0000000000..3d4477b9a0 --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/msinttypes/stdint.h @@ -0,0 +1,300 @@ +// ISO C9x compliant stdint.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 +// +// Copyright (c) 2006-2013 Alexander Chemeris +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the product nor the names of its contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////////// + +// The above software in this distribution may have been modified by +// THL A29 Limited ("Tencent Modifications"). +// All Tencent Modifications are Copyright (C) 2015 THL A29 Limited. + +#ifndef _MSC_VER // [ +#error "Use this header only with Microsoft Visual C++ compilers!" +#endif // _MSC_VER ] + +#ifndef _MSC_STDINT_H_ // [ +#define _MSC_STDINT_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +// miloyip: Originally Visual Studio 2010 uses its own stdint.h. However it generates warning with INT64_C(), so change to use this file for vs2010. +#if _MSC_VER >= 1600 // [ +#include + +#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 + +#undef INT8_C +#undef INT16_C +#undef INT32_C +#undef INT64_C +#undef UINT8_C +#undef UINT16_C +#undef UINT32_C +#undef UINT64_C + +// 7.18.4.1 Macros for minimum-width integer constants + +#define INT8_C(val) val##i8 +#define INT16_C(val) val##i16 +#define INT32_C(val) val##i32 +#define INT64_C(val) val##i64 + +#define UINT8_C(val) val##ui8 +#define UINT16_C(val) val##ui16 +#define UINT32_C(val) val##ui32 +#define UINT64_C(val) val##ui64 + +// 7.18.4.2 Macros for greatest-width integer constants +// These #ifndef's are needed to prevent collisions with . +// Check out Issue 9 for the details. +#ifndef INTMAX_C // [ +# define INTMAX_C INT64_C +#endif // INTMAX_C ] +#ifndef UINTMAX_C // [ +# define UINTMAX_C UINT64_C +#endif // UINTMAX_C ] + +#endif // __STDC_CONSTANT_MACROS ] + +#else // ] _MSC_VER >= 1700 [ + +#include + +// For Visual Studio 6 in C++ mode and for many Visual Studio versions when +// compiling for ARM we have to wrap include with 'extern "C++" {}' +// or compiler would give many errors like this: +// error C2733: second C linkage of overloaded function 'wmemchr' not allowed +#if defined(__cplusplus) && !defined(_M_ARM) +extern "C" { +#endif +# include +#if defined(__cplusplus) && !defined(_M_ARM) +} +#endif + +// Define _W64 macros to mark types changing their size, like intptr_t. +#ifndef _W64 +# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 +# define _W64 __w64 +# else +# define _W64 +# endif +#endif + + +// 7.18.1 Integer types + +// 7.18.1.1 Exact-width integer types + +// Visual Studio 6 and Embedded Visual C++ 4 doesn't +// realize that, e.g. char has the same size as __int8 +// so we give up on __intX for them. +#if (_MSC_VER < 1300) + typedef signed char int8_t; + typedef signed short int16_t; + typedef signed int int32_t; + typedef unsigned char uint8_t; + typedef unsigned short uint16_t; + typedef unsigned int uint32_t; +#else + typedef signed __int8 int8_t; + typedef signed __int16 int16_t; + typedef signed __int32 int32_t; + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; +#endif +typedef signed __int64 int64_t; +typedef unsigned __int64 uint64_t; + + +// 7.18.1.2 Minimum-width integer types +typedef int8_t int_least8_t; +typedef int16_t int_least16_t; +typedef int32_t int_least32_t; +typedef int64_t int_least64_t; +typedef uint8_t uint_least8_t; +typedef uint16_t uint_least16_t; +typedef uint32_t uint_least32_t; +typedef uint64_t uint_least64_t; + +// 7.18.1.3 Fastest minimum-width integer types +typedef int8_t int_fast8_t; +typedef int16_t int_fast16_t; +typedef int32_t int_fast32_t; +typedef int64_t int_fast64_t; +typedef uint8_t uint_fast8_t; +typedef uint16_t uint_fast16_t; +typedef uint32_t uint_fast32_t; +typedef uint64_t uint_fast64_t; + +// 7.18.1.4 Integer types capable of holding object pointers +#ifdef _WIN64 // [ + typedef signed __int64 intptr_t; + typedef unsigned __int64 uintptr_t; +#else // _WIN64 ][ + typedef _W64 signed int intptr_t; + typedef _W64 unsigned int uintptr_t; +#endif // _WIN64 ] + +// 7.18.1.5 Greatest-width integer types +typedef int64_t intmax_t; +typedef uint64_t uintmax_t; + + +// 7.18.2 Limits of specified-width integer types + +#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 + +// 7.18.2.1 Limits of exact-width integer types +#define INT8_MIN ((int8_t)_I8_MIN) +#define INT8_MAX _I8_MAX +#define INT16_MIN ((int16_t)_I16_MIN) +#define INT16_MAX _I16_MAX +#define INT32_MIN ((int32_t)_I32_MIN) +#define INT32_MAX _I32_MAX +#define INT64_MIN ((int64_t)_I64_MIN) +#define INT64_MAX _I64_MAX +#define UINT8_MAX _UI8_MAX +#define UINT16_MAX _UI16_MAX +#define UINT32_MAX _UI32_MAX +#define UINT64_MAX _UI64_MAX + +// 7.18.2.2 Limits of minimum-width integer types +#define INT_LEAST8_MIN INT8_MIN +#define INT_LEAST8_MAX INT8_MAX +#define INT_LEAST16_MIN INT16_MIN +#define INT_LEAST16_MAX INT16_MAX +#define INT_LEAST32_MIN INT32_MIN +#define INT_LEAST32_MAX INT32_MAX +#define INT_LEAST64_MIN INT64_MIN +#define INT_LEAST64_MAX INT64_MAX +#define UINT_LEAST8_MAX UINT8_MAX +#define UINT_LEAST16_MAX UINT16_MAX +#define UINT_LEAST32_MAX UINT32_MAX +#define UINT_LEAST64_MAX UINT64_MAX + +// 7.18.2.3 Limits of fastest minimum-width integer types +#define INT_FAST8_MIN INT8_MIN +#define INT_FAST8_MAX INT8_MAX +#define INT_FAST16_MIN INT16_MIN +#define INT_FAST16_MAX INT16_MAX +#define INT_FAST32_MIN INT32_MIN +#define INT_FAST32_MAX INT32_MAX +#define INT_FAST64_MIN INT64_MIN +#define INT_FAST64_MAX INT64_MAX +#define UINT_FAST8_MAX UINT8_MAX +#define UINT_FAST16_MAX UINT16_MAX +#define UINT_FAST32_MAX UINT32_MAX +#define UINT_FAST64_MAX UINT64_MAX + +// 7.18.2.4 Limits of integer types capable of holding object pointers +#ifdef _WIN64 // [ +# define INTPTR_MIN INT64_MIN +# define INTPTR_MAX INT64_MAX +# define UINTPTR_MAX UINT64_MAX +#else // _WIN64 ][ +# define INTPTR_MIN INT32_MIN +# define INTPTR_MAX INT32_MAX +# define UINTPTR_MAX UINT32_MAX +#endif // _WIN64 ] + +// 7.18.2.5 Limits of greatest-width integer types +#define INTMAX_MIN INT64_MIN +#define INTMAX_MAX INT64_MAX +#define UINTMAX_MAX UINT64_MAX + +// 7.18.3 Limits of other integer types + +#ifdef _WIN64 // [ +# define PTRDIFF_MIN _I64_MIN +# define PTRDIFF_MAX _I64_MAX +#else // _WIN64 ][ +# define PTRDIFF_MIN _I32_MIN +# define PTRDIFF_MAX _I32_MAX +#endif // _WIN64 ] + +#define SIG_ATOMIC_MIN INT_MIN +#define SIG_ATOMIC_MAX INT_MAX + +#ifndef SIZE_MAX // [ +# ifdef _WIN64 // [ +# define SIZE_MAX _UI64_MAX +# else // _WIN64 ][ +# define SIZE_MAX _UI32_MAX +# endif // _WIN64 ] +#endif // SIZE_MAX ] + +// WCHAR_MIN and WCHAR_MAX are also defined in +#ifndef WCHAR_MIN // [ +# define WCHAR_MIN 0 +#endif // WCHAR_MIN ] +#ifndef WCHAR_MAX // [ +# define WCHAR_MAX _UI16_MAX +#endif // WCHAR_MAX ] + +#define WINT_MIN 0 +#define WINT_MAX _UI16_MAX + +#endif // __STDC_LIMIT_MACROS ] + + +// 7.18.4 Limits of other integer types + +#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 + +// 7.18.4.1 Macros for minimum-width integer constants + +#define INT8_C(val) val##i8 +#define INT16_C(val) val##i16 +#define INT32_C(val) val##i32 +#define INT64_C(val) val##i64 + +#define UINT8_C(val) val##ui8 +#define UINT16_C(val) val##ui16 +#define UINT32_C(val) val##ui32 +#define UINT64_C(val) val##ui64 + +// 7.18.4.2 Macros for greatest-width integer constants +// These #ifndef's are needed to prevent collisions with . +// Check out Issue 9 for the details. +#ifndef INTMAX_C // [ +# define INTMAX_C INT64_C +#endif // INTMAX_C ] +#ifndef UINTMAX_C // [ +# define UINTMAX_C UINT64_C +#endif // UINTMAX_C ] + +#endif // __STDC_CONSTANT_MACROS ] + +#endif // _MSC_VER >= 1600 ] + +#endif // _MSC_STDINT_H_ ] diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/ostreamwrapper.h b/Externals/discord-rpc/thirdparty/include/rapidjson/ostreamwrapper.h new file mode 100644 index 0000000000..6f4667c08a --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/ostreamwrapper.h @@ -0,0 +1,81 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_OSTREAMWRAPPER_H_ +#define RAPIDJSON_OSTREAMWRAPPER_H_ + +#include "stream.h" +#include + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Wrapper of \c std::basic_ostream into RapidJSON's Stream concept. +/*! + The classes can be wrapped including but not limited to: + + - \c std::ostringstream + - \c std::stringstream + - \c std::wpstringstream + - \c std::wstringstream + - \c std::ifstream + - \c std::fstream + - \c std::wofstream + - \c std::wfstream + + \tparam StreamType Class derived from \c std::basic_ostream. +*/ + +template +class BasicOStreamWrapper { +public: + typedef typename StreamType::char_type Ch; + BasicOStreamWrapper(StreamType& stream) : stream_(stream) {} + + void Put(Ch c) { + stream_.put(c); + } + + void Flush() { + stream_.flush(); + } + + // Not implemented + char Peek() const { RAPIDJSON_ASSERT(false); return 0; } + char Take() { RAPIDJSON_ASSERT(false); return 0; } + size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } + char* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(char*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + BasicOStreamWrapper(const BasicOStreamWrapper&); + BasicOStreamWrapper& operator=(const BasicOStreamWrapper&); + + StreamType& stream_; +}; + +typedef BasicOStreamWrapper OStreamWrapper; +typedef BasicOStreamWrapper WOStreamWrapper; + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_OSTREAMWRAPPER_H_ diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/pointer.h b/Externals/discord-rpc/thirdparty/include/rapidjson/pointer.h new file mode 100644 index 0000000000..0206ac1c8b --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/pointer.h @@ -0,0 +1,1358 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_POINTER_H_ +#define RAPIDJSON_POINTER_H_ + +#include "document.h" +#include "internal/itoa.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(switch-enum) +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +static const SizeType kPointerInvalidIndex = ~SizeType(0); //!< Represents an invalid index in GenericPointer::Token + +//! Error code of parsing. +/*! \ingroup RAPIDJSON_ERRORS + \see GenericPointer::GenericPointer, GenericPointer::GetParseErrorCode +*/ +enum PointerParseErrorCode { + kPointerParseErrorNone = 0, //!< The parse is successful + + kPointerParseErrorTokenMustBeginWithSolidus, //!< A token must begin with a '/' + kPointerParseErrorInvalidEscape, //!< Invalid escape + kPointerParseErrorInvalidPercentEncoding, //!< Invalid percent encoding in URI fragment + kPointerParseErrorCharacterMustPercentEncode //!< A character must percent encoded in URI fragment +}; + +/////////////////////////////////////////////////////////////////////////////// +// GenericPointer + +//! Represents a JSON Pointer. Use Pointer for UTF8 encoding and default allocator. +/*! + This class implements RFC 6901 "JavaScript Object Notation (JSON) Pointer" + (https://tools.ietf.org/html/rfc6901). + + A JSON pointer is for identifying a specific value in a JSON document + (GenericDocument). It can simplify coding of DOM tree manipulation, because it + can access multiple-level depth of DOM tree with single API call. + + After it parses a string representation (e.g. "/foo/0" or URI fragment + representation (e.g. "#/foo/0") into its internal representation (tokens), + it can be used to resolve a specific value in multiple documents, or sub-tree + of documents. + + Contrary to GenericValue, Pointer can be copy constructed and copy assigned. + Apart from assignment, a Pointer cannot be modified after construction. + + Although Pointer is very convenient, please aware that constructing Pointer + involves parsing and dynamic memory allocation. A special constructor with user- + supplied tokens eliminates these. + + GenericPointer depends on GenericDocument and GenericValue. + + \tparam ValueType The value type of the DOM tree. E.g. GenericValue > + \tparam Allocator The allocator type for allocating memory for internal representation. + + \note GenericPointer uses same encoding of ValueType. + However, Allocator of GenericPointer is independent of Allocator of Value. +*/ +template +class GenericPointer { +public: + typedef typename ValueType::EncodingType EncodingType; //!< Encoding type from Value + typedef typename ValueType::Ch Ch; //!< Character type from Value + + //! A token is the basic units of internal representation. + /*! + A JSON pointer string representation "/foo/123" is parsed to two tokens: + "foo" and 123. 123 will be represented in both numeric form and string form. + They are resolved according to the actual value type (object or array). + + For token that are not numbers, or the numeric value is out of bound + (greater than limits of SizeType), they are only treated as string form + (i.e. the token's index will be equal to kPointerInvalidIndex). + + This struct is public so that user can create a Pointer without parsing and + allocation, using a special constructor. + */ + struct Token { + const Ch* name; //!< Name of the token. It has null character at the end but it can contain null character. + SizeType length; //!< Length of the name. + SizeType index; //!< A valid array index, if it is not equal to kPointerInvalidIndex. + }; + + //!@name Constructors and destructor. + //@{ + + //! Default constructor. + GenericPointer(Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) {} + + //! Constructor that parses a string or URI fragment representation. + /*! + \param source A null-terminated, string or URI fragment representation of JSON pointer. + \param allocator User supplied allocator for this pointer. If no allocator is provided, it creates a self-owned one. + */ + explicit GenericPointer(const Ch* source, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + Parse(source, internal::StrLen(source)); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Constructor that parses a string or URI fragment representation. + /*! + \param source A string or URI fragment representation of JSON pointer. + \param allocator User supplied allocator for this pointer. If no allocator is provided, it creates a self-owned one. + \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. + */ + explicit GenericPointer(const std::basic_string& source, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + Parse(source.c_str(), source.size()); + } +#endif + + //! Constructor that parses a string or URI fragment representation, with length of the source string. + /*! + \param source A string or URI fragment representation of JSON pointer. + \param length Length of source. + \param allocator User supplied allocator for this pointer. If no allocator is provided, it creates a self-owned one. + \note Slightly faster than the overload without length. + */ + GenericPointer(const Ch* source, size_t length, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + Parse(source, length); + } + + //! Constructor with user-supplied tokens. + /*! + This constructor let user supplies const array of tokens. + This prevents the parsing process and eliminates allocation. + This is preferred for memory constrained environments. + + \param tokens An constant array of tokens representing the JSON pointer. + \param tokenCount Number of tokens. + + \b Example + \code + #define NAME(s) { s, sizeof(s) / sizeof(s[0]) - 1, kPointerInvalidIndex } + #define INDEX(i) { #i, sizeof(#i) - 1, i } + + static const Pointer::Token kTokens[] = { NAME("foo"), INDEX(123) }; + static const Pointer p(kTokens, sizeof(kTokens) / sizeof(kTokens[0])); + // Equivalent to static const Pointer p("/foo/123"); + + #undef NAME + #undef INDEX + \endcode + */ + GenericPointer(const Token* tokens, size_t tokenCount) : allocator_(), ownAllocator_(), nameBuffer_(), tokens_(const_cast(tokens)), tokenCount_(tokenCount), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) {} + + //! Copy constructor. + GenericPointer(const GenericPointer& rhs, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + *this = rhs; + } + + //! Destructor. + ~GenericPointer() { + if (nameBuffer_) // If user-supplied tokens constructor is used, nameBuffer_ is nullptr and tokens_ are not deallocated. + Allocator::Free(tokens_); + RAPIDJSON_DELETE(ownAllocator_); + } + + //! Assignment operator. + GenericPointer& operator=(const GenericPointer& rhs) { + if (this != &rhs) { + // Do not delete ownAllcator + if (nameBuffer_) + Allocator::Free(tokens_); + + tokenCount_ = rhs.tokenCount_; + parseErrorOffset_ = rhs.parseErrorOffset_; + parseErrorCode_ = rhs.parseErrorCode_; + + if (rhs.nameBuffer_) + CopyFromRaw(rhs); // Normally parsed tokens. + else { + tokens_ = rhs.tokens_; // User supplied const tokens. + nameBuffer_ = 0; + } + } + return *this; + } + + //@} + + //!@name Append token + //@{ + + //! Append a token and return a new Pointer + /*! + \param token Token to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(const Token& token, Allocator* allocator = 0) const { + GenericPointer r; + r.allocator_ = allocator; + Ch *p = r.CopyFromRaw(*this, 1, token.length + 1); + std::memcpy(p, token.name, (token.length + 1) * sizeof(Ch)); + r.tokens_[tokenCount_].name = p; + r.tokens_[tokenCount_].length = token.length; + r.tokens_[tokenCount_].index = token.index; + return r; + } + + //! Append a name token with length, and return a new Pointer + /*! + \param name Name to be appended. + \param length Length of name. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(const Ch* name, SizeType length, Allocator* allocator = 0) const { + Token token = { name, length, kPointerInvalidIndex }; + return Append(token, allocator); + } + + //! Append a name token without length, and return a new Pointer + /*! + \param name Name (const Ch*) to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr::Type, Ch> >), (GenericPointer)) + Append(T* name, Allocator* allocator = 0) const { + return Append(name, StrLen(name), allocator); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Append a name token, and return a new Pointer + /*! + \param name Name to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(const std::basic_string& name, Allocator* allocator = 0) const { + return Append(name.c_str(), static_cast(name.size()), allocator); + } +#endif + + //! Append a index token, and return a new Pointer + /*! + \param index Index to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(SizeType index, Allocator* allocator = 0) const { + char buffer[21]; + char* end = sizeof(SizeType) == 4 ? internal::u32toa(index, buffer) : internal::u64toa(index, buffer); + SizeType length = static_cast(end - buffer); + buffer[length] = '\0'; + + if (sizeof(Ch) == 1) { + Token token = { reinterpret_cast(buffer), length, index }; + return Append(token, allocator); + } + else { + Ch name[21]; + for (size_t i = 0; i <= length; i++) + name[i] = buffer[i]; + Token token = { name, length, index }; + return Append(token, allocator); + } + } + + //! Append a token by value, and return a new Pointer + /*! + \param token token to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(const ValueType& token, Allocator* allocator = 0) const { + if (token.IsString()) + return Append(token.GetString(), token.GetStringLength(), allocator); + else { + RAPIDJSON_ASSERT(token.IsUint64()); + RAPIDJSON_ASSERT(token.GetUint64() <= SizeType(~0)); + return Append(static_cast(token.GetUint64()), allocator); + } + } + + //!@name Handling Parse Error + //@{ + + //! Check whether this is a valid pointer. + bool IsValid() const { return parseErrorCode_ == kPointerParseErrorNone; } + + //! Get the parsing error offset in code unit. + size_t GetParseErrorOffset() const { return parseErrorOffset_; } + + //! Get the parsing error code. + PointerParseErrorCode GetParseErrorCode() const { return parseErrorCode_; } + + //@} + + //! Get the allocator of this pointer. + Allocator& GetAllocator() { return *allocator_; } + + //!@name Tokens + //@{ + + //! Get the token array (const version only). + const Token* GetTokens() const { return tokens_; } + + //! Get the number of tokens. + size_t GetTokenCount() const { return tokenCount_; } + + //@} + + //!@name Equality/inequality operators + //@{ + + //! Equality operator. + /*! + \note When any pointers are invalid, always returns false. + */ + bool operator==(const GenericPointer& rhs) const { + if (!IsValid() || !rhs.IsValid() || tokenCount_ != rhs.tokenCount_) + return false; + + for (size_t i = 0; i < tokenCount_; i++) { + if (tokens_[i].index != rhs.tokens_[i].index || + tokens_[i].length != rhs.tokens_[i].length || + (tokens_[i].length != 0 && std::memcmp(tokens_[i].name, rhs.tokens_[i].name, sizeof(Ch)* tokens_[i].length) != 0)) + { + return false; + } + } + + return true; + } + + //! Inequality operator. + /*! + \note When any pointers are invalid, always returns true. + */ + bool operator!=(const GenericPointer& rhs) const { return !(*this == rhs); } + + //@} + + //!@name Stringify + //@{ + + //! Stringify the pointer into string representation. + /*! + \tparam OutputStream Type of output stream. + \param os The output stream. + */ + template + bool Stringify(OutputStream& os) const { + return Stringify(os); + } + + //! Stringify the pointer into URI fragment representation. + /*! + \tparam OutputStream Type of output stream. + \param os The output stream. + */ + template + bool StringifyUriFragment(OutputStream& os) const { + return Stringify(os); + } + + //@} + + //!@name Create value + //@{ + + //! Create a value in a subtree. + /*! + If the value is not exist, it creates all parent values and a JSON Null value. + So it always succeed and return the newly created or existing value. + + Remind that it may change types of parents according to tokens, so it + potentially removes previously stored values. For example, if a document + was an array, and "/foo" is used to create a value, then the document + will be changed to an object, and all existing array elements are lost. + + \param root Root value of a DOM subtree to be resolved. It can be any value other than document root. + \param allocator Allocator for creating the values if the specified value or its parents are not exist. + \param alreadyExist If non-null, it stores whether the resolved value is already exist. + \return The resolved newly created (a JSON Null value), or already exists value. + */ + ValueType& Create(ValueType& root, typename ValueType::AllocatorType& allocator, bool* alreadyExist = 0) const { + RAPIDJSON_ASSERT(IsValid()); + ValueType* v = &root; + bool exist = true; + for (const Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { + if (v->IsArray() && t->name[0] == '-' && t->length == 1) { + v->PushBack(ValueType().Move(), allocator); + v = &((*v)[v->Size() - 1]); + exist = false; + } + else { + if (t->index == kPointerInvalidIndex) { // must be object name + if (!v->IsObject()) + v->SetObject(); // Change to Object + } + else { // object name or array index + if (!v->IsArray() && !v->IsObject()) + v->SetArray(); // Change to Array + } + + if (v->IsArray()) { + if (t->index >= v->Size()) { + v->Reserve(t->index + 1, allocator); + while (t->index >= v->Size()) + v->PushBack(ValueType().Move(), allocator); + exist = false; + } + v = &((*v)[t->index]); + } + else { + typename ValueType::MemberIterator m = v->FindMember(GenericStringRef(t->name, t->length)); + if (m == v->MemberEnd()) { + v->AddMember(ValueType(t->name, t->length, allocator).Move(), ValueType().Move(), allocator); + v = &(--v->MemberEnd())->value; // Assumes AddMember() appends at the end + exist = false; + } + else + v = &m->value; + } + } + } + + if (alreadyExist) + *alreadyExist = exist; + + return *v; + } + + //! Creates a value in a document. + /*! + \param document A document to be resolved. + \param alreadyExist If non-null, it stores whether the resolved value is already exist. + \return The resolved newly created, or already exists value. + */ + template + ValueType& Create(GenericDocument& document, bool* alreadyExist = 0) const { + return Create(document, document.GetAllocator(), alreadyExist); + } + + //@} + + //!@name Query value + //@{ + + //! Query a value in a subtree. + /*! + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \param unresolvedTokenIndex If the pointer cannot resolve a token in the pointer, this parameter can obtain the index of unresolved token. + \return Pointer to the value if it can be resolved. Otherwise null. + + \note + There are only 3 situations when a value cannot be resolved: + 1. A value in the path is not an array nor object. + 2. An object value does not contain the token. + 3. A token is out of range of an array value. + + Use unresolvedTokenIndex to retrieve the token index. + */ + ValueType* Get(ValueType& root, size_t* unresolvedTokenIndex = 0) const { + RAPIDJSON_ASSERT(IsValid()); + ValueType* v = &root; + for (const Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { + switch (v->GetType()) { + case kObjectType: + { + typename ValueType::MemberIterator m = v->FindMember(GenericStringRef(t->name, t->length)); + if (m == v->MemberEnd()) + break; + v = &m->value; + } + continue; + case kArrayType: + if (t->index == kPointerInvalidIndex || t->index >= v->Size()) + break; + v = &((*v)[t->index]); + continue; + default: + break; + } + + // Error: unresolved token + if (unresolvedTokenIndex) + *unresolvedTokenIndex = static_cast(t - tokens_); + return 0; + } + return v; + } + + //! Query a const value in a const subtree. + /*! + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \return Pointer to the value if it can be resolved. Otherwise null. + */ + const ValueType* Get(const ValueType& root, size_t* unresolvedTokenIndex = 0) const { + return Get(const_cast(root), unresolvedTokenIndex); + } + + //@} + + //!@name Query a value with default + //@{ + + //! Query a value in a subtree with default value. + /*! + Similar to Get(), but if the specified value do not exists, it creates all parents and clone the default value. + So that this function always succeed. + + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \param defaultValue Default value to be cloned if the value was not exists. + \param allocator Allocator for creating the values if the specified value or its parents are not exist. + \see Create() + */ + ValueType& GetWithDefault(ValueType& root, const ValueType& defaultValue, typename ValueType::AllocatorType& allocator) const { + bool alreadyExist; + Value& v = Create(root, allocator, &alreadyExist); + return alreadyExist ? v : v.CopyFrom(defaultValue, allocator); + } + + //! Query a value in a subtree with default null-terminated string. + ValueType& GetWithDefault(ValueType& root, const Ch* defaultValue, typename ValueType::AllocatorType& allocator) const { + bool alreadyExist; + Value& v = Create(root, allocator, &alreadyExist); + return alreadyExist ? v : v.SetString(defaultValue, allocator); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Query a value in a subtree with default std::basic_string. + ValueType& GetWithDefault(ValueType& root, const std::basic_string& defaultValue, typename ValueType::AllocatorType& allocator) const { + bool alreadyExist; + Value& v = Create(root, allocator, &alreadyExist); + return alreadyExist ? v : v.SetString(defaultValue, allocator); + } +#endif + + //! Query a value in a subtree with default primitive value. + /*! + \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) + GetWithDefault(ValueType& root, T defaultValue, typename ValueType::AllocatorType& allocator) const { + return GetWithDefault(root, ValueType(defaultValue).Move(), allocator); + } + + //! Query a value in a document with default value. + template + ValueType& GetWithDefault(GenericDocument& document, const ValueType& defaultValue) const { + return GetWithDefault(document, defaultValue, document.GetAllocator()); + } + + //! Query a value in a document with default null-terminated string. + template + ValueType& GetWithDefault(GenericDocument& document, const Ch* defaultValue) const { + return GetWithDefault(document, defaultValue, document.GetAllocator()); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Query a value in a document with default std::basic_string. + template + ValueType& GetWithDefault(GenericDocument& document, const std::basic_string& defaultValue) const { + return GetWithDefault(document, defaultValue, document.GetAllocator()); + } +#endif + + //! Query a value in a document with default primitive value. + /*! + \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) + GetWithDefault(GenericDocument& document, T defaultValue) const { + return GetWithDefault(document, defaultValue, document.GetAllocator()); + } + + //@} + + //!@name Set a value + //@{ + + //! Set a value in a subtree, with move semantics. + /*! + It creates all parents if they are not exist or types are different to the tokens. + So this function always succeeds but potentially remove existing values. + + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \param value Value to be set. + \param allocator Allocator for creating the values if the specified value or its parents are not exist. + \see Create() + */ + ValueType& Set(ValueType& root, ValueType& value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator) = value; + } + + //! Set a value in a subtree, with copy semantics. + ValueType& Set(ValueType& root, const ValueType& value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator).CopyFrom(value, allocator); + } + + //! Set a null-terminated string in a subtree. + ValueType& Set(ValueType& root, const Ch* value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator) = ValueType(value, allocator).Move(); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Set a std::basic_string in a subtree. + ValueType& Set(ValueType& root, const std::basic_string& value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator) = ValueType(value, allocator).Move(); + } +#endif + + //! Set a primitive value in a subtree. + /*! + \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) + Set(ValueType& root, T value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator) = ValueType(value).Move(); + } + + //! Set a value in a document, with move semantics. + template + ValueType& Set(GenericDocument& document, ValueType& value) const { + return Create(document) = value; + } + + //! Set a value in a document, with copy semantics. + template + ValueType& Set(GenericDocument& document, const ValueType& value) const { + return Create(document).CopyFrom(value, document.GetAllocator()); + } + + //! Set a null-terminated string in a document. + template + ValueType& Set(GenericDocument& document, const Ch* value) const { + return Create(document) = ValueType(value, document.GetAllocator()).Move(); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Sets a std::basic_string in a document. + template + ValueType& Set(GenericDocument& document, const std::basic_string& value) const { + return Create(document) = ValueType(value, document.GetAllocator()).Move(); + } +#endif + + //! Set a primitive value in a document. + /*! + \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) + Set(GenericDocument& document, T value) const { + return Create(document) = value; + } + + //@} + + //!@name Swap a value + //@{ + + //! Swap a value with a value in a subtree. + /*! + It creates all parents if they are not exist or types are different to the tokens. + So this function always succeeds but potentially remove existing values. + + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \param value Value to be swapped. + \param allocator Allocator for creating the values if the specified value or its parents are not exist. + \see Create() + */ + ValueType& Swap(ValueType& root, ValueType& value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator).Swap(value); + } + + //! Swap a value with a value in a document. + template + ValueType& Swap(GenericDocument& document, ValueType& value) const { + return Create(document).Swap(value); + } + + //@} + + //! Erase a value in a subtree. + /*! + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \return Whether the resolved value is found and erased. + + \note Erasing with an empty pointer \c Pointer(""), i.e. the root, always fail and return false. + */ + bool Erase(ValueType& root) const { + RAPIDJSON_ASSERT(IsValid()); + if (tokenCount_ == 0) // Cannot erase the root + return false; + + ValueType* v = &root; + const Token* last = tokens_ + (tokenCount_ - 1); + for (const Token *t = tokens_; t != last; ++t) { + switch (v->GetType()) { + case kObjectType: + { + typename ValueType::MemberIterator m = v->FindMember(GenericStringRef(t->name, t->length)); + if (m == v->MemberEnd()) + return false; + v = &m->value; + } + break; + case kArrayType: + if (t->index == kPointerInvalidIndex || t->index >= v->Size()) + return false; + v = &((*v)[t->index]); + break; + default: + return false; + } + } + + switch (v->GetType()) { + case kObjectType: + return v->EraseMember(GenericStringRef(last->name, last->length)); + case kArrayType: + if (last->index == kPointerInvalidIndex || last->index >= v->Size()) + return false; + v->Erase(v->Begin() + last->index); + return true; + default: + return false; + } + } + +private: + //! Clone the content from rhs to this. + /*! + \param rhs Source pointer. + \param extraToken Extra tokens to be allocated. + \param extraNameBufferSize Extra name buffer size (in number of Ch) to be allocated. + \return Start of non-occupied name buffer, for storing extra names. + */ + Ch* CopyFromRaw(const GenericPointer& rhs, size_t extraToken = 0, size_t extraNameBufferSize = 0) { + if (!allocator_) // allocator is independently owned. + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator()); + + size_t nameBufferSize = rhs.tokenCount_; // null terminators for tokens + for (Token *t = rhs.tokens_; t != rhs.tokens_ + rhs.tokenCount_; ++t) + nameBufferSize += t->length; + + tokenCount_ = rhs.tokenCount_ + extraToken; + tokens_ = static_cast(allocator_->Malloc(tokenCount_ * sizeof(Token) + (nameBufferSize + extraNameBufferSize) * sizeof(Ch))); + nameBuffer_ = reinterpret_cast(tokens_ + tokenCount_); + if (rhs.tokenCount_ > 0) { + std::memcpy(tokens_, rhs.tokens_, rhs.tokenCount_ * sizeof(Token)); + } + if (nameBufferSize > 0) { + std::memcpy(nameBuffer_, rhs.nameBuffer_, nameBufferSize * sizeof(Ch)); + } + + // Adjust pointers to name buffer + std::ptrdiff_t diff = nameBuffer_ - rhs.nameBuffer_; + for (Token *t = tokens_; t != tokens_ + rhs.tokenCount_; ++t) + t->name += diff; + + return nameBuffer_ + nameBufferSize; + } + + //! Check whether a character should be percent-encoded. + /*! + According to RFC 3986 2.3 Unreserved Characters. + \param c The character (code unit) to be tested. + */ + bool NeedPercentEncode(Ch c) const { + return !((c >= '0' && c <= '9') || (c >= 'A' && c <='Z') || (c >= 'a' && c <= 'z') || c == '-' || c == '.' || c == '_' || c =='~'); + } + + //! Parse a JSON String or its URI fragment representation into tokens. +#ifndef __clang__ // -Wdocumentation + /*! + \param source Either a JSON Pointer string, or its URI fragment representation. Not need to be null terminated. + \param length Length of the source string. + \note Source cannot be JSON String Representation of JSON Pointer, e.g. In "/\u0000", \u0000 will not be unescaped. + */ +#endif + void Parse(const Ch* source, size_t length) { + RAPIDJSON_ASSERT(source != NULL); + RAPIDJSON_ASSERT(nameBuffer_ == 0); + RAPIDJSON_ASSERT(tokens_ == 0); + + // Create own allocator if user did not supply. + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator()); + + // Count number of '/' as tokenCount + tokenCount_ = 0; + for (const Ch* s = source; s != source + length; s++) + if (*s == '/') + tokenCount_++; + + Token* token = tokens_ = static_cast(allocator_->Malloc(tokenCount_ * sizeof(Token) + length * sizeof(Ch))); + Ch* name = nameBuffer_ = reinterpret_cast(tokens_ + tokenCount_); + size_t i = 0; + + // Detect if it is a URI fragment + bool uriFragment = false; + if (source[i] == '#') { + uriFragment = true; + i++; + } + + if (i != length && source[i] != '/') { + parseErrorCode_ = kPointerParseErrorTokenMustBeginWithSolidus; + goto error; + } + + while (i < length) { + RAPIDJSON_ASSERT(source[i] == '/'); + i++; // consumes '/' + + token->name = name; + bool isNumber = true; + + while (i < length && source[i] != '/') { + Ch c = source[i]; + if (uriFragment) { + // Decoding percent-encoding for URI fragment + if (c == '%') { + PercentDecodeStream is(&source[i], source + length); + GenericInsituStringStream os(name); + Ch* begin = os.PutBegin(); + if (!Transcoder, EncodingType>().Validate(is, os) || !is.IsValid()) { + parseErrorCode_ = kPointerParseErrorInvalidPercentEncoding; + goto error; + } + size_t len = os.PutEnd(begin); + i += is.Tell() - 1; + if (len == 1) + c = *name; + else { + name += len; + isNumber = false; + i++; + continue; + } + } + else if (NeedPercentEncode(c)) { + parseErrorCode_ = kPointerParseErrorCharacterMustPercentEncode; + goto error; + } + } + + i++; + + // Escaping "~0" -> '~', "~1" -> '/' + if (c == '~') { + if (i < length) { + c = source[i]; + if (c == '0') c = '~'; + else if (c == '1') c = '/'; + else { + parseErrorCode_ = kPointerParseErrorInvalidEscape; + goto error; + } + i++; + } + else { + parseErrorCode_ = kPointerParseErrorInvalidEscape; + goto error; + } + } + + // First check for index: all of characters are digit + if (c < '0' || c > '9') + isNumber = false; + + *name++ = c; + } + token->length = static_cast(name - token->name); + if (token->length == 0) + isNumber = false; + *name++ = '\0'; // Null terminator + + // Second check for index: more than one digit cannot have leading zero + if (isNumber && token->length > 1 && token->name[0] == '0') + isNumber = false; + + // String to SizeType conversion + SizeType n = 0; + if (isNumber) { + for (size_t j = 0; j < token->length; j++) { + SizeType m = n * 10 + static_cast(token->name[j] - '0'); + if (m < n) { // overflow detection + isNumber = false; + break; + } + n = m; + } + } + + token->index = isNumber ? n : kPointerInvalidIndex; + token++; + } + + RAPIDJSON_ASSERT(name <= nameBuffer_ + length); // Should not overflow buffer + parseErrorCode_ = kPointerParseErrorNone; + return; + + error: + Allocator::Free(tokens_); + nameBuffer_ = 0; + tokens_ = 0; + tokenCount_ = 0; + parseErrorOffset_ = i; + return; + } + + //! Stringify to string or URI fragment representation. + /*! + \tparam uriFragment True for stringifying to URI fragment representation. False for string representation. + \tparam OutputStream type of output stream. + \param os The output stream. + */ + template + bool Stringify(OutputStream& os) const { + RAPIDJSON_ASSERT(IsValid()); + + if (uriFragment) + os.Put('#'); + + for (Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { + os.Put('/'); + for (size_t j = 0; j < t->length; j++) { + Ch c = t->name[j]; + if (c == '~') { + os.Put('~'); + os.Put('0'); + } + else if (c == '/') { + os.Put('~'); + os.Put('1'); + } + else if (uriFragment && NeedPercentEncode(c)) { + // Transcode to UTF8 sequence + GenericStringStream source(&t->name[j]); + PercentEncodeStream target(os); + if (!Transcoder >().Validate(source, target)) + return false; + j += source.Tell() - 1; + } + else + os.Put(c); + } + } + return true; + } + + //! A helper stream for decoding a percent-encoded sequence into code unit. + /*! + This stream decodes %XY triplet into code unit (0-255). + If it encounters invalid characters, it sets output code unit as 0 and + mark invalid, and to be checked by IsValid(). + */ + class PercentDecodeStream { + public: + typedef typename ValueType::Ch Ch; + + //! Constructor + /*! + \param source Start of the stream + \param end Past-the-end of the stream. + */ + PercentDecodeStream(const Ch* source, const Ch* end) : src_(source), head_(source), end_(end), valid_(true) {} + + Ch Take() { + if (*src_ != '%' || src_ + 3 > end_) { // %XY triplet + valid_ = false; + return 0; + } + src_++; + Ch c = 0; + for (int j = 0; j < 2; j++) { + c = static_cast(c << 4); + Ch h = *src_; + if (h >= '0' && h <= '9') c = static_cast(c + h - '0'); + else if (h >= 'A' && h <= 'F') c = static_cast(c + h - 'A' + 10); + else if (h >= 'a' && h <= 'f') c = static_cast(c + h - 'a' + 10); + else { + valid_ = false; + return 0; + } + src_++; + } + return c; + } + + size_t Tell() const { return static_cast(src_ - head_); } + bool IsValid() const { return valid_; } + + private: + const Ch* src_; //!< Current read position. + const Ch* head_; //!< Original head of the string. + const Ch* end_; //!< Past-the-end position. + bool valid_; //!< Whether the parsing is valid. + }; + + //! A helper stream to encode character (UTF-8 code unit) into percent-encoded sequence. + template + class PercentEncodeStream { + public: + PercentEncodeStream(OutputStream& os) : os_(os) {} + void Put(char c) { // UTF-8 must be byte + unsigned char u = static_cast(c); + static const char hexDigits[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + os_.Put('%'); + os_.Put(hexDigits[u >> 4]); + os_.Put(hexDigits[u & 15]); + } + private: + OutputStream& os_; + }; + + Allocator* allocator_; //!< The current allocator. It is either user-supplied or equal to ownAllocator_. + Allocator* ownAllocator_; //!< Allocator owned by this Pointer. + Ch* nameBuffer_; //!< A buffer containing all names in tokens. + Token* tokens_; //!< A list of tokens. + size_t tokenCount_; //!< Number of tokens in tokens_. + size_t parseErrorOffset_; //!< Offset in code unit when parsing fail. + PointerParseErrorCode parseErrorCode_; //!< Parsing error code. +}; + +//! GenericPointer for Value (UTF-8, default allocator). +typedef GenericPointer Pointer; + +//!@name Helper functions for GenericPointer +//@{ + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType& CreateValueByPointer(T& root, const GenericPointer& pointer, typename T::AllocatorType& a) { + return pointer.Create(root, a); +} + +template +typename T::ValueType& CreateValueByPointer(T& root, const CharType(&source)[N], typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Create(root, a); +} + +// No allocator parameter + +template +typename DocumentType::ValueType& CreateValueByPointer(DocumentType& document, const GenericPointer& pointer) { + return pointer.Create(document); +} + +template +typename DocumentType::ValueType& CreateValueByPointer(DocumentType& document, const CharType(&source)[N]) { + return GenericPointer(source, N - 1).Create(document); +} + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType* GetValueByPointer(T& root, const GenericPointer& pointer, size_t* unresolvedTokenIndex = 0) { + return pointer.Get(root, unresolvedTokenIndex); +} + +template +const typename T::ValueType* GetValueByPointer(const T& root, const GenericPointer& pointer, size_t* unresolvedTokenIndex = 0) { + return pointer.Get(root, unresolvedTokenIndex); +} + +template +typename T::ValueType* GetValueByPointer(T& root, const CharType (&source)[N], size_t* unresolvedTokenIndex = 0) { + return GenericPointer(source, N - 1).Get(root, unresolvedTokenIndex); +} + +template +const typename T::ValueType* GetValueByPointer(const T& root, const CharType(&source)[N], size_t* unresolvedTokenIndex = 0) { + return GenericPointer(source, N - 1).Get(root, unresolvedTokenIndex); +} + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, const typename T::ValueType& defaultValue, typename T::AllocatorType& a) { + return pointer.GetWithDefault(root, defaultValue, a); +} + +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, const typename T::Ch* defaultValue, typename T::AllocatorType& a) { + return pointer.GetWithDefault(root, defaultValue, a); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, const std::basic_string& defaultValue, typename T::AllocatorType& a) { + return pointer.GetWithDefault(root, defaultValue, a); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) +GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, T2 defaultValue, typename T::AllocatorType& a) { + return pointer.GetWithDefault(root, defaultValue, a); +} + +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const typename T::ValueType& defaultValue, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); +} + +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const typename T::Ch* defaultValue, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const std::basic_string& defaultValue, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) +GetValueByPointerWithDefault(T& root, const CharType(&source)[N], T2 defaultValue, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); +} + +// No allocator parameter + +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::ValueType& defaultValue) { + return pointer.GetWithDefault(document, defaultValue); +} + +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::Ch* defaultValue) { + return pointer.GetWithDefault(document, defaultValue); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, const std::basic_string& defaultValue) { + return pointer.GetWithDefault(document, defaultValue); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) +GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, T2 defaultValue) { + return pointer.GetWithDefault(document, defaultValue); +} + +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], const typename DocumentType::ValueType& defaultValue) { + return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); +} + +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], const typename DocumentType::Ch* defaultValue) { + return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], const std::basic_string& defaultValue) { + return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) +GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], T2 defaultValue) { + return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); +} + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, typename T::ValueType& value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, const typename T::ValueType& value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, const typename T::Ch* value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, const std::basic_string& value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) +SetValueByPointer(T& root, const GenericPointer& pointer, T2 value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], typename T::ValueType& value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const typename T::ValueType& value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const typename T::Ch* value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const std::basic_string& value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) +SetValueByPointer(T& root, const CharType(&source)[N], T2 value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} + +// No allocator parameter + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, typename DocumentType::ValueType& value) { + return pointer.Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::ValueType& value) { + return pointer.Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::Ch* value) { + return pointer.Set(document, value); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, const std::basic_string& value) { + return pointer.Set(document, value); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) +SetValueByPointer(DocumentType& document, const GenericPointer& pointer, T2 value) { + return pointer.Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], typename DocumentType::ValueType& value) { + return GenericPointer(source, N - 1).Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], const typename DocumentType::ValueType& value) { + return GenericPointer(source, N - 1).Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], const typename DocumentType::Ch* value) { + return GenericPointer(source, N - 1).Set(document, value); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], const std::basic_string& value) { + return GenericPointer(source, N - 1).Set(document, value); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) +SetValueByPointer(DocumentType& document, const CharType(&source)[N], T2 value) { + return GenericPointer(source, N - 1).Set(document, value); +} + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType& SwapValueByPointer(T& root, const GenericPointer& pointer, typename T::ValueType& value, typename T::AllocatorType& a) { + return pointer.Swap(root, value, a); +} + +template +typename T::ValueType& SwapValueByPointer(T& root, const CharType(&source)[N], typename T::ValueType& value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Swap(root, value, a); +} + +template +typename DocumentType::ValueType& SwapValueByPointer(DocumentType& document, const GenericPointer& pointer, typename DocumentType::ValueType& value) { + return pointer.Swap(document, value); +} + +template +typename DocumentType::ValueType& SwapValueByPointer(DocumentType& document, const CharType(&source)[N], typename DocumentType::ValueType& value) { + return GenericPointer(source, N - 1).Swap(document, value); +} + +////////////////////////////////////////////////////////////////////////////// + +template +bool EraseValueByPointer(T& root, const GenericPointer& pointer) { + return pointer.Erase(root); +} + +template +bool EraseValueByPointer(T& root, const CharType(&source)[N]) { + return GenericPointer(source, N - 1).Erase(root); +} + +//@} + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_POINTER_H_ diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/prettywriter.h b/Externals/discord-rpc/thirdparty/include/rapidjson/prettywriter.h new file mode 100644 index 0000000000..0dcb0fee92 --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/prettywriter.h @@ -0,0 +1,255 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_PRETTYWRITER_H_ +#define RAPIDJSON_PRETTYWRITER_H_ + +#include "writer.h" + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Combination of PrettyWriter format flags. +/*! \see PrettyWriter::SetFormatOptions + */ +enum PrettyFormatOptions { + kFormatDefault = 0, //!< Default pretty formatting. + kFormatSingleLineArray = 1 //!< Format arrays on a single line. +}; + +//! Writer with indentation and spacing. +/*! + \tparam OutputStream Type of ouptut os. + \tparam SourceEncoding Encoding of source string. + \tparam TargetEncoding Encoding of output stream. + \tparam StackAllocator Type of allocator for allocating memory of stack. +*/ +template, typename TargetEncoding = UTF8<>, typename StackAllocator = CrtAllocator, unsigned writeFlags = kWriteDefaultFlags> +class PrettyWriter : public Writer { +public: + typedef Writer Base; + typedef typename Base::Ch Ch; + + //! Constructor + /*! \param os Output stream. + \param allocator User supplied allocator. If it is null, it will create a private one. + \param levelDepth Initial capacity of stack. + */ + explicit PrettyWriter(OutputStream& os, StackAllocator* allocator = 0, size_t levelDepth = Base::kDefaultLevelDepth) : + Base(os, allocator, levelDepth), indentChar_(' '), indentCharCount_(4), formatOptions_(kFormatDefault) {} + + + explicit PrettyWriter(StackAllocator* allocator = 0, size_t levelDepth = Base::kDefaultLevelDepth) : + Base(allocator, levelDepth), indentChar_(' '), indentCharCount_(4) {} + + //! Set custom indentation. + /*! \param indentChar Character for indentation. Must be whitespace character (' ', '\\t', '\\n', '\\r'). + \param indentCharCount Number of indent characters for each indentation level. + \note The default indentation is 4 spaces. + */ + PrettyWriter& SetIndent(Ch indentChar, unsigned indentCharCount) { + RAPIDJSON_ASSERT(indentChar == ' ' || indentChar == '\t' || indentChar == '\n' || indentChar == '\r'); + indentChar_ = indentChar; + indentCharCount_ = indentCharCount; + return *this; + } + + //! Set pretty writer formatting options. + /*! \param options Formatting options. + */ + PrettyWriter& SetFormatOptions(PrettyFormatOptions options) { + formatOptions_ = options; + return *this; + } + + /*! @name Implementation of Handler + \see Handler + */ + //@{ + + bool Null() { PrettyPrefix(kNullType); return Base::WriteNull(); } + bool Bool(bool b) { PrettyPrefix(b ? kTrueType : kFalseType); return Base::WriteBool(b); } + bool Int(int i) { PrettyPrefix(kNumberType); return Base::WriteInt(i); } + bool Uint(unsigned u) { PrettyPrefix(kNumberType); return Base::WriteUint(u); } + bool Int64(int64_t i64) { PrettyPrefix(kNumberType); return Base::WriteInt64(i64); } + bool Uint64(uint64_t u64) { PrettyPrefix(kNumberType); return Base::WriteUint64(u64); } + bool Double(double d) { PrettyPrefix(kNumberType); return Base::WriteDouble(d); } + + bool RawNumber(const Ch* str, SizeType length, bool copy = false) { + (void)copy; + PrettyPrefix(kNumberType); + return Base::WriteString(str, length); + } + + bool String(const Ch* str, SizeType length, bool copy = false) { + (void)copy; + PrettyPrefix(kStringType); + return Base::WriteString(str, length); + } + +#if RAPIDJSON_HAS_STDSTRING + bool String(const std::basic_string& str) { + return String(str.data(), SizeType(str.size())); + } +#endif + + bool StartObject() { + PrettyPrefix(kObjectType); + new (Base::level_stack_.template Push()) typename Base::Level(false); + return Base::WriteStartObject(); + } + + bool Key(const Ch* str, SizeType length, bool copy = false) { return String(str, length, copy); } + +#if RAPIDJSON_HAS_STDSTRING + bool Key(const std::basic_string& str) { + return Key(str.data(), SizeType(str.size())); + } +#endif + + bool EndObject(SizeType memberCount = 0) { + (void)memberCount; + RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >= sizeof(typename Base::Level)); + RAPIDJSON_ASSERT(!Base::level_stack_.template Top()->inArray); + bool empty = Base::level_stack_.template Pop(1)->valueCount == 0; + + if (!empty) { + Base::os_->Put('\n'); + WriteIndent(); + } + bool ret = Base::WriteEndObject(); + (void)ret; + RAPIDJSON_ASSERT(ret == true); + if (Base::level_stack_.Empty()) // end of json text + Base::os_->Flush(); + return true; + } + + bool StartArray() { + PrettyPrefix(kArrayType); + new (Base::level_stack_.template Push()) typename Base::Level(true); + return Base::WriteStartArray(); + } + + bool EndArray(SizeType memberCount = 0) { + (void)memberCount; + RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >= sizeof(typename Base::Level)); + RAPIDJSON_ASSERT(Base::level_stack_.template Top()->inArray); + bool empty = Base::level_stack_.template Pop(1)->valueCount == 0; + + if (!empty && !(formatOptions_ & kFormatSingleLineArray)) { + Base::os_->Put('\n'); + WriteIndent(); + } + bool ret = Base::WriteEndArray(); + (void)ret; + RAPIDJSON_ASSERT(ret == true); + if (Base::level_stack_.Empty()) // end of json text + Base::os_->Flush(); + return true; + } + + //@} + + /*! @name Convenience extensions */ + //@{ + + //! Simpler but slower overload. + bool String(const Ch* str) { return String(str, internal::StrLen(str)); } + bool Key(const Ch* str) { return Key(str, internal::StrLen(str)); } + + //@} + + //! Write a raw JSON value. + /*! + For user to write a stringified JSON as a value. + + \param json A well-formed JSON value. It should not contain null character within [0, length - 1] range. + \param length Length of the json. + \param type Type of the root of json. + \note When using PrettyWriter::RawValue(), the result json may not be indented correctly. + */ + bool RawValue(const Ch* json, size_t length, Type type) { PrettyPrefix(type); return Base::WriteRawValue(json, length); } + +protected: + void PrettyPrefix(Type type) { + (void)type; + if (Base::level_stack_.GetSize() != 0) { // this value is not at root + typename Base::Level* level = Base::level_stack_.template Top(); + + if (level->inArray) { + if (level->valueCount > 0) { + Base::os_->Put(','); // add comma if it is not the first element in array + if (formatOptions_ & kFormatSingleLineArray) + Base::os_->Put(' '); + } + + if (!(formatOptions_ & kFormatSingleLineArray)) { + Base::os_->Put('\n'); + WriteIndent(); + } + } + else { // in object + if (level->valueCount > 0) { + if (level->valueCount % 2 == 0) { + Base::os_->Put(','); + Base::os_->Put('\n'); + } + else { + Base::os_->Put(':'); + Base::os_->Put(' '); + } + } + else + Base::os_->Put('\n'); + + if (level->valueCount % 2 == 0) + WriteIndent(); + } + if (!level->inArray && level->valueCount % 2 == 0) + RAPIDJSON_ASSERT(type == kStringType); // if it's in object, then even number should be a name + level->valueCount++; + } + else { + RAPIDJSON_ASSERT(!Base::hasRoot_); // Should only has one and only one root. + Base::hasRoot_ = true; + } + } + + void WriteIndent() { + size_t count = (Base::level_stack_.GetSize() / sizeof(typename Base::Level)) * indentCharCount_; + PutN(*Base::os_, static_cast(indentChar_), count); + } + + Ch indentChar_; + unsigned indentCharCount_; + PrettyFormatOptions formatOptions_; + +private: + // Prohibit copy constructor & assignment operator. + PrettyWriter(const PrettyWriter&); + PrettyWriter& operator=(const PrettyWriter&); +}; + +RAPIDJSON_NAMESPACE_END + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_RAPIDJSON_H_ diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/rapidjson.h b/Externals/discord-rpc/thirdparty/include/rapidjson/rapidjson.h new file mode 100644 index 0000000000..053b2ce43f --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/rapidjson.h @@ -0,0 +1,615 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_RAPIDJSON_H_ +#define RAPIDJSON_RAPIDJSON_H_ + +/*!\file rapidjson.h + \brief common definitions and configuration + + \see RAPIDJSON_CONFIG + */ + +/*! \defgroup RAPIDJSON_CONFIG RapidJSON configuration + \brief Configuration macros for library features + + Some RapidJSON features are configurable to adapt the library to a wide + variety of platforms, environments and usage scenarios. Most of the + features can be configured in terms of overriden or predefined + preprocessor macros at compile-time. + + Some additional customization is available in the \ref RAPIDJSON_ERRORS APIs. + + \note These macros should be given on the compiler command-line + (where applicable) to avoid inconsistent values when compiling + different translation units of a single application. + */ + +#include // malloc(), realloc(), free(), size_t +#include // memset(), memcpy(), memmove(), memcmp() + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_VERSION_STRING +// +// ALWAYS synchronize the following 3 macros with corresponding variables in /CMakeLists.txt. +// + +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +// token stringification +#define RAPIDJSON_STRINGIFY(x) RAPIDJSON_DO_STRINGIFY(x) +#define RAPIDJSON_DO_STRINGIFY(x) #x +//!@endcond + +/*! \def RAPIDJSON_MAJOR_VERSION + \ingroup RAPIDJSON_CONFIG + \brief Major version of RapidJSON in integer. +*/ +/*! \def RAPIDJSON_MINOR_VERSION + \ingroup RAPIDJSON_CONFIG + \brief Minor version of RapidJSON in integer. +*/ +/*! \def RAPIDJSON_PATCH_VERSION + \ingroup RAPIDJSON_CONFIG + \brief Patch version of RapidJSON in integer. +*/ +/*! \def RAPIDJSON_VERSION_STRING + \ingroup RAPIDJSON_CONFIG + \brief Version of RapidJSON in ".." string format. +*/ +#define RAPIDJSON_MAJOR_VERSION 1 +#define RAPIDJSON_MINOR_VERSION 1 +#define RAPIDJSON_PATCH_VERSION 0 +#define RAPIDJSON_VERSION_STRING \ + RAPIDJSON_STRINGIFY(RAPIDJSON_MAJOR_VERSION.RAPIDJSON_MINOR_VERSION.RAPIDJSON_PATCH_VERSION) + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_NAMESPACE_(BEGIN|END) +/*! \def RAPIDJSON_NAMESPACE + \ingroup RAPIDJSON_CONFIG + \brief provide custom rapidjson namespace + + In order to avoid symbol clashes and/or "One Definition Rule" errors + between multiple inclusions of (different versions of) RapidJSON in + a single binary, users can customize the name of the main RapidJSON + namespace. + + In case of a single nesting level, defining \c RAPIDJSON_NAMESPACE + to a custom name (e.g. \c MyRapidJSON) is sufficient. If multiple + levels are needed, both \ref RAPIDJSON_NAMESPACE_BEGIN and \ref + RAPIDJSON_NAMESPACE_END need to be defined as well: + + \code + // in some .cpp file + #define RAPIDJSON_NAMESPACE my::rapidjson + #define RAPIDJSON_NAMESPACE_BEGIN namespace my { namespace rapidjson { + #define RAPIDJSON_NAMESPACE_END } } + #include "rapidjson/..." + \endcode + + \see rapidjson + */ +/*! \def RAPIDJSON_NAMESPACE_BEGIN + \ingroup RAPIDJSON_CONFIG + \brief provide custom rapidjson namespace (opening expression) + \see RAPIDJSON_NAMESPACE +*/ +/*! \def RAPIDJSON_NAMESPACE_END + \ingroup RAPIDJSON_CONFIG + \brief provide custom rapidjson namespace (closing expression) + \see RAPIDJSON_NAMESPACE +*/ +#ifndef RAPIDJSON_NAMESPACE +#define RAPIDJSON_NAMESPACE rapidjson +#endif +#ifndef RAPIDJSON_NAMESPACE_BEGIN +#define RAPIDJSON_NAMESPACE_BEGIN namespace RAPIDJSON_NAMESPACE { +#endif +#ifndef RAPIDJSON_NAMESPACE_END +#define RAPIDJSON_NAMESPACE_END } +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_HAS_STDSTRING + +#ifndef RAPIDJSON_HAS_STDSTRING +#ifdef RAPIDJSON_DOXYGEN_RUNNING +#define RAPIDJSON_HAS_STDSTRING 1 // force generation of documentation +#else +#define RAPIDJSON_HAS_STDSTRING 0 // no std::string support by default +#endif +/*! \def RAPIDJSON_HAS_STDSTRING + \ingroup RAPIDJSON_CONFIG + \brief Enable RapidJSON support for \c std::string + + By defining this preprocessor symbol to \c 1, several convenience functions for using + \ref rapidjson::GenericValue with \c std::string are enabled, especially + for construction and comparison. + + \hideinitializer +*/ +#endif // !defined(RAPIDJSON_HAS_STDSTRING) + +#if RAPIDJSON_HAS_STDSTRING +#include +#endif // RAPIDJSON_HAS_STDSTRING + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_NO_INT64DEFINE + +/*! \def RAPIDJSON_NO_INT64DEFINE + \ingroup RAPIDJSON_CONFIG + \brief Use external 64-bit integer types. + + RapidJSON requires the 64-bit integer types \c int64_t and \c uint64_t types + to be available at global scope. + + If users have their own definition, define RAPIDJSON_NO_INT64DEFINE to + prevent RapidJSON from defining its own types. +*/ +#ifndef RAPIDJSON_NO_INT64DEFINE +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#if defined(_MSC_VER) && (_MSC_VER < 1800) // Visual Studio 2013 +#include "msinttypes/stdint.h" +#include "msinttypes/inttypes.h" +#else +// Other compilers should have this. +#include +#include +#endif +//!@endcond +#ifdef RAPIDJSON_DOXYGEN_RUNNING +#define RAPIDJSON_NO_INT64DEFINE +#endif +#endif // RAPIDJSON_NO_INT64TYPEDEF + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_FORCEINLINE + +#ifndef RAPIDJSON_FORCEINLINE +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#if defined(_MSC_VER) && defined(NDEBUG) +#define RAPIDJSON_FORCEINLINE __forceinline +#elif defined(__GNUC__) && __GNUC__ >= 4 && defined(NDEBUG) +#define RAPIDJSON_FORCEINLINE __attribute__((always_inline)) +#else +#define RAPIDJSON_FORCEINLINE +#endif +//!@endcond +#endif // RAPIDJSON_FORCEINLINE + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ENDIAN +#define RAPIDJSON_LITTLEENDIAN 0 //!< Little endian machine +#define RAPIDJSON_BIGENDIAN 1 //!< Big endian machine + +//! Endianness of the machine. +/*! + \def RAPIDJSON_ENDIAN + \ingroup RAPIDJSON_CONFIG + + GCC 4.6 provided macro for detecting endianness of the target machine. But other + compilers may not have this. User can define RAPIDJSON_ENDIAN to either + \ref RAPIDJSON_LITTLEENDIAN or \ref RAPIDJSON_BIGENDIAN. + + Default detection implemented with reference to + \li https://gcc.gnu.org/onlinedocs/gcc-4.6.0/cpp/Common-Predefined-Macros.html + \li http://www.boost.org/doc/libs/1_42_0/boost/detail/endian.hpp +*/ +#ifndef RAPIDJSON_ENDIAN +// Detect with GCC 4.6's macro +# ifdef __BYTE_ORDER__ +# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ +# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN +# else +# error Unknown machine endianess detected. User needs to define RAPIDJSON_ENDIAN. +# endif // __BYTE_ORDER__ +// Detect with GLIBC's endian.h +# elif defined(__GLIBC__) +# include +# if (__BYTE_ORDER == __LITTLE_ENDIAN) +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif (__BYTE_ORDER == __BIG_ENDIAN) +# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN +# else +# error Unknown machine endianess detected. User needs to define RAPIDJSON_ENDIAN. +# endif // __GLIBC__ +// Detect with _LITTLE_ENDIAN and _BIG_ENDIAN macro +# elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN) +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN) +# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN +// Detect with architecture macros +# elif defined(__sparc) || defined(__sparc__) || defined(_POWER) || defined(__powerpc__) || defined(__ppc__) || defined(__hpux) || defined(__hppa) || defined(_MIPSEB) || defined(_POWER) || defined(__s390__) +# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN +# elif defined(__i386__) || defined(__alpha__) || defined(__ia64) || defined(__ia64__) || defined(_M_IX86) || defined(_M_IA64) || defined(_M_ALPHA) || defined(__amd64) || defined(__amd64__) || defined(_M_AMD64) || defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || defined(__bfin__) +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif defined(_MSC_VER) && defined(_M_ARM) +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif defined(RAPIDJSON_DOXYGEN_RUNNING) +# define RAPIDJSON_ENDIAN +# else +# error Unknown machine endianess detected. User needs to define RAPIDJSON_ENDIAN. +# endif +#endif // RAPIDJSON_ENDIAN + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_64BIT + +//! Whether using 64-bit architecture +#ifndef RAPIDJSON_64BIT +#if defined(__LP64__) || (defined(__x86_64__) && defined(__ILP32__)) || defined(_WIN64) || defined(__EMSCRIPTEN__) +#define RAPIDJSON_64BIT 1 +#else +#define RAPIDJSON_64BIT 0 +#endif +#endif // RAPIDJSON_64BIT + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ALIGN + +//! Data alignment of the machine. +/*! \ingroup RAPIDJSON_CONFIG + \param x pointer to align + + Some machines require strict data alignment. Currently the default uses 4 bytes + alignment on 32-bit platforms and 8 bytes alignment for 64-bit platforms. + User can customize by defining the RAPIDJSON_ALIGN function macro. +*/ +#ifndef RAPIDJSON_ALIGN +#if RAPIDJSON_64BIT == 1 +#define RAPIDJSON_ALIGN(x) (((x) + static_cast(7u)) & ~static_cast(7u)) +#else +#define RAPIDJSON_ALIGN(x) (((x) + 3u) & ~3u) +#endif +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_UINT64_C2 + +//! Construct a 64-bit literal by a pair of 32-bit integer. +/*! + 64-bit literal with or without ULL suffix is prone to compiler warnings. + UINT64_C() is C macro which cause compilation problems. + Use this macro to define 64-bit constants by a pair of 32-bit integer. +*/ +#ifndef RAPIDJSON_UINT64_C2 +#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast(high32) << 32) | static_cast(low32)) +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_48BITPOINTER_OPTIMIZATION + +//! Use only lower 48-bit address for some pointers. +/*! + \ingroup RAPIDJSON_CONFIG + + This optimization uses the fact that current X86-64 architecture only implement lower 48-bit virtual address. + The higher 16-bit can be used for storing other data. + \c GenericValue uses this optimization to reduce its size form 24 bytes to 16 bytes in 64-bit architecture. +*/ +#ifndef RAPIDJSON_48BITPOINTER_OPTIMIZATION +#if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64) +#define RAPIDJSON_48BITPOINTER_OPTIMIZATION 1 +#else +#define RAPIDJSON_48BITPOINTER_OPTIMIZATION 0 +#endif +#endif // RAPIDJSON_48BITPOINTER_OPTIMIZATION + +#if RAPIDJSON_48BITPOINTER_OPTIMIZATION == 1 +#if RAPIDJSON_64BIT != 1 +#error RAPIDJSON_48BITPOINTER_OPTIMIZATION can only be set to 1 when RAPIDJSON_64BIT=1 +#endif +#define RAPIDJSON_SETPOINTER(type, p, x) (p = reinterpret_cast((reinterpret_cast(p) & static_cast(RAPIDJSON_UINT64_C2(0xFFFF0000, 0x00000000))) | reinterpret_cast(reinterpret_cast(x)))) +#define RAPIDJSON_GETPOINTER(type, p) (reinterpret_cast(reinterpret_cast(p) & static_cast(RAPIDJSON_UINT64_C2(0x0000FFFF, 0xFFFFFFFF)))) +#else +#define RAPIDJSON_SETPOINTER(type, p, x) (p = (x)) +#define RAPIDJSON_GETPOINTER(type, p) (p) +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_SSE2/RAPIDJSON_SSE42/RAPIDJSON_SIMD + +/*! \def RAPIDJSON_SIMD + \ingroup RAPIDJSON_CONFIG + \brief Enable SSE2/SSE4.2 optimization. + + RapidJSON supports optimized implementations for some parsing operations + based on the SSE2 or SSE4.2 SIMD extensions on modern Intel-compatible + processors. + + To enable these optimizations, two different symbols can be defined; + \code + // Enable SSE2 optimization. + #define RAPIDJSON_SSE2 + + // Enable SSE4.2 optimization. + #define RAPIDJSON_SSE42 + \endcode + + \c RAPIDJSON_SSE42 takes precedence, if both are defined. + + If any of these symbols is defined, RapidJSON defines the macro + \c RAPIDJSON_SIMD to indicate the availability of the optimized code. +*/ +#if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) \ + || defined(RAPIDJSON_DOXYGEN_RUNNING) +#define RAPIDJSON_SIMD +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_NO_SIZETYPEDEFINE + +#ifndef RAPIDJSON_NO_SIZETYPEDEFINE +/*! \def RAPIDJSON_NO_SIZETYPEDEFINE + \ingroup RAPIDJSON_CONFIG + \brief User-provided \c SizeType definition. + + In order to avoid using 32-bit size types for indexing strings and arrays, + define this preprocessor symbol and provide the type rapidjson::SizeType + before including RapidJSON: + \code + #define RAPIDJSON_NO_SIZETYPEDEFINE + namespace rapidjson { typedef ::std::size_t SizeType; } + #include "rapidjson/..." + \endcode + + \see rapidjson::SizeType +*/ +#ifdef RAPIDJSON_DOXYGEN_RUNNING +#define RAPIDJSON_NO_SIZETYPEDEFINE +#endif +RAPIDJSON_NAMESPACE_BEGIN +//! Size type (for string lengths, array sizes, etc.) +/*! RapidJSON uses 32-bit array/string indices even on 64-bit platforms, + instead of using \c size_t. Users may override the SizeType by defining + \ref RAPIDJSON_NO_SIZETYPEDEFINE. +*/ +typedef unsigned SizeType; +RAPIDJSON_NAMESPACE_END +#endif + +// always import std::size_t to rapidjson namespace +RAPIDJSON_NAMESPACE_BEGIN +using std::size_t; +RAPIDJSON_NAMESPACE_END + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ASSERT + +//! Assertion. +/*! \ingroup RAPIDJSON_CONFIG + By default, rapidjson uses C \c assert() for internal assertions. + User can override it by defining RAPIDJSON_ASSERT(x) macro. + + \note Parsing errors are handled and can be customized by the + \ref RAPIDJSON_ERRORS APIs. +*/ +#ifndef RAPIDJSON_ASSERT +#include +#define RAPIDJSON_ASSERT(x) assert(x) +#endif // RAPIDJSON_ASSERT + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_STATIC_ASSERT + +// Adopt from boost +#ifndef RAPIDJSON_STATIC_ASSERT +#ifndef __clang__ +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#endif +RAPIDJSON_NAMESPACE_BEGIN +template struct STATIC_ASSERTION_FAILURE; +template <> struct STATIC_ASSERTION_FAILURE { enum { value = 1 }; }; +template struct StaticAssertTest {}; +RAPIDJSON_NAMESPACE_END + +#define RAPIDJSON_JOIN(X, Y) RAPIDJSON_DO_JOIN(X, Y) +#define RAPIDJSON_DO_JOIN(X, Y) RAPIDJSON_DO_JOIN2(X, Y) +#define RAPIDJSON_DO_JOIN2(X, Y) X##Y + +#if defined(__GNUC__) +#define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE __attribute__((unused)) +#else +#define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE +#endif +#ifndef __clang__ +//!@endcond +#endif + +/*! \def RAPIDJSON_STATIC_ASSERT + \brief (Internal) macro to check for conditions at compile-time + \param x compile-time condition + \hideinitializer + */ +#define RAPIDJSON_STATIC_ASSERT(x) \ + typedef ::RAPIDJSON_NAMESPACE::StaticAssertTest< \ + sizeof(::RAPIDJSON_NAMESPACE::STATIC_ASSERTION_FAILURE)> \ + RAPIDJSON_JOIN(StaticAssertTypedef, __LINE__) RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_LIKELY, RAPIDJSON_UNLIKELY + +//! Compiler branching hint for expression with high probability to be true. +/*! + \ingroup RAPIDJSON_CONFIG + \param x Boolean expression likely to be true. +*/ +#ifndef RAPIDJSON_LIKELY +#if defined(__GNUC__) || defined(__clang__) +#define RAPIDJSON_LIKELY(x) __builtin_expect(!!(x), 1) +#else +#define RAPIDJSON_LIKELY(x) (x) +#endif +#endif + +//! Compiler branching hint for expression with low probability to be true. +/*! + \ingroup RAPIDJSON_CONFIG + \param x Boolean expression unlikely to be true. +*/ +#ifndef RAPIDJSON_UNLIKELY +#if defined(__GNUC__) || defined(__clang__) +#define RAPIDJSON_UNLIKELY(x) __builtin_expect(!!(x), 0) +#else +#define RAPIDJSON_UNLIKELY(x) (x) +#endif +#endif + +/////////////////////////////////////////////////////////////////////////////// +// Helpers + +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN + +#define RAPIDJSON_MULTILINEMACRO_BEGIN do { +#define RAPIDJSON_MULTILINEMACRO_END \ +} while((void)0, 0) + +// adopted from Boost +#define RAPIDJSON_VERSION_CODE(x,y,z) \ + (((x)*100000) + ((y)*100) + (z)) + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_DIAG_PUSH/POP, RAPIDJSON_DIAG_OFF + +#if defined(__GNUC__) +#define RAPIDJSON_GNUC \ + RAPIDJSON_VERSION_CODE(__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__) +#endif + +#if defined(__clang__) || (defined(RAPIDJSON_GNUC) && RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,2,0)) + +#define RAPIDJSON_PRAGMA(x) _Pragma(RAPIDJSON_STRINGIFY(x)) +#define RAPIDJSON_DIAG_PRAGMA(x) RAPIDJSON_PRAGMA(GCC diagnostic x) +#define RAPIDJSON_DIAG_OFF(x) \ + RAPIDJSON_DIAG_PRAGMA(ignored RAPIDJSON_STRINGIFY(RAPIDJSON_JOIN(-W,x))) + +// push/pop support in Clang and GCC>=4.6 +#if defined(__clang__) || (defined(RAPIDJSON_GNUC) && RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) +#define RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_PRAGMA(push) +#define RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_PRAGMA(pop) +#else // GCC >= 4.2, < 4.6 +#define RAPIDJSON_DIAG_PUSH /* ignored */ +#define RAPIDJSON_DIAG_POP /* ignored */ +#endif + +#elif defined(_MSC_VER) + +// pragma (MSVC specific) +#define RAPIDJSON_PRAGMA(x) __pragma(x) +#define RAPIDJSON_DIAG_PRAGMA(x) RAPIDJSON_PRAGMA(warning(x)) + +#define RAPIDJSON_DIAG_OFF(x) RAPIDJSON_DIAG_PRAGMA(disable: x) +#define RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_PRAGMA(push) +#define RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_PRAGMA(pop) + +#else + +#define RAPIDJSON_DIAG_OFF(x) /* ignored */ +#define RAPIDJSON_DIAG_PUSH /* ignored */ +#define RAPIDJSON_DIAG_POP /* ignored */ + +#endif // RAPIDJSON_DIAG_* + +/////////////////////////////////////////////////////////////////////////////// +// C++11 features + +#ifndef RAPIDJSON_HAS_CXX11_RVALUE_REFS +#if defined(__clang__) +#if __has_feature(cxx_rvalue_references) && \ + (defined(_LIBCPP_VERSION) || defined(__GLIBCXX__) && __GLIBCXX__ >= 20080306) +#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1 +#else +#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0 +#endif +#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,3,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ + (defined(_MSC_VER) && _MSC_VER >= 1600) + +#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1 +#else +#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0 +#endif +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + +#ifndef RAPIDJSON_HAS_CXX11_NOEXCEPT +#if defined(__clang__) +#define RAPIDJSON_HAS_CXX11_NOEXCEPT __has_feature(cxx_noexcept) +#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) +// (defined(_MSC_VER) && _MSC_VER >= ????) // not yet supported +#define RAPIDJSON_HAS_CXX11_NOEXCEPT 1 +#else +#define RAPIDJSON_HAS_CXX11_NOEXCEPT 0 +#endif +#endif +#if RAPIDJSON_HAS_CXX11_NOEXCEPT +#define RAPIDJSON_NOEXCEPT noexcept +#else +#define RAPIDJSON_NOEXCEPT /* noexcept */ +#endif // RAPIDJSON_HAS_CXX11_NOEXCEPT + +// no automatic detection, yet +#ifndef RAPIDJSON_HAS_CXX11_TYPETRAITS +#define RAPIDJSON_HAS_CXX11_TYPETRAITS 0 +#endif + +#ifndef RAPIDJSON_HAS_CXX11_RANGE_FOR +#if defined(__clang__) +#define RAPIDJSON_HAS_CXX11_RANGE_FOR __has_feature(cxx_range_for) +#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,3,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ + (defined(_MSC_VER) && _MSC_VER >= 1700) +#define RAPIDJSON_HAS_CXX11_RANGE_FOR 1 +#else +#define RAPIDJSON_HAS_CXX11_RANGE_FOR 0 +#endif +#endif // RAPIDJSON_HAS_CXX11_RANGE_FOR + +//!@endcond + +/////////////////////////////////////////////////////////////////////////////// +// new/delete + +#ifndef RAPIDJSON_NEW +///! customization point for global \c new +#define RAPIDJSON_NEW(x) new x +#endif +#ifndef RAPIDJSON_DELETE +///! customization point for global \c delete +#define RAPIDJSON_DELETE(x) delete x +#endif + +/////////////////////////////////////////////////////////////////////////////// +// Type + +/*! \namespace rapidjson + \brief main RapidJSON namespace + \see RAPIDJSON_NAMESPACE +*/ +RAPIDJSON_NAMESPACE_BEGIN + +//! Type of JSON value +enum Type { + kNullType = 0, //!< null + kFalseType = 1, //!< false + kTrueType = 2, //!< true + kObjectType = 3, //!< object + kArrayType = 4, //!< array + kStringType = 5, //!< string + kNumberType = 6 //!< number +}; + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_RAPIDJSON_H_ diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/reader.h b/Externals/discord-rpc/thirdparty/include/rapidjson/reader.h new file mode 100644 index 0000000000..19f8849b14 --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/reader.h @@ -0,0 +1,1879 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_READER_H_ +#define RAPIDJSON_READER_H_ + +/*! \file reader.h */ + +#include "allocators.h" +#include "stream.h" +#include "encodedstream.h" +#include "internal/meta.h" +#include "internal/stack.h" +#include "internal/strtod.h" +#include + +#if defined(RAPIDJSON_SIMD) && defined(_MSC_VER) +#include +#pragma intrinsic(_BitScanForward) +#endif +#ifdef RAPIDJSON_SSE42 +#include +#elif defined(RAPIDJSON_SSE2) +#include +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant +RAPIDJSON_DIAG_OFF(4702) // unreachable code +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(old-style-cast) +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(switch-enum) +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#define RAPIDJSON_NOTHING /* deliberately empty */ +#ifndef RAPIDJSON_PARSE_ERROR_EARLY_RETURN +#define RAPIDJSON_PARSE_ERROR_EARLY_RETURN(value) \ + RAPIDJSON_MULTILINEMACRO_BEGIN \ + if (RAPIDJSON_UNLIKELY(HasParseError())) { return value; } \ + RAPIDJSON_MULTILINEMACRO_END +#endif +#define RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID \ + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING) +//!@endcond + +/*! \def RAPIDJSON_PARSE_ERROR_NORETURN + \ingroup RAPIDJSON_ERRORS + \brief Macro to indicate a parse error. + \param parseErrorCode \ref rapidjson::ParseErrorCode of the error + \param offset position of the error in JSON input (\c size_t) + + This macros can be used as a customization point for the internal + error handling mechanism of RapidJSON. + + A common usage model is to throw an exception instead of requiring the + caller to explicitly check the \ref rapidjson::GenericReader::Parse's + return value: + + \code + #define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode,offset) \ + throw ParseException(parseErrorCode, #parseErrorCode, offset) + + #include // std::runtime_error + #include "rapidjson/error/error.h" // rapidjson::ParseResult + + struct ParseException : std::runtime_error, rapidjson::ParseResult { + ParseException(rapidjson::ParseErrorCode code, const char* msg, size_t offset) + : std::runtime_error(msg), ParseResult(code, offset) {} + }; + + #include "rapidjson/reader.h" + \endcode + + \see RAPIDJSON_PARSE_ERROR, rapidjson::GenericReader::Parse + */ +#ifndef RAPIDJSON_PARSE_ERROR_NORETURN +#define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset) \ + RAPIDJSON_MULTILINEMACRO_BEGIN \ + RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \ + SetParseError(parseErrorCode, offset); \ + RAPIDJSON_MULTILINEMACRO_END +#endif + +/*! \def RAPIDJSON_PARSE_ERROR + \ingroup RAPIDJSON_ERRORS + \brief (Internal) macro to indicate and handle a parse error. + \param parseErrorCode \ref rapidjson::ParseErrorCode of the error + \param offset position of the error in JSON input (\c size_t) + + Invokes RAPIDJSON_PARSE_ERROR_NORETURN and stops the parsing. + + \see RAPIDJSON_PARSE_ERROR_NORETURN + \hideinitializer + */ +#ifndef RAPIDJSON_PARSE_ERROR +#define RAPIDJSON_PARSE_ERROR(parseErrorCode, offset) \ + RAPIDJSON_MULTILINEMACRO_BEGIN \ + RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \ + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \ + RAPIDJSON_MULTILINEMACRO_END +#endif + +#include "error/error.h" // ParseErrorCode, ParseResult + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// ParseFlag + +/*! \def RAPIDJSON_PARSE_DEFAULT_FLAGS + \ingroup RAPIDJSON_CONFIG + \brief User-defined kParseDefaultFlags definition. + + User can define this as any \c ParseFlag combinations. +*/ +#ifndef RAPIDJSON_PARSE_DEFAULT_FLAGS +#define RAPIDJSON_PARSE_DEFAULT_FLAGS kParseNoFlags +#endif + +//! Combination of parseFlags +/*! \see Reader::Parse, Document::Parse, Document::ParseInsitu, Document::ParseStream + */ +enum ParseFlag { + kParseNoFlags = 0, //!< No flags are set. + kParseInsituFlag = 1, //!< In-situ(destructive) parsing. + kParseValidateEncodingFlag = 2, //!< Validate encoding of JSON strings. + kParseIterativeFlag = 4, //!< Iterative(constant complexity in terms of function call stack size) parsing. + kParseStopWhenDoneFlag = 8, //!< After parsing a complete JSON root from stream, stop further processing the rest of stream. When this flag is used, parser will not generate kParseErrorDocumentRootNotSingular error. + kParseFullPrecisionFlag = 16, //!< Parse number in full precision (but slower). + kParseCommentsFlag = 32, //!< Allow one-line (//) and multi-line (/**/) comments. + kParseNumbersAsStringsFlag = 64, //!< Parse all numbers (ints/doubles) as strings. + kParseTrailingCommasFlag = 128, //!< Allow trailing commas at the end of objects and arrays. + kParseNanAndInfFlag = 256, //!< Allow parsing NaN, Inf, Infinity, -Inf and -Infinity as doubles. + kParseDefaultFlags = RAPIDJSON_PARSE_DEFAULT_FLAGS //!< Default parse flags. Can be customized by defining RAPIDJSON_PARSE_DEFAULT_FLAGS +}; + +/////////////////////////////////////////////////////////////////////////////// +// Handler + +/*! \class rapidjson::Handler + \brief Concept for receiving events from GenericReader upon parsing. + The functions return true if no error occurs. If they return false, + the event publisher should terminate the process. +\code +concept Handler { + typename Ch; + + bool Null(); + bool Bool(bool b); + bool Int(int i); + bool Uint(unsigned i); + bool Int64(int64_t i); + bool Uint64(uint64_t i); + bool Double(double d); + /// enabled via kParseNumbersAsStringsFlag, string is not null-terminated (use length) + bool RawNumber(const Ch* str, SizeType length, bool copy); + bool String(const Ch* str, SizeType length, bool copy); + bool StartObject(); + bool Key(const Ch* str, SizeType length, bool copy); + bool EndObject(SizeType memberCount); + bool StartArray(); + bool EndArray(SizeType elementCount); +}; +\endcode +*/ +/////////////////////////////////////////////////////////////////////////////// +// BaseReaderHandler + +//! Default implementation of Handler. +/*! This can be used as base class of any reader handler. + \note implements Handler concept +*/ +template, typename Derived = void> +struct BaseReaderHandler { + typedef typename Encoding::Ch Ch; + + typedef typename internal::SelectIf, BaseReaderHandler, Derived>::Type Override; + + bool Default() { return true; } + bool Null() { return static_cast(*this).Default(); } + bool Bool(bool) { return static_cast(*this).Default(); } + bool Int(int) { return static_cast(*this).Default(); } + bool Uint(unsigned) { return static_cast(*this).Default(); } + bool Int64(int64_t) { return static_cast(*this).Default(); } + bool Uint64(uint64_t) { return static_cast(*this).Default(); } + bool Double(double) { return static_cast(*this).Default(); } + /// enabled via kParseNumbersAsStringsFlag, string is not null-terminated (use length) + bool RawNumber(const Ch* str, SizeType len, bool copy) { return static_cast(*this).String(str, len, copy); } + bool String(const Ch*, SizeType, bool) { return static_cast(*this).Default(); } + bool StartObject() { return static_cast(*this).Default(); } + bool Key(const Ch* str, SizeType len, bool copy) { return static_cast(*this).String(str, len, copy); } + bool EndObject(SizeType) { return static_cast(*this).Default(); } + bool StartArray() { return static_cast(*this).Default(); } + bool EndArray(SizeType) { return static_cast(*this).Default(); } +}; + +/////////////////////////////////////////////////////////////////////////////// +// StreamLocalCopy + +namespace internal { + +template::copyOptimization> +class StreamLocalCopy; + +//! Do copy optimization. +template +class StreamLocalCopy { +public: + StreamLocalCopy(Stream& original) : s(original), original_(original) {} + ~StreamLocalCopy() { original_ = s; } + + Stream s; + +private: + StreamLocalCopy& operator=(const StreamLocalCopy&) /* = delete */; + + Stream& original_; +}; + +//! Keep reference. +template +class StreamLocalCopy { +public: + StreamLocalCopy(Stream& original) : s(original) {} + + Stream& s; + +private: + StreamLocalCopy& operator=(const StreamLocalCopy&) /* = delete */; +}; + +} // namespace internal + +/////////////////////////////////////////////////////////////////////////////// +// SkipWhitespace + +//! Skip the JSON white spaces in a stream. +/*! \param is A input stream for skipping white spaces. + \note This function has SSE2/SSE4.2 specialization. +*/ +template +void SkipWhitespace(InputStream& is) { + internal::StreamLocalCopy copy(is); + InputStream& s(copy.s); + + typename InputStream::Ch c; + while ((c = s.Peek()) == ' ' || c == '\n' || c == '\r' || c == '\t') + s.Take(); +} + +inline const char* SkipWhitespace(const char* p, const char* end) { + while (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) + ++p; + return p; +} + +#ifdef RAPIDJSON_SSE42 +//! Skip whitespace with SSE 4.2 pcmpistrm instruction, testing 16 8-byte characters at once. +inline const char *SkipWhitespace_SIMD(const char* p) { + // Fast return for single non-whitespace + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // 16-byte align to the next boundary + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // The rest of string using SIMD + static const char whitespace[16] = " \n\r\t"; + const __m128i w = _mm_loadu_si128(reinterpret_cast(&whitespace[0])); + + for (;; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const int r = _mm_cvtsi128_si32(_mm_cmpistrm(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_BIT_MASK | _SIDD_NEGATIVE_POLARITY)); + if (r != 0) { // some of characters is non-whitespace +#ifdef _MSC_VER // Find the index of first non-whitespace + unsigned long offset; + _BitScanForward(&offset, r); + return p + offset; +#else + return p + __builtin_ffs(r) - 1; +#endif + } + } +} + +inline const char *SkipWhitespace_SIMD(const char* p, const char* end) { + // Fast return for single non-whitespace + if (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) + ++p; + else + return p; + + // The middle of string using SIMD + static const char whitespace[16] = " \n\r\t"; + const __m128i w = _mm_loadu_si128(reinterpret_cast(&whitespace[0])); + + for (; p <= end - 16; p += 16) { + const __m128i s = _mm_loadu_si128(reinterpret_cast(p)); + const int r = _mm_cvtsi128_si32(_mm_cmpistrm(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_BIT_MASK | _SIDD_NEGATIVE_POLARITY)); + if (r != 0) { // some of characters is non-whitespace +#ifdef _MSC_VER // Find the index of first non-whitespace + unsigned long offset; + _BitScanForward(&offset, r); + return p + offset; +#else + return p + __builtin_ffs(r) - 1; +#endif + } + } + + return SkipWhitespace(p, end); +} + +#elif defined(RAPIDJSON_SSE2) + +//! Skip whitespace with SSE2 instructions, testing 16 8-byte characters at once. +inline const char *SkipWhitespace_SIMD(const char* p) { + // Fast return for single non-whitespace + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // 16-byte align to the next boundary + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // The rest of string + #define C16(c) { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c } + static const char whitespaces[4][16] = { C16(' '), C16('\n'), C16('\r'), C16('\t') }; + #undef C16 + + const __m128i w0 = _mm_loadu_si128(reinterpret_cast(&whitespaces[0][0])); + const __m128i w1 = _mm_loadu_si128(reinterpret_cast(&whitespaces[1][0])); + const __m128i w2 = _mm_loadu_si128(reinterpret_cast(&whitespaces[2][0])); + const __m128i w3 = _mm_loadu_si128(reinterpret_cast(&whitespaces[3][0])); + + for (;; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + __m128i x = _mm_cmpeq_epi8(s, w0); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3)); + unsigned short r = static_cast(~_mm_movemask_epi8(x)); + if (r != 0) { // some of characters may be non-whitespace +#ifdef _MSC_VER // Find the index of first non-whitespace + unsigned long offset; + _BitScanForward(&offset, r); + return p + offset; +#else + return p + __builtin_ffs(r) - 1; +#endif + } + } +} + +inline const char *SkipWhitespace_SIMD(const char* p, const char* end) { + // Fast return for single non-whitespace + if (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) + ++p; + else + return p; + + // The rest of string + #define C16(c) { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c } + static const char whitespaces[4][16] = { C16(' '), C16('\n'), C16('\r'), C16('\t') }; + #undef C16 + + const __m128i w0 = _mm_loadu_si128(reinterpret_cast(&whitespaces[0][0])); + const __m128i w1 = _mm_loadu_si128(reinterpret_cast(&whitespaces[1][0])); + const __m128i w2 = _mm_loadu_si128(reinterpret_cast(&whitespaces[2][0])); + const __m128i w3 = _mm_loadu_si128(reinterpret_cast(&whitespaces[3][0])); + + for (; p <= end - 16; p += 16) { + const __m128i s = _mm_loadu_si128(reinterpret_cast(p)); + __m128i x = _mm_cmpeq_epi8(s, w0); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3)); + unsigned short r = static_cast(~_mm_movemask_epi8(x)); + if (r != 0) { // some of characters may be non-whitespace +#ifdef _MSC_VER // Find the index of first non-whitespace + unsigned long offset; + _BitScanForward(&offset, r); + return p + offset; +#else + return p + __builtin_ffs(r) - 1; +#endif + } + } + + return SkipWhitespace(p, end); +} + +#endif // RAPIDJSON_SSE2 + +#ifdef RAPIDJSON_SIMD +//! Template function specialization for InsituStringStream +template<> inline void SkipWhitespace(InsituStringStream& is) { + is.src_ = const_cast(SkipWhitespace_SIMD(is.src_)); +} + +//! Template function specialization for StringStream +template<> inline void SkipWhitespace(StringStream& is) { + is.src_ = SkipWhitespace_SIMD(is.src_); +} + +template<> inline void SkipWhitespace(EncodedInputStream, MemoryStream>& is) { + is.is_.src_ = SkipWhitespace_SIMD(is.is_.src_, is.is_.end_); +} +#endif // RAPIDJSON_SIMD + +/////////////////////////////////////////////////////////////////////////////// +// GenericReader + +//! SAX-style JSON parser. Use \ref Reader for UTF8 encoding and default allocator. +/*! GenericReader parses JSON text from a stream, and send events synchronously to an + object implementing Handler concept. + + It needs to allocate a stack for storing a single decoded string during + non-destructive parsing. + + For in-situ parsing, the decoded string is directly written to the source + text string, no temporary buffer is required. + + A GenericReader object can be reused for parsing multiple JSON text. + + \tparam SourceEncoding Encoding of the input stream. + \tparam TargetEncoding Encoding of the parse output. + \tparam StackAllocator Allocator type for stack. +*/ +template +class GenericReader { +public: + typedef typename SourceEncoding::Ch Ch; //!< SourceEncoding character type + + //! Constructor. + /*! \param stackAllocator Optional allocator for allocating stack memory. (Only use for non-destructive parsing) + \param stackCapacity stack capacity in bytes for storing a single decoded string. (Only use for non-destructive parsing) + */ + GenericReader(StackAllocator* stackAllocator = 0, size_t stackCapacity = kDefaultStackCapacity) : stack_(stackAllocator, stackCapacity), parseResult_() {} + + //! Parse JSON text. + /*! \tparam parseFlags Combination of \ref ParseFlag. + \tparam InputStream Type of input stream, implementing Stream concept. + \tparam Handler Type of handler, implementing Handler concept. + \param is Input stream to be parsed. + \param handler The handler to receive events. + \return Whether the parsing is successful. + */ + template + ParseResult Parse(InputStream& is, Handler& handler) { + if (parseFlags & kParseIterativeFlag) + return IterativeParse(is, handler); + + parseResult_.Clear(); + + ClearStackOnExit scope(*this); + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + + if (RAPIDJSON_UNLIKELY(is.Peek() == '\0')) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorDocumentEmpty, is.Tell()); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + } + else { + ParseValue(is, handler); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + + if (!(parseFlags & kParseStopWhenDoneFlag)) { + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + + if (RAPIDJSON_UNLIKELY(is.Peek() != '\0')) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorDocumentRootNotSingular, is.Tell()); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + } + } + } + + return parseResult_; + } + + //! Parse JSON text (with \ref kParseDefaultFlags) + /*! \tparam InputStream Type of input stream, implementing Stream concept + \tparam Handler Type of handler, implementing Handler concept. + \param is Input stream to be parsed. + \param handler The handler to receive events. + \return Whether the parsing is successful. + */ + template + ParseResult Parse(InputStream& is, Handler& handler) { + return Parse(is, handler); + } + + //! Whether a parse error has occured in the last parsing. + bool HasParseError() const { return parseResult_.IsError(); } + + //! Get the \ref ParseErrorCode of last parsing. + ParseErrorCode GetParseErrorCode() const { return parseResult_.Code(); } + + //! Get the position of last parsing error in input, 0 otherwise. + size_t GetErrorOffset() const { return parseResult_.Offset(); } + +protected: + void SetParseError(ParseErrorCode code, size_t offset) { parseResult_.Set(code, offset); } + +private: + // Prohibit copy constructor & assignment operator. + GenericReader(const GenericReader&); + GenericReader& operator=(const GenericReader&); + + void ClearStack() { stack_.Clear(); } + + // clear stack on any exit from ParseStream, e.g. due to exception + struct ClearStackOnExit { + explicit ClearStackOnExit(GenericReader& r) : r_(r) {} + ~ClearStackOnExit() { r_.ClearStack(); } + private: + GenericReader& r_; + ClearStackOnExit(const ClearStackOnExit&); + ClearStackOnExit& operator=(const ClearStackOnExit&); + }; + + template + void SkipWhitespaceAndComments(InputStream& is) { + SkipWhitespace(is); + + if (parseFlags & kParseCommentsFlag) { + while (RAPIDJSON_UNLIKELY(Consume(is, '/'))) { + if (Consume(is, '*')) { + while (true) { + if (RAPIDJSON_UNLIKELY(is.Peek() == '\0')) + RAPIDJSON_PARSE_ERROR(kParseErrorUnspecificSyntaxError, is.Tell()); + else if (Consume(is, '*')) { + if (Consume(is, '/')) + break; + } + else + is.Take(); + } + } + else if (RAPIDJSON_LIKELY(Consume(is, '/'))) + while (is.Peek() != '\0' && is.Take() != '\n'); + else + RAPIDJSON_PARSE_ERROR(kParseErrorUnspecificSyntaxError, is.Tell()); + + SkipWhitespace(is); + } + } + } + + // Parse object: { string : value, ... } + template + void ParseObject(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == '{'); + is.Take(); // Skip '{' + + if (RAPIDJSON_UNLIKELY(!handler.StartObject())) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + if (Consume(is, '}')) { + if (RAPIDJSON_UNLIKELY(!handler.EndObject(0))) // empty object + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + } + + for (SizeType memberCount = 0;;) { + if (RAPIDJSON_UNLIKELY(is.Peek() != '"')) + RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissName, is.Tell()); + + ParseString(is, handler, true); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + if (RAPIDJSON_UNLIKELY(!Consume(is, ':'))) + RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissColon, is.Tell()); + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + ParseValue(is, handler); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + ++memberCount; + + switch (is.Peek()) { + case ',': + is.Take(); + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + break; + case '}': + is.Take(); + if (RAPIDJSON_UNLIKELY(!handler.EndObject(memberCount))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + default: + RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, is.Tell()); break; // This useless break is only for making warning and coverage happy + } + + if (parseFlags & kParseTrailingCommasFlag) { + if (is.Peek() == '}') { + if (RAPIDJSON_UNLIKELY(!handler.EndObject(memberCount))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + is.Take(); + return; + } + } + } + } + + // Parse array: [ value, ... ] + template + void ParseArray(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == '['); + is.Take(); // Skip '[' + + if (RAPIDJSON_UNLIKELY(!handler.StartArray())) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + if (Consume(is, ']')) { + if (RAPIDJSON_UNLIKELY(!handler.EndArray(0))) // empty array + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + } + + for (SizeType elementCount = 0;;) { + ParseValue(is, handler); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + ++elementCount; + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + if (Consume(is, ',')) { + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + } + else if (Consume(is, ']')) { + if (RAPIDJSON_UNLIKELY(!handler.EndArray(elementCount))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorArrayMissCommaOrSquareBracket, is.Tell()); + + if (parseFlags & kParseTrailingCommasFlag) { + if (is.Peek() == ']') { + if (RAPIDJSON_UNLIKELY(!handler.EndArray(elementCount))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + is.Take(); + return; + } + } + } + } + + template + void ParseNull(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == 'n'); + is.Take(); + + if (RAPIDJSON_LIKELY(Consume(is, 'u') && Consume(is, 'l') && Consume(is, 'l'))) { + if (RAPIDJSON_UNLIKELY(!handler.Null())) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); + } + + template + void ParseTrue(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == 't'); + is.Take(); + + if (RAPIDJSON_LIKELY(Consume(is, 'r') && Consume(is, 'u') && Consume(is, 'e'))) { + if (RAPIDJSON_UNLIKELY(!handler.Bool(true))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); + } + + template + void ParseFalse(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == 'f'); + is.Take(); + + if (RAPIDJSON_LIKELY(Consume(is, 'a') && Consume(is, 'l') && Consume(is, 's') && Consume(is, 'e'))) { + if (RAPIDJSON_UNLIKELY(!handler.Bool(false))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); + } + + template + RAPIDJSON_FORCEINLINE static bool Consume(InputStream& is, typename InputStream::Ch expect) { + if (RAPIDJSON_LIKELY(is.Peek() == expect)) { + is.Take(); + return true; + } + else + return false; + } + + // Helper function to parse four hexidecimal digits in \uXXXX in ParseString(). + template + unsigned ParseHex4(InputStream& is, size_t escapeOffset) { + unsigned codepoint = 0; + for (int i = 0; i < 4; i++) { + Ch c = is.Peek(); + codepoint <<= 4; + codepoint += static_cast(c); + if (c >= '0' && c <= '9') + codepoint -= '0'; + else if (c >= 'A' && c <= 'F') + codepoint -= 'A' - 10; + else if (c >= 'a' && c <= 'f') + codepoint -= 'a' - 10; + else { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorStringUnicodeEscapeInvalidHex, escapeOffset); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(0); + } + is.Take(); + } + return codepoint; + } + + template + class StackStream { + public: + typedef CharType Ch; + + StackStream(internal::Stack& stack) : stack_(stack), length_(0) {} + RAPIDJSON_FORCEINLINE void Put(Ch c) { + *stack_.template Push() = c; + ++length_; + } + + RAPIDJSON_FORCEINLINE void* Push(SizeType count) { + length_ += count; + return stack_.template Push(count); + } + + size_t Length() const { return length_; } + + Ch* Pop() { + return stack_.template Pop(length_); + } + + private: + StackStream(const StackStream&); + StackStream& operator=(const StackStream&); + + internal::Stack& stack_; + SizeType length_; + }; + + // Parse string and generate String event. Different code paths for kParseInsituFlag. + template + void ParseString(InputStream& is, Handler& handler, bool isKey = false) { + internal::StreamLocalCopy copy(is); + InputStream& s(copy.s); + + RAPIDJSON_ASSERT(s.Peek() == '\"'); + s.Take(); // Skip '\"' + + bool success = false; + if (parseFlags & kParseInsituFlag) { + typename InputStream::Ch *head = s.PutBegin(); + ParseStringToStream(s, s); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + size_t length = s.PutEnd(head) - 1; + RAPIDJSON_ASSERT(length <= 0xFFFFFFFF); + const typename TargetEncoding::Ch* const str = reinterpret_cast(head); + success = (isKey ? handler.Key(str, SizeType(length), false) : handler.String(str, SizeType(length), false)); + } + else { + StackStream stackStream(stack_); + ParseStringToStream(s, stackStream); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + SizeType length = static_cast(stackStream.Length()) - 1; + const typename TargetEncoding::Ch* const str = stackStream.Pop(); + success = (isKey ? handler.Key(str, length, true) : handler.String(str, length, true)); + } + if (RAPIDJSON_UNLIKELY(!success)) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, s.Tell()); + } + + // Parse string to an output is + // This function handles the prefix/suffix double quotes, escaping, and optional encoding validation. + template + RAPIDJSON_FORCEINLINE void ParseStringToStream(InputStream& is, OutputStream& os) { +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + static const char escape[256] = { + Z16, Z16, 0, 0,'\"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'/', + Z16, Z16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'\\', 0, 0, 0, + 0, 0,'\b', 0, 0, 0,'\f', 0, 0, 0, 0, 0, 0, 0,'\n', 0, + 0, 0,'\r', 0,'\t', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16 + }; +#undef Z16 +//!@endcond + + for (;;) { + // Scan and copy string before "\\\"" or < 0x20. This is an optional optimzation. + if (!(parseFlags & kParseValidateEncodingFlag)) + ScanCopyUnescapedString(is, os); + + Ch c = is.Peek(); + if (RAPIDJSON_UNLIKELY(c == '\\')) { // Escape + size_t escapeOffset = is.Tell(); // For invalid escaping, report the inital '\\' as error offset + is.Take(); + Ch e = is.Peek(); + if ((sizeof(Ch) == 1 || unsigned(e) < 256) && RAPIDJSON_LIKELY(escape[static_cast(e)])) { + is.Take(); + os.Put(static_cast(escape[static_cast(e)])); + } + else if (RAPIDJSON_LIKELY(e == 'u')) { // Unicode + is.Take(); + unsigned codepoint = ParseHex4(is, escapeOffset); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + if (RAPIDJSON_UNLIKELY(codepoint >= 0xD800 && codepoint <= 0xDBFF)) { + // Handle UTF-16 surrogate pair + if (RAPIDJSON_UNLIKELY(!Consume(is, '\\') || !Consume(is, 'u'))) + RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, escapeOffset); + unsigned codepoint2 = ParseHex4(is, escapeOffset); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + if (RAPIDJSON_UNLIKELY(codepoint2 < 0xDC00 || codepoint2 > 0xDFFF)) + RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, escapeOffset); + codepoint = (((codepoint - 0xD800) << 10) | (codepoint2 - 0xDC00)) + 0x10000; + } + TEncoding::Encode(os, codepoint); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorStringEscapeInvalid, escapeOffset); + } + else if (RAPIDJSON_UNLIKELY(c == '"')) { // Closing double quote + is.Take(); + os.Put('\0'); // null-terminate the string + return; + } + else if (RAPIDJSON_UNLIKELY(static_cast(c) < 0x20)) { // RFC 4627: unescaped = %x20-21 / %x23-5B / %x5D-10FFFF + if (c == '\0') + RAPIDJSON_PARSE_ERROR(kParseErrorStringMissQuotationMark, is.Tell()); + else + RAPIDJSON_PARSE_ERROR(kParseErrorStringEscapeInvalid, is.Tell()); + } + else { + size_t offset = is.Tell(); + if (RAPIDJSON_UNLIKELY((parseFlags & kParseValidateEncodingFlag ? + !Transcoder::Validate(is, os) : + !Transcoder::Transcode(is, os)))) + RAPIDJSON_PARSE_ERROR(kParseErrorStringInvalidEncoding, offset); + } + } + } + + template + static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(InputStream&, OutputStream&) { + // Do nothing for generic version + } + +#if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) + // StringStream -> StackStream + static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(StringStream& is, StackStream& os) { + const char* p = is.src_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = p; + return; + } + else + os.Put(*p++); + + // The rest of string using SIMD + static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; + static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; + static const char space[16] = { 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19 }; + const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); + const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); + const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); + + for (;; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const __m128i t1 = _mm_cmpeq_epi8(s, dq); + const __m128i t2 = _mm_cmpeq_epi8(s, bs); + const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x19) == 0x19 + const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); + unsigned short r = static_cast(_mm_movemask_epi8(x)); + if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped + SizeType length; + #ifdef _MSC_VER // Find the index of first escaped + unsigned long offset; + _BitScanForward(&offset, r); + length = offset; + #else + length = static_cast(__builtin_ffs(r) - 1); + #endif + char* q = reinterpret_cast(os.Push(length)); + for (size_t i = 0; i < length; i++) + q[i] = p[i]; + + p += length; + break; + } + _mm_storeu_si128(reinterpret_cast<__m128i *>(os.Push(16)), s); + } + + is.src_ = p; + } + + // InsituStringStream -> InsituStringStream + static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(InsituStringStream& is, InsituStringStream& os) { + RAPIDJSON_ASSERT(&is == &os); + (void)os; + + if (is.src_ == is.dst_) { + SkipUnescapedString(is); + return; + } + + char* p = is.src_; + char *q = is.dst_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = p; + is.dst_ = q; + return; + } + else + *q++ = *p++; + + // The rest of string using SIMD + static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; + static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; + static const char space[16] = { 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19 }; + const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); + const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); + const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); + + for (;; p += 16, q += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const __m128i t1 = _mm_cmpeq_epi8(s, dq); + const __m128i t2 = _mm_cmpeq_epi8(s, bs); + const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x19) == 0x19 + const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); + unsigned short r = static_cast(_mm_movemask_epi8(x)); + if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped + size_t length; +#ifdef _MSC_VER // Find the index of first escaped + unsigned long offset; + _BitScanForward(&offset, r); + length = offset; +#else + length = static_cast(__builtin_ffs(r) - 1); +#endif + for (const char* pend = p + length; p != pend; ) + *q++ = *p++; + break; + } + _mm_storeu_si128(reinterpret_cast<__m128i *>(q), s); + } + + is.src_ = p; + is.dst_ = q; + } + + // When read/write pointers are the same for insitu stream, just skip unescaped characters + static RAPIDJSON_FORCEINLINE void SkipUnescapedString(InsituStringStream& is) { + RAPIDJSON_ASSERT(is.src_ == is.dst_); + char* p = is.src_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + for (; p != nextAligned; p++) + if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = is.dst_ = p; + return; + } + + // The rest of string using SIMD + static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; + static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; + static const char space[16] = { 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19 }; + const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); + const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); + const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); + + for (;; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const __m128i t1 = _mm_cmpeq_epi8(s, dq); + const __m128i t2 = _mm_cmpeq_epi8(s, bs); + const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x19) == 0x19 + const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); + unsigned short r = static_cast(_mm_movemask_epi8(x)); + if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped + size_t length; +#ifdef _MSC_VER // Find the index of first escaped + unsigned long offset; + _BitScanForward(&offset, r); + length = offset; +#else + length = static_cast(__builtin_ffs(r) - 1); +#endif + p += length; + break; + } + } + + is.src_ = is.dst_ = p; + } +#endif + + template + class NumberStream; + + template + class NumberStream { + public: + typedef typename InputStream::Ch Ch; + + NumberStream(GenericReader& reader, InputStream& s) : is(s) { (void)reader; } + ~NumberStream() {} + + RAPIDJSON_FORCEINLINE Ch Peek() const { return is.Peek(); } + RAPIDJSON_FORCEINLINE Ch TakePush() { return is.Take(); } + RAPIDJSON_FORCEINLINE Ch Take() { return is.Take(); } + RAPIDJSON_FORCEINLINE void Push(char) {} + + size_t Tell() { return is.Tell(); } + size_t Length() { return 0; } + const char* Pop() { return 0; } + + protected: + NumberStream& operator=(const NumberStream&); + + InputStream& is; + }; + + template + class NumberStream : public NumberStream { + typedef NumberStream Base; + public: + NumberStream(GenericReader& reader, InputStream& is) : Base(reader, is), stackStream(reader.stack_) {} + ~NumberStream() {} + + RAPIDJSON_FORCEINLINE Ch TakePush() { + stackStream.Put(static_cast(Base::is.Peek())); + return Base::is.Take(); + } + + RAPIDJSON_FORCEINLINE void Push(char c) { + stackStream.Put(c); + } + + size_t Length() { return stackStream.Length(); } + + const char* Pop() { + stackStream.Put('\0'); + return stackStream.Pop(); + } + + private: + StackStream stackStream; + }; + + template + class NumberStream : public NumberStream { + typedef NumberStream Base; + public: + NumberStream(GenericReader& reader, InputStream& is) : Base(reader, is) {} + ~NumberStream() {} + + RAPIDJSON_FORCEINLINE Ch Take() { return Base::TakePush(); } + }; + + template + void ParseNumber(InputStream& is, Handler& handler) { + internal::StreamLocalCopy copy(is); + NumberStream s(*this, copy.s); + + size_t startOffset = s.Tell(); + double d = 0.0; + bool useNanOrInf = false; + + // Parse minus + bool minus = Consume(s, '-'); + + // Parse int: zero / ( digit1-9 *DIGIT ) + unsigned i = 0; + uint64_t i64 = 0; + bool use64bit = false; + int significandDigit = 0; + if (RAPIDJSON_UNLIKELY(s.Peek() == '0')) { + i = 0; + s.TakePush(); + } + else if (RAPIDJSON_LIKELY(s.Peek() >= '1' && s.Peek() <= '9')) { + i = static_cast(s.TakePush() - '0'); + + if (minus) + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (RAPIDJSON_UNLIKELY(i >= 214748364)) { // 2^31 = 2147483648 + if (RAPIDJSON_LIKELY(i != 214748364 || s.Peek() > '8')) { + i64 = i; + use64bit = true; + break; + } + } + i = i * 10 + static_cast(s.TakePush() - '0'); + significandDigit++; + } + else + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (RAPIDJSON_UNLIKELY(i >= 429496729)) { // 2^32 - 1 = 4294967295 + if (RAPIDJSON_LIKELY(i != 429496729 || s.Peek() > '5')) { + i64 = i; + use64bit = true; + break; + } + } + i = i * 10 + static_cast(s.TakePush() - '0'); + significandDigit++; + } + } + // Parse NaN or Infinity here + else if ((parseFlags & kParseNanAndInfFlag) && RAPIDJSON_LIKELY((s.Peek() == 'I' || s.Peek() == 'N'))) { + useNanOrInf = true; + if (RAPIDJSON_LIKELY(Consume(s, 'N') && Consume(s, 'a') && Consume(s, 'N'))) { + d = std::numeric_limits::quiet_NaN(); + } + else if (RAPIDJSON_LIKELY(Consume(s, 'I') && Consume(s, 'n') && Consume(s, 'f'))) { + d = (minus ? -std::numeric_limits::infinity() : std::numeric_limits::infinity()); + if (RAPIDJSON_UNLIKELY(s.Peek() == 'i' && !(Consume(s, 'i') && Consume(s, 'n') + && Consume(s, 'i') && Consume(s, 't') && Consume(s, 'y')))) + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); + + // Parse 64bit int + bool useDouble = false; + if (use64bit) { + if (minus) + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (RAPIDJSON_UNLIKELY(i64 >= RAPIDJSON_UINT64_C2(0x0CCCCCCC, 0xCCCCCCCC))) // 2^63 = 9223372036854775808 + if (RAPIDJSON_LIKELY(i64 != RAPIDJSON_UINT64_C2(0x0CCCCCCC, 0xCCCCCCCC) || s.Peek() > '8')) { + d = static_cast(i64); + useDouble = true; + break; + } + i64 = i64 * 10 + static_cast(s.TakePush() - '0'); + significandDigit++; + } + else + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (RAPIDJSON_UNLIKELY(i64 >= RAPIDJSON_UINT64_C2(0x19999999, 0x99999999))) // 2^64 - 1 = 18446744073709551615 + if (RAPIDJSON_LIKELY(i64 != RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) || s.Peek() > '5')) { + d = static_cast(i64); + useDouble = true; + break; + } + i64 = i64 * 10 + static_cast(s.TakePush() - '0'); + significandDigit++; + } + } + + // Force double for big integer + if (useDouble) { + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (RAPIDJSON_UNLIKELY(d >= 1.7976931348623157e307)) // DBL_MAX / 10.0 + RAPIDJSON_PARSE_ERROR(kParseErrorNumberTooBig, startOffset); + d = d * 10 + (s.TakePush() - '0'); + } + } + + // Parse frac = decimal-point 1*DIGIT + int expFrac = 0; + size_t decimalPosition; + if (Consume(s, '.')) { + decimalPosition = s.Length(); + + if (RAPIDJSON_UNLIKELY(!(s.Peek() >= '0' && s.Peek() <= '9'))) + RAPIDJSON_PARSE_ERROR(kParseErrorNumberMissFraction, s.Tell()); + + if (!useDouble) { +#if RAPIDJSON_64BIT + // Use i64 to store significand in 64-bit architecture + if (!use64bit) + i64 = i; + + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (i64 > RAPIDJSON_UINT64_C2(0x1FFFFF, 0xFFFFFFFF)) // 2^53 - 1 for fast path + break; + else { + i64 = i64 * 10 + static_cast(s.TakePush() - '0'); + --expFrac; + if (i64 != 0) + significandDigit++; + } + } + + d = static_cast(i64); +#else + // Use double to store significand in 32-bit architecture + d = static_cast(use64bit ? i64 : i); +#endif + useDouble = true; + } + + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (significandDigit < 17) { + d = d * 10.0 + (s.TakePush() - '0'); + --expFrac; + if (RAPIDJSON_LIKELY(d > 0.0)) + significandDigit++; + } + else + s.TakePush(); + } + } + else + decimalPosition = s.Length(); // decimal position at the end of integer. + + // Parse exp = e [ minus / plus ] 1*DIGIT + int exp = 0; + if (Consume(s, 'e') || Consume(s, 'E')) { + if (!useDouble) { + d = static_cast(use64bit ? i64 : i); + useDouble = true; + } + + bool expMinus = false; + if (Consume(s, '+')) + ; + else if (Consume(s, '-')) + expMinus = true; + + if (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + exp = static_cast(s.Take() - '0'); + if (expMinus) { + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + exp = exp * 10 + static_cast(s.Take() - '0'); + if (exp >= 214748364) { // Issue #313: prevent overflow exponent + while (RAPIDJSON_UNLIKELY(s.Peek() >= '0' && s.Peek() <= '9')) // Consume the rest of exponent + s.Take(); + } + } + } + else { // positive exp + int maxExp = 308 - expFrac; + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + exp = exp * 10 + static_cast(s.Take() - '0'); + if (RAPIDJSON_UNLIKELY(exp > maxExp)) + RAPIDJSON_PARSE_ERROR(kParseErrorNumberTooBig, startOffset); + } + } + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorNumberMissExponent, s.Tell()); + + if (expMinus) + exp = -exp; + } + + // Finish parsing, call event according to the type of number. + bool cont = true; + + if (parseFlags & kParseNumbersAsStringsFlag) { + if (parseFlags & kParseInsituFlag) { + s.Pop(); // Pop stack no matter if it will be used or not. + typename InputStream::Ch* head = is.PutBegin(); + const size_t length = s.Tell() - startOffset; + RAPIDJSON_ASSERT(length <= 0xFFFFFFFF); + // unable to insert the \0 character here, it will erase the comma after this number + const typename TargetEncoding::Ch* const str = reinterpret_cast(head); + cont = handler.RawNumber(str, SizeType(length), false); + } + else { + SizeType numCharsToCopy = static_cast(s.Length()); + StringStream srcStream(s.Pop()); + StackStream dstStream(stack_); + while (numCharsToCopy--) { + Transcoder, TargetEncoding>::Transcode(srcStream, dstStream); + } + dstStream.Put('\0'); + const typename TargetEncoding::Ch* str = dstStream.Pop(); + const SizeType length = static_cast(dstStream.Length()) - 1; + cont = handler.RawNumber(str, SizeType(length), true); + } + } + else { + size_t length = s.Length(); + const char* decimal = s.Pop(); // Pop stack no matter if it will be used or not. + + if (useDouble) { + int p = exp + expFrac; + if (parseFlags & kParseFullPrecisionFlag) + d = internal::StrtodFullPrecision(d, p, decimal, length, decimalPosition, exp); + else + d = internal::StrtodNormalPrecision(d, p); + + cont = handler.Double(minus ? -d : d); + } + else if (useNanOrInf) { + cont = handler.Double(d); + } + else { + if (use64bit) { + if (minus) + cont = handler.Int64(static_cast(~i64 + 1)); + else + cont = handler.Uint64(i64); + } + else { + if (minus) + cont = handler.Int(static_cast(~i + 1)); + else + cont = handler.Uint(i); + } + } + } + if (RAPIDJSON_UNLIKELY(!cont)) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, startOffset); + } + + // Parse any JSON value + template + void ParseValue(InputStream& is, Handler& handler) { + switch (is.Peek()) { + case 'n': ParseNull (is, handler); break; + case 't': ParseTrue (is, handler); break; + case 'f': ParseFalse (is, handler); break; + case '"': ParseString(is, handler); break; + case '{': ParseObject(is, handler); break; + case '[': ParseArray (is, handler); break; + default : + ParseNumber(is, handler); + break; + + } + } + + // Iterative Parsing + + // States + enum IterativeParsingState { + IterativeParsingStartState = 0, + IterativeParsingFinishState, + IterativeParsingErrorState, + + // Object states + IterativeParsingObjectInitialState, + IterativeParsingMemberKeyState, + IterativeParsingKeyValueDelimiterState, + IterativeParsingMemberValueState, + IterativeParsingMemberDelimiterState, + IterativeParsingObjectFinishState, + + // Array states + IterativeParsingArrayInitialState, + IterativeParsingElementState, + IterativeParsingElementDelimiterState, + IterativeParsingArrayFinishState, + + // Single value state + IterativeParsingValueState + }; + + enum { cIterativeParsingStateCount = IterativeParsingValueState + 1 }; + + // Tokens + enum Token { + LeftBracketToken = 0, + RightBracketToken, + + LeftCurlyBracketToken, + RightCurlyBracketToken, + + CommaToken, + ColonToken, + + StringToken, + FalseToken, + TrueToken, + NullToken, + NumberToken, + + kTokenCount + }; + + RAPIDJSON_FORCEINLINE Token Tokenize(Ch c) { + +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#define N NumberToken +#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N + // Maps from ASCII to Token + static const unsigned char tokenMap[256] = { + N16, // 00~0F + N16, // 10~1F + N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F + N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F + N16, // 40~4F + N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F + N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F + N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F + N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF + }; +#undef N +#undef N16 +//!@endcond + + if (sizeof(Ch) == 1 || static_cast(c) < 256) + return static_cast(tokenMap[static_cast(c)]); + else + return NumberToken; + } + + RAPIDJSON_FORCEINLINE IterativeParsingState Predict(IterativeParsingState state, Token token) { + // current state x one lookahead token -> new state + static const char G[cIterativeParsingStateCount][kTokenCount] = { + // Start + { + IterativeParsingArrayInitialState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingValueState, // String + IterativeParsingValueState, // False + IterativeParsingValueState, // True + IterativeParsingValueState, // Null + IterativeParsingValueState // Number + }, + // Finish(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // Error(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // ObjectInitial + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingObjectFinishState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingMemberKeyState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // MemberKey + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingKeyValueDelimiterState, // Colon + IterativeParsingErrorState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // KeyValueDelimiter + { + IterativeParsingArrayInitialState, // Left bracket(push MemberValue state) + IterativeParsingErrorState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket(push MemberValue state) + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingMemberValueState, // String + IterativeParsingMemberValueState, // False + IterativeParsingMemberValueState, // True + IterativeParsingMemberValueState, // Null + IterativeParsingMemberValueState // Number + }, + // MemberValue + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingObjectFinishState, // Right curly bracket + IterativeParsingMemberDelimiterState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingErrorState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // MemberDelimiter + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingObjectFinishState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingMemberKeyState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // ObjectFinish(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // ArrayInitial + { + IterativeParsingArrayInitialState, // Left bracket(push Element state) + IterativeParsingArrayFinishState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket(push Element state) + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingElementState, // String + IterativeParsingElementState, // False + IterativeParsingElementState, // True + IterativeParsingElementState, // Null + IterativeParsingElementState // Number + }, + // Element + { + IterativeParsingErrorState, // Left bracket + IterativeParsingArrayFinishState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingErrorState, // Right curly bracket + IterativeParsingElementDelimiterState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingErrorState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // ElementDelimiter + { + IterativeParsingArrayInitialState, // Left bracket(push Element state) + IterativeParsingArrayFinishState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket(push Element state) + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingElementState, // String + IterativeParsingElementState, // False + IterativeParsingElementState, // True + IterativeParsingElementState, // Null + IterativeParsingElementState // Number + }, + // ArrayFinish(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // Single Value (sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + } + }; // End of G + + return static_cast(G[state][token]); + } + + // Make an advance in the token stream and state based on the candidate destination state which was returned by Transit(). + // May return a new state on state pop. + template + RAPIDJSON_FORCEINLINE IterativeParsingState Transit(IterativeParsingState src, Token token, IterativeParsingState dst, InputStream& is, Handler& handler) { + (void)token; + + switch (dst) { + case IterativeParsingErrorState: + return dst; + + case IterativeParsingObjectInitialState: + case IterativeParsingArrayInitialState: + { + // Push the state(Element or MemeberValue) if we are nested in another array or value of member. + // In this way we can get the correct state on ObjectFinish or ArrayFinish by frame pop. + IterativeParsingState n = src; + if (src == IterativeParsingArrayInitialState || src == IterativeParsingElementDelimiterState) + n = IterativeParsingElementState; + else if (src == IterativeParsingKeyValueDelimiterState) + n = IterativeParsingMemberValueState; + // Push current state. + *stack_.template Push(1) = n; + // Initialize and push the member/element count. + *stack_.template Push(1) = 0; + // Call handler + bool hr = (dst == IterativeParsingObjectInitialState) ? handler.StartObject() : handler.StartArray(); + // On handler short circuits the parsing. + if (!hr) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell()); + return IterativeParsingErrorState; + } + else { + is.Take(); + return dst; + } + } + + case IterativeParsingMemberKeyState: + ParseString(is, handler, true); + if (HasParseError()) + return IterativeParsingErrorState; + else + return dst; + + case IterativeParsingKeyValueDelimiterState: + RAPIDJSON_ASSERT(token == ColonToken); + is.Take(); + return dst; + + case IterativeParsingMemberValueState: + // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. + ParseValue(is, handler); + if (HasParseError()) { + return IterativeParsingErrorState; + } + return dst; + + case IterativeParsingElementState: + // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. + ParseValue(is, handler); + if (HasParseError()) { + return IterativeParsingErrorState; + } + return dst; + + case IterativeParsingMemberDelimiterState: + case IterativeParsingElementDelimiterState: + is.Take(); + // Update member/element count. + *stack_.template Top() = *stack_.template Top() + 1; + return dst; + + case IterativeParsingObjectFinishState: + { + // Transit from delimiter is only allowed when trailing commas are enabled + if (!(parseFlags & kParseTrailingCommasFlag) && src == IterativeParsingMemberDelimiterState) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorObjectMissName, is.Tell()); + return IterativeParsingErrorState; + } + // Get member count. + SizeType c = *stack_.template Pop(1); + // If the object is not empty, count the last member. + if (src == IterativeParsingMemberValueState) + ++c; + // Restore the state. + IterativeParsingState n = static_cast(*stack_.template Pop(1)); + // Transit to Finish state if this is the topmost scope. + if (n == IterativeParsingStartState) + n = IterativeParsingFinishState; + // Call handler + bool hr = handler.EndObject(c); + // On handler short circuits the parsing. + if (!hr) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell()); + return IterativeParsingErrorState; + } + else { + is.Take(); + return n; + } + } + + case IterativeParsingArrayFinishState: + { + // Transit from delimiter is only allowed when trailing commas are enabled + if (!(parseFlags & kParseTrailingCommasFlag) && src == IterativeParsingElementDelimiterState) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorValueInvalid, is.Tell()); + return IterativeParsingErrorState; + } + // Get element count. + SizeType c = *stack_.template Pop(1); + // If the array is not empty, count the last element. + if (src == IterativeParsingElementState) + ++c; + // Restore the state. + IterativeParsingState n = static_cast(*stack_.template Pop(1)); + // Transit to Finish state if this is the topmost scope. + if (n == IterativeParsingStartState) + n = IterativeParsingFinishState; + // Call handler + bool hr = handler.EndArray(c); + // On handler short circuits the parsing. + if (!hr) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell()); + return IterativeParsingErrorState; + } + else { + is.Take(); + return n; + } + } + + default: + // This branch is for IterativeParsingValueState actually. + // Use `default:` rather than + // `case IterativeParsingValueState:` is for code coverage. + + // The IterativeParsingStartState is not enumerated in this switch-case. + // It is impossible for that case. And it can be caught by following assertion. + + // The IterativeParsingFinishState is not enumerated in this switch-case either. + // It is a "derivative" state which cannot triggered from Predict() directly. + // Therefore it cannot happen here. And it can be caught by following assertion. + RAPIDJSON_ASSERT(dst == IterativeParsingValueState); + + // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. + ParseValue(is, handler); + if (HasParseError()) { + return IterativeParsingErrorState; + } + return IterativeParsingFinishState; + } + } + + template + void HandleError(IterativeParsingState src, InputStream& is) { + if (HasParseError()) { + // Error flag has been set. + return; + } + + switch (src) { + case IterativeParsingStartState: RAPIDJSON_PARSE_ERROR(kParseErrorDocumentEmpty, is.Tell()); return; + case IterativeParsingFinishState: RAPIDJSON_PARSE_ERROR(kParseErrorDocumentRootNotSingular, is.Tell()); return; + case IterativeParsingObjectInitialState: + case IterativeParsingMemberDelimiterState: RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissName, is.Tell()); return; + case IterativeParsingMemberKeyState: RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissColon, is.Tell()); return; + case IterativeParsingMemberValueState: RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, is.Tell()); return; + case IterativeParsingKeyValueDelimiterState: + case IterativeParsingArrayInitialState: + case IterativeParsingElementDelimiterState: RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); return; + default: RAPIDJSON_ASSERT(src == IterativeParsingElementState); RAPIDJSON_PARSE_ERROR(kParseErrorArrayMissCommaOrSquareBracket, is.Tell()); return; + } + } + + template + ParseResult IterativeParse(InputStream& is, Handler& handler) { + parseResult_.Clear(); + ClearStackOnExit scope(*this); + IterativeParsingState state = IterativeParsingStartState; + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + while (is.Peek() != '\0') { + Token t = Tokenize(is.Peek()); + IterativeParsingState n = Predict(state, t); + IterativeParsingState d = Transit(state, t, n, is, handler); + + if (d == IterativeParsingErrorState) { + HandleError(state, is); + break; + } + + state = d; + + // Do not further consume streams if a root JSON has been parsed. + if ((parseFlags & kParseStopWhenDoneFlag) && state == IterativeParsingFinishState) + break; + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + } + + // Handle the end of file. + if (state != IterativeParsingFinishState) + HandleError(state, is); + + return parseResult_; + } + + static const size_t kDefaultStackCapacity = 256; //!< Default stack capacity in bytes for storing a single decoded string. + internal::Stack stack_; //!< A stack for storing decoded string temporarily during non-destructive parsing. + ParseResult parseResult_; +}; // class GenericReader + +//! Reader with UTF8 encoding and default allocator. +typedef GenericReader, UTF8<> > Reader; + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_READER_H_ diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/schema.h b/Externals/discord-rpc/thirdparty/include/rapidjson/schema.h new file mode 100644 index 0000000000..b182aa27f0 --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/schema.h @@ -0,0 +1,2006 @@ +// Tencent is pleased to support the open source community by making RapidJSON available-> +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip-> All rights reserved-> +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License-> You may obtain a copy of the License at +// +// http://opensource->org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied-> See the License for the +// specific language governing permissions and limitations under the License-> + +#ifndef RAPIDJSON_SCHEMA_H_ +#define RAPIDJSON_SCHEMA_H_ + +#include "document.h" +#include "pointer.h" +#include // abs, floor + +#if !defined(RAPIDJSON_SCHEMA_USE_INTERNALREGEX) +#define RAPIDJSON_SCHEMA_USE_INTERNALREGEX 1 +#else +#define RAPIDJSON_SCHEMA_USE_INTERNALREGEX 0 +#endif + +#if !RAPIDJSON_SCHEMA_USE_INTERNALREGEX && !defined(RAPIDJSON_SCHEMA_USE_STDREGEX) && (__cplusplus >=201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)) +#define RAPIDJSON_SCHEMA_USE_STDREGEX 1 +#else +#define RAPIDJSON_SCHEMA_USE_STDREGEX 0 +#endif + +#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX +#include "internal/regex.h" +#elif RAPIDJSON_SCHEMA_USE_STDREGEX +#include +#endif + +#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX || RAPIDJSON_SCHEMA_USE_STDREGEX +#define RAPIDJSON_SCHEMA_HAS_REGEX 1 +#else +#define RAPIDJSON_SCHEMA_HAS_REGEX 0 +#endif + +#ifndef RAPIDJSON_SCHEMA_VERBOSE +#define RAPIDJSON_SCHEMA_VERBOSE 0 +#endif + +#if RAPIDJSON_SCHEMA_VERBOSE +#include "stringbuffer.h" +#endif + +RAPIDJSON_DIAG_PUSH + +#if defined(__GNUC__) +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_OFF(weak-vtables) +RAPIDJSON_DIAG_OFF(exit-time-destructors) +RAPIDJSON_DIAG_OFF(c++98-compat-pedantic) +RAPIDJSON_DIAG_OFF(variadic-macros) +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// Verbose Utilities + +#if RAPIDJSON_SCHEMA_VERBOSE + +namespace internal { + +inline void PrintInvalidKeyword(const char* keyword) { + printf("Fail keyword: %s\n", keyword); +} + +inline void PrintInvalidKeyword(const wchar_t* keyword) { + wprintf(L"Fail keyword: %ls\n", keyword); +} + +inline void PrintInvalidDocument(const char* document) { + printf("Fail document: %s\n\n", document); +} + +inline void PrintInvalidDocument(const wchar_t* document) { + wprintf(L"Fail document: %ls\n\n", document); +} + +inline void PrintValidatorPointers(unsigned depth, const char* s, const char* d) { + printf("S: %*s%s\nD: %*s%s\n\n", depth * 4, " ", s, depth * 4, " ", d); +} + +inline void PrintValidatorPointers(unsigned depth, const wchar_t* s, const wchar_t* d) { + wprintf(L"S: %*ls%ls\nD: %*ls%ls\n\n", depth * 4, L" ", s, depth * 4, L" ", d); +} + +} // namespace internal + +#endif // RAPIDJSON_SCHEMA_VERBOSE + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_INVALID_KEYWORD_RETURN + +#if RAPIDJSON_SCHEMA_VERBOSE +#define RAPIDJSON_INVALID_KEYWORD_VERBOSE(keyword) internal::PrintInvalidKeyword(keyword) +#else +#define RAPIDJSON_INVALID_KEYWORD_VERBOSE(keyword) +#endif + +#define RAPIDJSON_INVALID_KEYWORD_RETURN(keyword)\ +RAPIDJSON_MULTILINEMACRO_BEGIN\ + context.invalidKeyword = keyword.GetString();\ + RAPIDJSON_INVALID_KEYWORD_VERBOSE(keyword.GetString());\ + return false;\ +RAPIDJSON_MULTILINEMACRO_END + +/////////////////////////////////////////////////////////////////////////////// +// Forward declarations + +template +class GenericSchemaDocument; + +namespace internal { + +template +class Schema; + +/////////////////////////////////////////////////////////////////////////////// +// ISchemaValidator + +class ISchemaValidator { +public: + virtual ~ISchemaValidator() {} + virtual bool IsValid() const = 0; +}; + +/////////////////////////////////////////////////////////////////////////////// +// ISchemaStateFactory + +template +class ISchemaStateFactory { +public: + virtual ~ISchemaStateFactory() {} + virtual ISchemaValidator* CreateSchemaValidator(const SchemaType&) = 0; + virtual void DestroySchemaValidator(ISchemaValidator* validator) = 0; + virtual void* CreateHasher() = 0; + virtual uint64_t GetHashCode(void* hasher) = 0; + virtual void DestroryHasher(void* hasher) = 0; + virtual void* MallocState(size_t size) = 0; + virtual void FreeState(void* p) = 0; +}; + +/////////////////////////////////////////////////////////////////////////////// +// Hasher + +// For comparison of compound value +template +class Hasher { +public: + typedef typename Encoding::Ch Ch; + + Hasher(Allocator* allocator = 0, size_t stackCapacity = kDefaultSize) : stack_(allocator, stackCapacity) {} + + bool Null() { return WriteType(kNullType); } + bool Bool(bool b) { return WriteType(b ? kTrueType : kFalseType); } + bool Int(int i) { Number n; n.u.i = i; n.d = static_cast(i); return WriteNumber(n); } + bool Uint(unsigned u) { Number n; n.u.u = u; n.d = static_cast(u); return WriteNumber(n); } + bool Int64(int64_t i) { Number n; n.u.i = i; n.d = static_cast(i); return WriteNumber(n); } + bool Uint64(uint64_t u) { Number n; n.u.u = u; n.d = static_cast(u); return WriteNumber(n); } + bool Double(double d) { + Number n; + if (d < 0) n.u.i = static_cast(d); + else n.u.u = static_cast(d); + n.d = d; + return WriteNumber(n); + } + + bool RawNumber(const Ch* str, SizeType len, bool) { + WriteBuffer(kNumberType, str, len * sizeof(Ch)); + return true; + } + + bool String(const Ch* str, SizeType len, bool) { + WriteBuffer(kStringType, str, len * sizeof(Ch)); + return true; + } + + bool StartObject() { return true; } + bool Key(const Ch* str, SizeType len, bool copy) { return String(str, len, copy); } + bool EndObject(SizeType memberCount) { + uint64_t h = Hash(0, kObjectType); + uint64_t* kv = stack_.template Pop(memberCount * 2); + for (SizeType i = 0; i < memberCount; i++) + h ^= Hash(kv[i * 2], kv[i * 2 + 1]); // Use xor to achieve member order insensitive + *stack_.template Push() = h; + return true; + } + + bool StartArray() { return true; } + bool EndArray(SizeType elementCount) { + uint64_t h = Hash(0, kArrayType); + uint64_t* e = stack_.template Pop(elementCount); + for (SizeType i = 0; i < elementCount; i++) + h = Hash(h, e[i]); // Use hash to achieve element order sensitive + *stack_.template Push() = h; + return true; + } + + bool IsValid() const { return stack_.GetSize() == sizeof(uint64_t); } + + uint64_t GetHashCode() const { + RAPIDJSON_ASSERT(IsValid()); + return *stack_.template Top(); + } + +private: + static const size_t kDefaultSize = 256; + struct Number { + union U { + uint64_t u; + int64_t i; + }u; + double d; + }; + + bool WriteType(Type type) { return WriteBuffer(type, 0, 0); } + + bool WriteNumber(const Number& n) { return WriteBuffer(kNumberType, &n, sizeof(n)); } + + bool WriteBuffer(Type type, const void* data, size_t len) { + // FNV-1a from http://isthe.com/chongo/tech/comp/fnv/ + uint64_t h = Hash(RAPIDJSON_UINT64_C2(0x84222325, 0xcbf29ce4), type); + const unsigned char* d = static_cast(data); + for (size_t i = 0; i < len; i++) + h = Hash(h, d[i]); + *stack_.template Push() = h; + return true; + } + + static uint64_t Hash(uint64_t h, uint64_t d) { + static const uint64_t kPrime = RAPIDJSON_UINT64_C2(0x00000100, 0x000001b3); + h ^= d; + h *= kPrime; + return h; + } + + Stack stack_; +}; + +/////////////////////////////////////////////////////////////////////////////// +// SchemaValidationContext + +template +struct SchemaValidationContext { + typedef Schema SchemaType; + typedef ISchemaStateFactory SchemaValidatorFactoryType; + typedef typename SchemaType::ValueType ValueType; + typedef typename ValueType::Ch Ch; + + enum PatternValidatorType { + kPatternValidatorOnly, + kPatternValidatorWithProperty, + kPatternValidatorWithAdditionalProperty + }; + + SchemaValidationContext(SchemaValidatorFactoryType& f, const SchemaType* s) : + factory(f), + schema(s), + valueSchema(), + invalidKeyword(), + hasher(), + arrayElementHashCodes(), + validators(), + validatorCount(), + patternPropertiesValidators(), + patternPropertiesValidatorCount(), + patternPropertiesSchemas(), + patternPropertiesSchemaCount(), + valuePatternValidatorType(kPatternValidatorOnly), + propertyExist(), + inArray(false), + valueUniqueness(false), + arrayUniqueness(false) + { + } + + ~SchemaValidationContext() { + if (hasher) + factory.DestroryHasher(hasher); + if (validators) { + for (SizeType i = 0; i < validatorCount; i++) + factory.DestroySchemaValidator(validators[i]); + factory.FreeState(validators); + } + if (patternPropertiesValidators) { + for (SizeType i = 0; i < patternPropertiesValidatorCount; i++) + factory.DestroySchemaValidator(patternPropertiesValidators[i]); + factory.FreeState(patternPropertiesValidators); + } + if (patternPropertiesSchemas) + factory.FreeState(patternPropertiesSchemas); + if (propertyExist) + factory.FreeState(propertyExist); + } + + SchemaValidatorFactoryType& factory; + const SchemaType* schema; + const SchemaType* valueSchema; + const Ch* invalidKeyword; + void* hasher; // Only validator access + void* arrayElementHashCodes; // Only validator access this + ISchemaValidator** validators; + SizeType validatorCount; + ISchemaValidator** patternPropertiesValidators; + SizeType patternPropertiesValidatorCount; + const SchemaType** patternPropertiesSchemas; + SizeType patternPropertiesSchemaCount; + PatternValidatorType valuePatternValidatorType; + PatternValidatorType objectPatternValidatorType; + SizeType arrayElementIndex; + bool* propertyExist; + bool inArray; + bool valueUniqueness; + bool arrayUniqueness; +}; + +/////////////////////////////////////////////////////////////////////////////// +// Schema + +template +class Schema { +public: + typedef typename SchemaDocumentType::ValueType ValueType; + typedef typename SchemaDocumentType::AllocatorType AllocatorType; + typedef typename SchemaDocumentType::PointerType PointerType; + typedef typename ValueType::EncodingType EncodingType; + typedef typename EncodingType::Ch Ch; + typedef SchemaValidationContext Context; + typedef Schema SchemaType; + typedef GenericValue SValue; + friend class GenericSchemaDocument; + + Schema(SchemaDocumentType* schemaDocument, const PointerType& p, const ValueType& value, const ValueType& document, AllocatorType* allocator) : + allocator_(allocator), + enum_(), + enumCount_(), + not_(), + type_((1 << kTotalSchemaType) - 1), // typeless + validatorCount_(), + properties_(), + additionalPropertiesSchema_(), + patternProperties_(), + patternPropertyCount_(), + propertyCount_(), + minProperties_(), + maxProperties_(SizeType(~0)), + additionalProperties_(true), + hasDependencies_(), + hasRequired_(), + hasSchemaDependencies_(), + additionalItemsSchema_(), + itemsList_(), + itemsTuple_(), + itemsTupleCount_(), + minItems_(), + maxItems_(SizeType(~0)), + additionalItems_(true), + uniqueItems_(false), + pattern_(), + minLength_(0), + maxLength_(~SizeType(0)), + exclusiveMinimum_(false), + exclusiveMaximum_(false) + { + typedef typename SchemaDocumentType::ValueType ValueType; + typedef typename ValueType::ConstValueIterator ConstValueIterator; + typedef typename ValueType::ConstMemberIterator ConstMemberIterator; + + if (!value.IsObject()) + return; + + if (const ValueType* v = GetMember(value, GetTypeString())) { + type_ = 0; + if (v->IsString()) + AddType(*v); + else if (v->IsArray()) + for (ConstValueIterator itr = v->Begin(); itr != v->End(); ++itr) + AddType(*itr); + } + + if (const ValueType* v = GetMember(value, GetEnumString())) + if (v->IsArray() && v->Size() > 0) { + enum_ = static_cast(allocator_->Malloc(sizeof(uint64_t) * v->Size())); + for (ConstValueIterator itr = v->Begin(); itr != v->End(); ++itr) { + typedef Hasher > EnumHasherType; + char buffer[256 + 24]; + MemoryPoolAllocator<> hasherAllocator(buffer, sizeof(buffer)); + EnumHasherType h(&hasherAllocator, 256); + itr->Accept(h); + enum_[enumCount_++] = h.GetHashCode(); + } + } + + if (schemaDocument) { + AssignIfExist(allOf_, *schemaDocument, p, value, GetAllOfString(), document); + AssignIfExist(anyOf_, *schemaDocument, p, value, GetAnyOfString(), document); + AssignIfExist(oneOf_, *schemaDocument, p, value, GetOneOfString(), document); + } + + if (const ValueType* v = GetMember(value, GetNotString())) { + schemaDocument->CreateSchema(¬_, p.Append(GetNotString(), allocator_), *v, document); + notValidatorIndex_ = validatorCount_; + validatorCount_++; + } + + // Object + + const ValueType* properties = GetMember(value, GetPropertiesString()); + const ValueType* required = GetMember(value, GetRequiredString()); + const ValueType* dependencies = GetMember(value, GetDependenciesString()); + { + // Gather properties from properties/required/dependencies + SValue allProperties(kArrayType); + + if (properties && properties->IsObject()) + for (ConstMemberIterator itr = properties->MemberBegin(); itr != properties->MemberEnd(); ++itr) + AddUniqueElement(allProperties, itr->name); + + if (required && required->IsArray()) + for (ConstValueIterator itr = required->Begin(); itr != required->End(); ++itr) + if (itr->IsString()) + AddUniqueElement(allProperties, *itr); + + if (dependencies && dependencies->IsObject()) + for (ConstMemberIterator itr = dependencies->MemberBegin(); itr != dependencies->MemberEnd(); ++itr) { + AddUniqueElement(allProperties, itr->name); + if (itr->value.IsArray()) + for (ConstValueIterator i = itr->value.Begin(); i != itr->value.End(); ++i) + if (i->IsString()) + AddUniqueElement(allProperties, *i); + } + + if (allProperties.Size() > 0) { + propertyCount_ = allProperties.Size(); + properties_ = static_cast(allocator_->Malloc(sizeof(Property) * propertyCount_)); + for (SizeType i = 0; i < propertyCount_; i++) { + new (&properties_[i]) Property(); + properties_[i].name = allProperties[i]; + properties_[i].schema = GetTypeless(); + } + } + } + + if (properties && properties->IsObject()) { + PointerType q = p.Append(GetPropertiesString(), allocator_); + for (ConstMemberIterator itr = properties->MemberBegin(); itr != properties->MemberEnd(); ++itr) { + SizeType index; + if (FindPropertyIndex(itr->name, &index)) + schemaDocument->CreateSchema(&properties_[index].schema, q.Append(itr->name, allocator_), itr->value, document); + } + } + + if (const ValueType* v = GetMember(value, GetPatternPropertiesString())) { + PointerType q = p.Append(GetPatternPropertiesString(), allocator_); + patternProperties_ = static_cast(allocator_->Malloc(sizeof(PatternProperty) * v->MemberCount())); + patternPropertyCount_ = 0; + + for (ConstMemberIterator itr = v->MemberBegin(); itr != v->MemberEnd(); ++itr) { + new (&patternProperties_[patternPropertyCount_]) PatternProperty(); + patternProperties_[patternPropertyCount_].pattern = CreatePattern(itr->name); + schemaDocument->CreateSchema(&patternProperties_[patternPropertyCount_].schema, q.Append(itr->name, allocator_), itr->value, document); + patternPropertyCount_++; + } + } + + if (required && required->IsArray()) + for (ConstValueIterator itr = required->Begin(); itr != required->End(); ++itr) + if (itr->IsString()) { + SizeType index; + if (FindPropertyIndex(*itr, &index)) { + properties_[index].required = true; + hasRequired_ = true; + } + } + + if (dependencies && dependencies->IsObject()) { + PointerType q = p.Append(GetDependenciesString(), allocator_); + hasDependencies_ = true; + for (ConstMemberIterator itr = dependencies->MemberBegin(); itr != dependencies->MemberEnd(); ++itr) { + SizeType sourceIndex; + if (FindPropertyIndex(itr->name, &sourceIndex)) { + if (itr->value.IsArray()) { + properties_[sourceIndex].dependencies = static_cast(allocator_->Malloc(sizeof(bool) * propertyCount_)); + std::memset(properties_[sourceIndex].dependencies, 0, sizeof(bool)* propertyCount_); + for (ConstValueIterator targetItr = itr->value.Begin(); targetItr != itr->value.End(); ++targetItr) { + SizeType targetIndex; + if (FindPropertyIndex(*targetItr, &targetIndex)) + properties_[sourceIndex].dependencies[targetIndex] = true; + } + } + else if (itr->value.IsObject()) { + hasSchemaDependencies_ = true; + schemaDocument->CreateSchema(&properties_[sourceIndex].dependenciesSchema, q.Append(itr->name, allocator_), itr->value, document); + properties_[sourceIndex].dependenciesValidatorIndex = validatorCount_; + validatorCount_++; + } + } + } + } + + if (const ValueType* v = GetMember(value, GetAdditionalPropertiesString())) { + if (v->IsBool()) + additionalProperties_ = v->GetBool(); + else if (v->IsObject()) + schemaDocument->CreateSchema(&additionalPropertiesSchema_, p.Append(GetAdditionalPropertiesString(), allocator_), *v, document); + } + + AssignIfExist(minProperties_, value, GetMinPropertiesString()); + AssignIfExist(maxProperties_, value, GetMaxPropertiesString()); + + // Array + if (const ValueType* v = GetMember(value, GetItemsString())) { + PointerType q = p.Append(GetItemsString(), allocator_); + if (v->IsObject()) // List validation + schemaDocument->CreateSchema(&itemsList_, q, *v, document); + else if (v->IsArray()) { // Tuple validation + itemsTuple_ = static_cast(allocator_->Malloc(sizeof(const Schema*) * v->Size())); + SizeType index = 0; + for (ConstValueIterator itr = v->Begin(); itr != v->End(); ++itr, index++) + schemaDocument->CreateSchema(&itemsTuple_[itemsTupleCount_++], q.Append(index, allocator_), *itr, document); + } + } + + AssignIfExist(minItems_, value, GetMinItemsString()); + AssignIfExist(maxItems_, value, GetMaxItemsString()); + + if (const ValueType* v = GetMember(value, GetAdditionalItemsString())) { + if (v->IsBool()) + additionalItems_ = v->GetBool(); + else if (v->IsObject()) + schemaDocument->CreateSchema(&additionalItemsSchema_, p.Append(GetAdditionalItemsString(), allocator_), *v, document); + } + + AssignIfExist(uniqueItems_, value, GetUniqueItemsString()); + + // String + AssignIfExist(minLength_, value, GetMinLengthString()); + AssignIfExist(maxLength_, value, GetMaxLengthString()); + + if (const ValueType* v = GetMember(value, GetPatternString())) + pattern_ = CreatePattern(*v); + + // Number + if (const ValueType* v = GetMember(value, GetMinimumString())) + if (v->IsNumber()) + minimum_.CopyFrom(*v, *allocator_); + + if (const ValueType* v = GetMember(value, GetMaximumString())) + if (v->IsNumber()) + maximum_.CopyFrom(*v, *allocator_); + + AssignIfExist(exclusiveMinimum_, value, GetExclusiveMinimumString()); + AssignIfExist(exclusiveMaximum_, value, GetExclusiveMaximumString()); + + if (const ValueType* v = GetMember(value, GetMultipleOfString())) + if (v->IsNumber() && v->GetDouble() > 0.0) + multipleOf_.CopyFrom(*v, *allocator_); + } + + ~Schema() { + if (allocator_) { + allocator_->Free(enum_); + } + if (properties_) { + for (SizeType i = 0; i < propertyCount_; i++) + properties_[i].~Property(); + AllocatorType::Free(properties_); + } + if (patternProperties_) { + for (SizeType i = 0; i < patternPropertyCount_; i++) + patternProperties_[i].~PatternProperty(); + AllocatorType::Free(patternProperties_); + } + AllocatorType::Free(itemsTuple_); +#if RAPIDJSON_SCHEMA_HAS_REGEX + if (pattern_) { + pattern_->~RegexType(); + allocator_->Free(pattern_); + } +#endif + } + + bool BeginValue(Context& context) const { + if (context.inArray) { + if (uniqueItems_) + context.valueUniqueness = true; + + if (itemsList_) + context.valueSchema = itemsList_; + else if (itemsTuple_) { + if (context.arrayElementIndex < itemsTupleCount_) + context.valueSchema = itemsTuple_[context.arrayElementIndex]; + else if (additionalItemsSchema_) + context.valueSchema = additionalItemsSchema_; + else if (additionalItems_) + context.valueSchema = GetTypeless(); + else + RAPIDJSON_INVALID_KEYWORD_RETURN(GetItemsString()); + } + else + context.valueSchema = GetTypeless(); + + context.arrayElementIndex++; + } + return true; + } + + RAPIDJSON_FORCEINLINE bool EndValue(Context& context) const { + if (context.patternPropertiesValidatorCount > 0) { + bool otherValid = false; + SizeType count = context.patternPropertiesValidatorCount; + if (context.objectPatternValidatorType != Context::kPatternValidatorOnly) + otherValid = context.patternPropertiesValidators[--count]->IsValid(); + + bool patternValid = true; + for (SizeType i = 0; i < count; i++) + if (!context.patternPropertiesValidators[i]->IsValid()) { + patternValid = false; + break; + } + + if (context.objectPatternValidatorType == Context::kPatternValidatorOnly) { + if (!patternValid) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternPropertiesString()); + } + else if (context.objectPatternValidatorType == Context::kPatternValidatorWithProperty) { + if (!patternValid || !otherValid) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternPropertiesString()); + } + else if (!patternValid && !otherValid) // kPatternValidatorWithAdditionalProperty) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternPropertiesString()); + } + + if (enum_) { + const uint64_t h = context.factory.GetHashCode(context.hasher); + for (SizeType i = 0; i < enumCount_; i++) + if (enum_[i] == h) + goto foundEnum; + RAPIDJSON_INVALID_KEYWORD_RETURN(GetEnumString()); + foundEnum:; + } + + if (allOf_.schemas) + for (SizeType i = allOf_.begin; i < allOf_.begin + allOf_.count; i++) + if (!context.validators[i]->IsValid()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetAllOfString()); + + if (anyOf_.schemas) { + for (SizeType i = anyOf_.begin; i < anyOf_.begin + anyOf_.count; i++) + if (context.validators[i]->IsValid()) + goto foundAny; + RAPIDJSON_INVALID_KEYWORD_RETURN(GetAnyOfString()); + foundAny:; + } + + if (oneOf_.schemas) { + bool oneValid = false; + for (SizeType i = oneOf_.begin; i < oneOf_.begin + oneOf_.count; i++) + if (context.validators[i]->IsValid()) { + if (oneValid) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetOneOfString()); + else + oneValid = true; + } + if (!oneValid) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetOneOfString()); + } + + if (not_ && context.validators[notValidatorIndex_]->IsValid()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetNotString()); + + return true; + } + + bool Null(Context& context) const { + if (!(type_ & (1 << kNullSchemaType))) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + return CreateParallelValidator(context); + } + + bool Bool(Context& context, bool) const { + if (!(type_ & (1 << kBooleanSchemaType))) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + return CreateParallelValidator(context); + } + + bool Int(Context& context, int i) const { + if (!CheckInt(context, i)) + return false; + return CreateParallelValidator(context); + } + + bool Uint(Context& context, unsigned u) const { + if (!CheckUint(context, u)) + return false; + return CreateParallelValidator(context); + } + + bool Int64(Context& context, int64_t i) const { + if (!CheckInt(context, i)) + return false; + return CreateParallelValidator(context); + } + + bool Uint64(Context& context, uint64_t u) const { + if (!CheckUint(context, u)) + return false; + return CreateParallelValidator(context); + } + + bool Double(Context& context, double d) const { + if (!(type_ & (1 << kNumberSchemaType))) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + + if (!minimum_.IsNull() && !CheckDoubleMinimum(context, d)) + return false; + + if (!maximum_.IsNull() && !CheckDoubleMaximum(context, d)) + return false; + + if (!multipleOf_.IsNull() && !CheckDoubleMultipleOf(context, d)) + return false; + + return CreateParallelValidator(context); + } + + bool String(Context& context, const Ch* str, SizeType length, bool) const { + if (!(type_ & (1 << kStringSchemaType))) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + + if (minLength_ != 0 || maxLength_ != SizeType(~0)) { + SizeType count; + if (internal::CountStringCodePoint(str, length, &count)) { + if (count < minLength_) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinLengthString()); + if (count > maxLength_) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaxLengthString()); + } + } + + if (pattern_ && !IsPatternMatch(pattern_, str, length)) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternString()); + + return CreateParallelValidator(context); + } + + bool StartObject(Context& context) const { + if (!(type_ & (1 << kObjectSchemaType))) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + + if (hasDependencies_ || hasRequired_) { + context.propertyExist = static_cast(context.factory.MallocState(sizeof(bool) * propertyCount_)); + std::memset(context.propertyExist, 0, sizeof(bool) * propertyCount_); + } + + if (patternProperties_) { // pre-allocate schema array + SizeType count = patternPropertyCount_ + 1; // extra for valuePatternValidatorType + context.patternPropertiesSchemas = static_cast(context.factory.MallocState(sizeof(const SchemaType*) * count)); + context.patternPropertiesSchemaCount = 0; + std::memset(context.patternPropertiesSchemas, 0, sizeof(SchemaType*) * count); + } + + return CreateParallelValidator(context); + } + + bool Key(Context& context, const Ch* str, SizeType len, bool) const { + if (patternProperties_) { + context.patternPropertiesSchemaCount = 0; + for (SizeType i = 0; i < patternPropertyCount_; i++) + if (patternProperties_[i].pattern && IsPatternMatch(patternProperties_[i].pattern, str, len)) + context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = patternProperties_[i].schema; + } + + SizeType index; + if (FindPropertyIndex(ValueType(str, len).Move(), &index)) { + if (context.patternPropertiesSchemaCount > 0) { + context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = properties_[index].schema; + context.valueSchema = GetTypeless(); + context.valuePatternValidatorType = Context::kPatternValidatorWithProperty; + } + else + context.valueSchema = properties_[index].schema; + + if (context.propertyExist) + context.propertyExist[index] = true; + + return true; + } + + if (additionalPropertiesSchema_) { + if (additionalPropertiesSchema_ && context.patternPropertiesSchemaCount > 0) { + context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = additionalPropertiesSchema_; + context.valueSchema = GetTypeless(); + context.valuePatternValidatorType = Context::kPatternValidatorWithAdditionalProperty; + } + else + context.valueSchema = additionalPropertiesSchema_; + return true; + } + else if (additionalProperties_) { + context.valueSchema = GetTypeless(); + return true; + } + + if (context.patternPropertiesSchemaCount == 0) // patternProperties are not additional properties + RAPIDJSON_INVALID_KEYWORD_RETURN(GetAdditionalPropertiesString()); + + return true; + } + + bool EndObject(Context& context, SizeType memberCount) const { + if (hasRequired_) + for (SizeType index = 0; index < propertyCount_; index++) + if (properties_[index].required) + if (!context.propertyExist[index]) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetRequiredString()); + + if (memberCount < minProperties_) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinPropertiesString()); + + if (memberCount > maxProperties_) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaxPropertiesString()); + + if (hasDependencies_) { + for (SizeType sourceIndex = 0; sourceIndex < propertyCount_; sourceIndex++) + if (context.propertyExist[sourceIndex]) { + if (properties_[sourceIndex].dependencies) { + for (SizeType targetIndex = 0; targetIndex < propertyCount_; targetIndex++) + if (properties_[sourceIndex].dependencies[targetIndex] && !context.propertyExist[targetIndex]) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetDependenciesString()); + } + else if (properties_[sourceIndex].dependenciesSchema) + if (!context.validators[properties_[sourceIndex].dependenciesValidatorIndex]->IsValid()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetDependenciesString()); + } + } + + return true; + } + + bool StartArray(Context& context) const { + if (!(type_ & (1 << kArraySchemaType))) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + + context.arrayElementIndex = 0; + context.inArray = true; + + return CreateParallelValidator(context); + } + + bool EndArray(Context& context, SizeType elementCount) const { + context.inArray = false; + + if (elementCount < minItems_) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinItemsString()); + + if (elementCount > maxItems_) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaxItemsString()); + + return true; + } + + // Generate functions for string literal according to Ch +#define RAPIDJSON_STRING_(name, ...) \ + static const ValueType& Get##name##String() {\ + static const Ch s[] = { __VA_ARGS__, '\0' };\ + static const ValueType v(s, sizeof(s) / sizeof(Ch) - 1);\ + return v;\ + } + + RAPIDJSON_STRING_(Null, 'n', 'u', 'l', 'l') + RAPIDJSON_STRING_(Boolean, 'b', 'o', 'o', 'l', 'e', 'a', 'n') + RAPIDJSON_STRING_(Object, 'o', 'b', 'j', 'e', 'c', 't') + RAPIDJSON_STRING_(Array, 'a', 'r', 'r', 'a', 'y') + RAPIDJSON_STRING_(String, 's', 't', 'r', 'i', 'n', 'g') + RAPIDJSON_STRING_(Number, 'n', 'u', 'm', 'b', 'e', 'r') + RAPIDJSON_STRING_(Integer, 'i', 'n', 't', 'e', 'g', 'e', 'r') + RAPIDJSON_STRING_(Type, 't', 'y', 'p', 'e') + RAPIDJSON_STRING_(Enum, 'e', 'n', 'u', 'm') + RAPIDJSON_STRING_(AllOf, 'a', 'l', 'l', 'O', 'f') + RAPIDJSON_STRING_(AnyOf, 'a', 'n', 'y', 'O', 'f') + RAPIDJSON_STRING_(OneOf, 'o', 'n', 'e', 'O', 'f') + RAPIDJSON_STRING_(Not, 'n', 'o', 't') + RAPIDJSON_STRING_(Properties, 'p', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(Required, 'r', 'e', 'q', 'u', 'i', 'r', 'e', 'd') + RAPIDJSON_STRING_(Dependencies, 'd', 'e', 'p', 'e', 'n', 'd', 'e', 'n', 'c', 'i', 'e', 's') + RAPIDJSON_STRING_(PatternProperties, 'p', 'a', 't', 't', 'e', 'r', 'n', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(AdditionalProperties, 'a', 'd', 'd', 'i', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(MinProperties, 'm', 'i', 'n', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(MaxProperties, 'm', 'a', 'x', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(Items, 'i', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(MinItems, 'm', 'i', 'n', 'I', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(MaxItems, 'm', 'a', 'x', 'I', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(AdditionalItems, 'a', 'd', 'd', 'i', 't', 'i', 'o', 'n', 'a', 'l', 'I', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(UniqueItems, 'u', 'n', 'i', 'q', 'u', 'e', 'I', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(MinLength, 'm', 'i', 'n', 'L', 'e', 'n', 'g', 't', 'h') + RAPIDJSON_STRING_(MaxLength, 'm', 'a', 'x', 'L', 'e', 'n', 'g', 't', 'h') + RAPIDJSON_STRING_(Pattern, 'p', 'a', 't', 't', 'e', 'r', 'n') + RAPIDJSON_STRING_(Minimum, 'm', 'i', 'n', 'i', 'm', 'u', 'm') + RAPIDJSON_STRING_(Maximum, 'm', 'a', 'x', 'i', 'm', 'u', 'm') + RAPIDJSON_STRING_(ExclusiveMinimum, 'e', 'x', 'c', 'l', 'u', 's', 'i', 'v', 'e', 'M', 'i', 'n', 'i', 'm', 'u', 'm') + RAPIDJSON_STRING_(ExclusiveMaximum, 'e', 'x', 'c', 'l', 'u', 's', 'i', 'v', 'e', 'M', 'a', 'x', 'i', 'm', 'u', 'm') + RAPIDJSON_STRING_(MultipleOf, 'm', 'u', 'l', 't', 'i', 'p', 'l', 'e', 'O', 'f') + +#undef RAPIDJSON_STRING_ + +private: + enum SchemaValueType { + kNullSchemaType, + kBooleanSchemaType, + kObjectSchemaType, + kArraySchemaType, + kStringSchemaType, + kNumberSchemaType, + kIntegerSchemaType, + kTotalSchemaType + }; + +#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX + typedef internal::GenericRegex RegexType; +#elif RAPIDJSON_SCHEMA_USE_STDREGEX + typedef std::basic_regex RegexType; +#else + typedef char RegexType; +#endif + + struct SchemaArray { + SchemaArray() : schemas(), count() {} + ~SchemaArray() { AllocatorType::Free(schemas); } + const SchemaType** schemas; + SizeType begin; // begin index of context.validators + SizeType count; + }; + + static const SchemaType* GetTypeless() { + static SchemaType typeless(0, PointerType(), ValueType(kObjectType).Move(), ValueType(kObjectType).Move(), 0); + return &typeless; + } + + template + void AddUniqueElement(V1& a, const V2& v) { + for (typename V1::ConstValueIterator itr = a.Begin(); itr != a.End(); ++itr) + if (*itr == v) + return; + V1 c(v, *allocator_); + a.PushBack(c, *allocator_); + } + + static const ValueType* GetMember(const ValueType& value, const ValueType& name) { + typename ValueType::ConstMemberIterator itr = value.FindMember(name); + return itr != value.MemberEnd() ? &(itr->value) : 0; + } + + static void AssignIfExist(bool& out, const ValueType& value, const ValueType& name) { + if (const ValueType* v = GetMember(value, name)) + if (v->IsBool()) + out = v->GetBool(); + } + + static void AssignIfExist(SizeType& out, const ValueType& value, const ValueType& name) { + if (const ValueType* v = GetMember(value, name)) + if (v->IsUint64() && v->GetUint64() <= SizeType(~0)) + out = static_cast(v->GetUint64()); + } + + void AssignIfExist(SchemaArray& out, SchemaDocumentType& schemaDocument, const PointerType& p, const ValueType& value, const ValueType& name, const ValueType& document) { + if (const ValueType* v = GetMember(value, name)) { + if (v->IsArray() && v->Size() > 0) { + PointerType q = p.Append(name, allocator_); + out.count = v->Size(); + out.schemas = static_cast(allocator_->Malloc(out.count * sizeof(const Schema*))); + memset(out.schemas, 0, sizeof(Schema*)* out.count); + for (SizeType i = 0; i < out.count; i++) + schemaDocument.CreateSchema(&out.schemas[i], q.Append(i, allocator_), (*v)[i], document); + out.begin = validatorCount_; + validatorCount_ += out.count; + } + } + } + +#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX + template + RegexType* CreatePattern(const ValueType& value) { + if (value.IsString()) { + RegexType* r = new (allocator_->Malloc(sizeof(RegexType))) RegexType(value.GetString()); + if (!r->IsValid()) { + r->~RegexType(); + AllocatorType::Free(r); + r = 0; + } + return r; + } + return 0; + } + + static bool IsPatternMatch(const RegexType* pattern, const Ch *str, SizeType) { + return pattern->Search(str); + } +#elif RAPIDJSON_SCHEMA_USE_STDREGEX + template + RegexType* CreatePattern(const ValueType& value) { + if (value.IsString()) + try { + return new (allocator_->Malloc(sizeof(RegexType))) RegexType(value.GetString(), std::size_t(value.GetStringLength()), std::regex_constants::ECMAScript); + } + catch (const std::regex_error&) { + } + return 0; + } + + static bool IsPatternMatch(const RegexType* pattern, const Ch *str, SizeType length) { + std::match_results r; + return std::regex_search(str, str + length, r, *pattern); + } +#else + template + RegexType* CreatePattern(const ValueType&) { return 0; } + + static bool IsPatternMatch(const RegexType*, const Ch *, SizeType) { return true; } +#endif // RAPIDJSON_SCHEMA_USE_STDREGEX + + void AddType(const ValueType& type) { + if (type == GetNullString() ) type_ |= 1 << kNullSchemaType; + else if (type == GetBooleanString()) type_ |= 1 << kBooleanSchemaType; + else if (type == GetObjectString() ) type_ |= 1 << kObjectSchemaType; + else if (type == GetArrayString() ) type_ |= 1 << kArraySchemaType; + else if (type == GetStringString() ) type_ |= 1 << kStringSchemaType; + else if (type == GetIntegerString()) type_ |= 1 << kIntegerSchemaType; + else if (type == GetNumberString() ) type_ |= (1 << kNumberSchemaType) | (1 << kIntegerSchemaType); + } + + bool CreateParallelValidator(Context& context) const { + if (enum_ || context.arrayUniqueness) + context.hasher = context.factory.CreateHasher(); + + if (validatorCount_) { + RAPIDJSON_ASSERT(context.validators == 0); + context.validators = static_cast(context.factory.MallocState(sizeof(ISchemaValidator*) * validatorCount_)); + context.validatorCount = validatorCount_; + + if (allOf_.schemas) + CreateSchemaValidators(context, allOf_); + + if (anyOf_.schemas) + CreateSchemaValidators(context, anyOf_); + + if (oneOf_.schemas) + CreateSchemaValidators(context, oneOf_); + + if (not_) + context.validators[notValidatorIndex_] = context.factory.CreateSchemaValidator(*not_); + + if (hasSchemaDependencies_) { + for (SizeType i = 0; i < propertyCount_; i++) + if (properties_[i].dependenciesSchema) + context.validators[properties_[i].dependenciesValidatorIndex] = context.factory.CreateSchemaValidator(*properties_[i].dependenciesSchema); + } + } + + return true; + } + + void CreateSchemaValidators(Context& context, const SchemaArray& schemas) const { + for (SizeType i = 0; i < schemas.count; i++) + context.validators[schemas.begin + i] = context.factory.CreateSchemaValidator(*schemas.schemas[i]); + } + + // O(n) + bool FindPropertyIndex(const ValueType& name, SizeType* outIndex) const { + SizeType len = name.GetStringLength(); + const Ch* str = name.GetString(); + for (SizeType index = 0; index < propertyCount_; index++) + if (properties_[index].name.GetStringLength() == len && + (std::memcmp(properties_[index].name.GetString(), str, sizeof(Ch) * len) == 0)) + { + *outIndex = index; + return true; + } + return false; + } + + bool CheckInt(Context& context, int64_t i) const { + if (!(type_ & ((1 << kIntegerSchemaType) | (1 << kNumberSchemaType)))) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + + if (!minimum_.IsNull()) { + if (minimum_.IsInt64()) { + if (exclusiveMinimum_ ? i <= minimum_.GetInt64() : i < minimum_.GetInt64()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString()); + } + else if (minimum_.IsUint64()) { + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString()); // i <= max(int64_t) < minimum.GetUint64() + } + else if (!CheckDoubleMinimum(context, static_cast(i))) + return false; + } + + if (!maximum_.IsNull()) { + if (maximum_.IsInt64()) { + if (exclusiveMaximum_ ? i >= maximum_.GetInt64() : i > maximum_.GetInt64()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString()); + } + else if (maximum_.IsUint64()) + /* do nothing */; // i <= max(int64_t) < maximum_.GetUint64() + else if (!CheckDoubleMaximum(context, static_cast(i))) + return false; + } + + if (!multipleOf_.IsNull()) { + if (multipleOf_.IsUint64()) { + if (static_cast(i >= 0 ? i : -i) % multipleOf_.GetUint64() != 0) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMultipleOfString()); + } + else if (!CheckDoubleMultipleOf(context, static_cast(i))) + return false; + } + + return true; + } + + bool CheckUint(Context& context, uint64_t i) const { + if (!(type_ & ((1 << kIntegerSchemaType) | (1 << kNumberSchemaType)))) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + + if (!minimum_.IsNull()) { + if (minimum_.IsUint64()) { + if (exclusiveMinimum_ ? i <= minimum_.GetUint64() : i < minimum_.GetUint64()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString()); + } + else if (minimum_.IsInt64()) + /* do nothing */; // i >= 0 > minimum.Getint64() + else if (!CheckDoubleMinimum(context, static_cast(i))) + return false; + } + + if (!maximum_.IsNull()) { + if (maximum_.IsUint64()) { + if (exclusiveMaximum_ ? i >= maximum_.GetUint64() : i > maximum_.GetUint64()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString()); + } + else if (maximum_.IsInt64()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString()); // i >= 0 > maximum_ + else if (!CheckDoubleMaximum(context, static_cast(i))) + return false; + } + + if (!multipleOf_.IsNull()) { + if (multipleOf_.IsUint64()) { + if (i % multipleOf_.GetUint64() != 0) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMultipleOfString()); + } + else if (!CheckDoubleMultipleOf(context, static_cast(i))) + return false; + } + + return true; + } + + bool CheckDoubleMinimum(Context& context, double d) const { + if (exclusiveMinimum_ ? d <= minimum_.GetDouble() : d < minimum_.GetDouble()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString()); + return true; + } + + bool CheckDoubleMaximum(Context& context, double d) const { + if (exclusiveMaximum_ ? d >= maximum_.GetDouble() : d > maximum_.GetDouble()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString()); + return true; + } + + bool CheckDoubleMultipleOf(Context& context, double d) const { + double a = std::abs(d), b = std::abs(multipleOf_.GetDouble()); + double q = std::floor(a / b); + double r = a - q * b; + if (r > 0.0) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMultipleOfString()); + return true; + } + + struct Property { + Property() : schema(), dependenciesSchema(), dependenciesValidatorIndex(), dependencies(), required(false) {} + ~Property() { AllocatorType::Free(dependencies); } + SValue name; + const SchemaType* schema; + const SchemaType* dependenciesSchema; + SizeType dependenciesValidatorIndex; + bool* dependencies; + bool required; + }; + + struct PatternProperty { + PatternProperty() : schema(), pattern() {} + ~PatternProperty() { + if (pattern) { + pattern->~RegexType(); + AllocatorType::Free(pattern); + } + } + const SchemaType* schema; + RegexType* pattern; + }; + + AllocatorType* allocator_; + uint64_t* enum_; + SizeType enumCount_; + SchemaArray allOf_; + SchemaArray anyOf_; + SchemaArray oneOf_; + const SchemaType* not_; + unsigned type_; // bitmask of kSchemaType + SizeType validatorCount_; + SizeType notValidatorIndex_; + + Property* properties_; + const SchemaType* additionalPropertiesSchema_; + PatternProperty* patternProperties_; + SizeType patternPropertyCount_; + SizeType propertyCount_; + SizeType minProperties_; + SizeType maxProperties_; + bool additionalProperties_; + bool hasDependencies_; + bool hasRequired_; + bool hasSchemaDependencies_; + + const SchemaType* additionalItemsSchema_; + const SchemaType* itemsList_; + const SchemaType** itemsTuple_; + SizeType itemsTupleCount_; + SizeType minItems_; + SizeType maxItems_; + bool additionalItems_; + bool uniqueItems_; + + RegexType* pattern_; + SizeType minLength_; + SizeType maxLength_; + + SValue minimum_; + SValue maximum_; + SValue multipleOf_; + bool exclusiveMinimum_; + bool exclusiveMaximum_; +}; + +template +struct TokenHelper { + RAPIDJSON_FORCEINLINE static void AppendIndexToken(Stack& documentStack, SizeType index) { + *documentStack.template Push() = '/'; + char buffer[21]; + size_t length = static_cast((sizeof(SizeType) == 4 ? u32toa(index, buffer) : u64toa(index, buffer)) - buffer); + for (size_t i = 0; i < length; i++) + *documentStack.template Push() = buffer[i]; + } +}; + +// Partial specialized version for char to prevent buffer copying. +template +struct TokenHelper { + RAPIDJSON_FORCEINLINE static void AppendIndexToken(Stack& documentStack, SizeType index) { + if (sizeof(SizeType) == 4) { + char *buffer = documentStack.template Push(1 + 10); // '/' + uint + *buffer++ = '/'; + const char* end = internal::u32toa(index, buffer); + documentStack.template Pop(static_cast(10 - (end - buffer))); + } + else { + char *buffer = documentStack.template Push(1 + 20); // '/' + uint64 + *buffer++ = '/'; + const char* end = internal::u64toa(index, buffer); + documentStack.template Pop(static_cast(20 - (end - buffer))); + } + } +}; + +} // namespace internal + +/////////////////////////////////////////////////////////////////////////////// +// IGenericRemoteSchemaDocumentProvider + +template +class IGenericRemoteSchemaDocumentProvider { +public: + typedef typename SchemaDocumentType::Ch Ch; + + virtual ~IGenericRemoteSchemaDocumentProvider() {} + virtual const SchemaDocumentType* GetRemoteDocument(const Ch* uri, SizeType length) = 0; +}; + +/////////////////////////////////////////////////////////////////////////////// +// GenericSchemaDocument + +//! JSON schema document. +/*! + A JSON schema document is a compiled version of a JSON schema. + It is basically a tree of internal::Schema. + + \note This is an immutable class (i.e. its instance cannot be modified after construction). + \tparam ValueT Type of JSON value (e.g. \c Value ), which also determine the encoding. + \tparam Allocator Allocator type for allocating memory of this document. +*/ +template +class GenericSchemaDocument { +public: + typedef ValueT ValueType; + typedef IGenericRemoteSchemaDocumentProvider IRemoteSchemaDocumentProviderType; + typedef Allocator AllocatorType; + typedef typename ValueType::EncodingType EncodingType; + typedef typename EncodingType::Ch Ch; + typedef internal::Schema SchemaType; + typedef GenericPointer PointerType; + friend class internal::Schema; + template + friend class GenericSchemaValidator; + + //! Constructor. + /*! + Compile a JSON document into schema document. + + \param document A JSON document as source. + \param remoteProvider An optional remote schema document provider for resolving remote reference. Can be null. + \param allocator An optional allocator instance for allocating memory. Can be null. + */ + explicit GenericSchemaDocument(const ValueType& document, IRemoteSchemaDocumentProviderType* remoteProvider = 0, Allocator* allocator = 0) : + remoteProvider_(remoteProvider), + allocator_(allocator), + ownAllocator_(), + root_(), + schemaMap_(allocator, kInitialSchemaMapSize), + schemaRef_(allocator, kInitialSchemaRefSize) + { + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator()); + + // Generate root schema, it will call CreateSchema() to create sub-schemas, + // And call AddRefSchema() if there are $ref. + CreateSchemaRecursive(&root_, PointerType(), document, document); + + // Resolve $ref + while (!schemaRef_.Empty()) { + SchemaRefEntry* refEntry = schemaRef_.template Pop(1); + if (const SchemaType* s = GetSchema(refEntry->target)) { + if (refEntry->schema) + *refEntry->schema = s; + + // Create entry in map if not exist + if (!GetSchema(refEntry->source)) { + new (schemaMap_.template Push()) SchemaEntry(refEntry->source, const_cast(s), false, allocator_); + } + } + refEntry->~SchemaRefEntry(); + } + + RAPIDJSON_ASSERT(root_ != 0); + + schemaRef_.ShrinkToFit(); // Deallocate all memory for ref + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move constructor in C++11 + GenericSchemaDocument(GenericSchemaDocument&& rhs) RAPIDJSON_NOEXCEPT : + remoteProvider_(rhs.remoteProvider_), + allocator_(rhs.allocator_), + ownAllocator_(rhs.ownAllocator_), + root_(rhs.root_), + schemaMap_(std::move(rhs.schemaMap_)), + schemaRef_(std::move(rhs.schemaRef_)) + { + rhs.remoteProvider_ = 0; + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + } +#endif + + //! Destructor + ~GenericSchemaDocument() { + while (!schemaMap_.Empty()) + schemaMap_.template Pop(1)->~SchemaEntry(); + + RAPIDJSON_DELETE(ownAllocator_); + } + + //! Get the root schema. + const SchemaType& GetRoot() const { return *root_; } + +private: + //! Prohibit copying + GenericSchemaDocument(const GenericSchemaDocument&); + //! Prohibit assignment + GenericSchemaDocument& operator=(const GenericSchemaDocument&); + + struct SchemaRefEntry { + SchemaRefEntry(const PointerType& s, const PointerType& t, const SchemaType** outSchema, Allocator *allocator) : source(s, allocator), target(t, allocator), schema(outSchema) {} + PointerType source; + PointerType target; + const SchemaType** schema; + }; + + struct SchemaEntry { + SchemaEntry(const PointerType& p, SchemaType* s, bool o, Allocator* allocator) : pointer(p, allocator), schema(s), owned(o) {} + ~SchemaEntry() { + if (owned) { + schema->~SchemaType(); + Allocator::Free(schema); + } + } + PointerType pointer; + SchemaType* schema; + bool owned; + }; + + void CreateSchemaRecursive(const SchemaType** schema, const PointerType& pointer, const ValueType& v, const ValueType& document) { + if (schema) + *schema = SchemaType::GetTypeless(); + + if (v.GetType() == kObjectType) { + const SchemaType* s = GetSchema(pointer); + if (!s) + CreateSchema(schema, pointer, v, document); + + for (typename ValueType::ConstMemberIterator itr = v.MemberBegin(); itr != v.MemberEnd(); ++itr) + CreateSchemaRecursive(0, pointer.Append(itr->name, allocator_), itr->value, document); + } + else if (v.GetType() == kArrayType) + for (SizeType i = 0; i < v.Size(); i++) + CreateSchemaRecursive(0, pointer.Append(i, allocator_), v[i], document); + } + + void CreateSchema(const SchemaType** schema, const PointerType& pointer, const ValueType& v, const ValueType& document) { + RAPIDJSON_ASSERT(pointer.IsValid()); + if (v.IsObject()) { + if (!HandleRefSchema(pointer, schema, v, document)) { + SchemaType* s = new (allocator_->Malloc(sizeof(SchemaType))) SchemaType(this, pointer, v, document, allocator_); + new (schemaMap_.template Push()) SchemaEntry(pointer, s, true, allocator_); + if (schema) + *schema = s; + } + } + } + + bool HandleRefSchema(const PointerType& source, const SchemaType** schema, const ValueType& v, const ValueType& document) { + static const Ch kRefString[] = { '$', 'r', 'e', 'f', '\0' }; + static const ValueType kRefValue(kRefString, 4); + + typename ValueType::ConstMemberIterator itr = v.FindMember(kRefValue); + if (itr == v.MemberEnd()) + return false; + + if (itr->value.IsString()) { + SizeType len = itr->value.GetStringLength(); + if (len > 0) { + const Ch* s = itr->value.GetString(); + SizeType i = 0; + while (i < len && s[i] != '#') // Find the first # + i++; + + if (i > 0) { // Remote reference, resolve immediately + if (remoteProvider_) { + if (const GenericSchemaDocument* remoteDocument = remoteProvider_->GetRemoteDocument(s, i - 1)) { + PointerType pointer(&s[i], len - i, allocator_); + if (pointer.IsValid()) { + if (const SchemaType* sc = remoteDocument->GetSchema(pointer)) { + if (schema) + *schema = sc; + return true; + } + } + } + } + } + else if (s[i] == '#') { // Local reference, defer resolution + PointerType pointer(&s[i], len - i, allocator_); + if (pointer.IsValid()) { + if (const ValueType* nv = pointer.Get(document)) + if (HandleRefSchema(source, schema, *nv, document)) + return true; + + new (schemaRef_.template Push()) SchemaRefEntry(source, pointer, schema, allocator_); + return true; + } + } + } + } + return false; + } + + const SchemaType* GetSchema(const PointerType& pointer) const { + for (const SchemaEntry* target = schemaMap_.template Bottom(); target != schemaMap_.template End(); ++target) + if (pointer == target->pointer) + return target->schema; + return 0; + } + + PointerType GetPointer(const SchemaType* schema) const { + for (const SchemaEntry* target = schemaMap_.template Bottom(); target != schemaMap_.template End(); ++target) + if (schema == target->schema) + return target->pointer; + return PointerType(); + } + + static const size_t kInitialSchemaMapSize = 64; + static const size_t kInitialSchemaRefSize = 64; + + IRemoteSchemaDocumentProviderType* remoteProvider_; + Allocator *allocator_; + Allocator *ownAllocator_; + const SchemaType* root_; //!< Root schema. + internal::Stack schemaMap_; // Stores created Pointer -> Schemas + internal::Stack schemaRef_; // Stores Pointer from $ref and schema which holds the $ref +}; + +//! GenericSchemaDocument using Value type. +typedef GenericSchemaDocument SchemaDocument; +//! IGenericRemoteSchemaDocumentProvider using SchemaDocument. +typedef IGenericRemoteSchemaDocumentProvider IRemoteSchemaDocumentProvider; + +/////////////////////////////////////////////////////////////////////////////// +// GenericSchemaValidator + +//! JSON Schema Validator. +/*! + A SAX style JSON schema validator. + It uses a \c GenericSchemaDocument to validate SAX events. + It delegates the incoming SAX events to an output handler. + The default output handler does nothing. + It can be reused multiple times by calling \c Reset(). + + \tparam SchemaDocumentType Type of schema document. + \tparam OutputHandler Type of output handler. Default handler does nothing. + \tparam StateAllocator Allocator for storing the internal validation states. +*/ +template < + typename SchemaDocumentType, + typename OutputHandler = BaseReaderHandler, + typename StateAllocator = CrtAllocator> +class GenericSchemaValidator : + public internal::ISchemaStateFactory, + public internal::ISchemaValidator +{ +public: + typedef typename SchemaDocumentType::SchemaType SchemaType; + typedef typename SchemaDocumentType::PointerType PointerType; + typedef typename SchemaType::EncodingType EncodingType; + typedef typename EncodingType::Ch Ch; + + //! Constructor without output handler. + /*! + \param schemaDocument The schema document to conform to. + \param allocator Optional allocator for storing internal validation states. + \param schemaStackCapacity Optional initial capacity of schema path stack. + \param documentStackCapacity Optional initial capacity of document path stack. + */ + GenericSchemaValidator( + const SchemaDocumentType& schemaDocument, + StateAllocator* allocator = 0, + size_t schemaStackCapacity = kDefaultSchemaStackCapacity, + size_t documentStackCapacity = kDefaultDocumentStackCapacity) + : + schemaDocument_(&schemaDocument), + root_(schemaDocument.GetRoot()), + outputHandler_(GetNullHandler()), + stateAllocator_(allocator), + ownStateAllocator_(0), + schemaStack_(allocator, schemaStackCapacity), + documentStack_(allocator, documentStackCapacity), + valid_(true) +#if RAPIDJSON_SCHEMA_VERBOSE + , depth_(0) +#endif + { + } + + //! Constructor with output handler. + /*! + \param schemaDocument The schema document to conform to. + \param allocator Optional allocator for storing internal validation states. + \param schemaStackCapacity Optional initial capacity of schema path stack. + \param documentStackCapacity Optional initial capacity of document path stack. + */ + GenericSchemaValidator( + const SchemaDocumentType& schemaDocument, + OutputHandler& outputHandler, + StateAllocator* allocator = 0, + size_t schemaStackCapacity = kDefaultSchemaStackCapacity, + size_t documentStackCapacity = kDefaultDocumentStackCapacity) + : + schemaDocument_(&schemaDocument), + root_(schemaDocument.GetRoot()), + outputHandler_(outputHandler), + stateAllocator_(allocator), + ownStateAllocator_(0), + schemaStack_(allocator, schemaStackCapacity), + documentStack_(allocator, documentStackCapacity), + valid_(true) +#if RAPIDJSON_SCHEMA_VERBOSE + , depth_(0) +#endif + { + } + + //! Destructor. + ~GenericSchemaValidator() { + Reset(); + RAPIDJSON_DELETE(ownStateAllocator_); + } + + //! Reset the internal states. + void Reset() { + while (!schemaStack_.Empty()) + PopSchema(); + documentStack_.Clear(); + valid_ = true; + } + + //! Checks whether the current state is valid. + // Implementation of ISchemaValidator + virtual bool IsValid() const { return valid_; } + + //! Gets the JSON pointer pointed to the invalid schema. + PointerType GetInvalidSchemaPointer() const { + return schemaStack_.Empty() ? PointerType() : schemaDocument_->GetPointer(&CurrentSchema()); + } + + //! Gets the keyword of invalid schema. + const Ch* GetInvalidSchemaKeyword() const { + return schemaStack_.Empty() ? 0 : CurrentContext().invalidKeyword; + } + + //! Gets the JSON pointer pointed to the invalid value. + PointerType GetInvalidDocumentPointer() const { + return documentStack_.Empty() ? PointerType() : PointerType(documentStack_.template Bottom(), documentStack_.GetSize() / sizeof(Ch)); + } + +#if RAPIDJSON_SCHEMA_VERBOSE +#define RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_() \ +RAPIDJSON_MULTILINEMACRO_BEGIN\ + *documentStack_.template Push() = '\0';\ + documentStack_.template Pop(1);\ + internal::PrintInvalidDocument(documentStack_.template Bottom());\ +RAPIDJSON_MULTILINEMACRO_END +#else +#define RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_() +#endif + +#define RAPIDJSON_SCHEMA_HANDLE_BEGIN_(method, arg1)\ + if (!valid_) return false; \ + if (!BeginValue() || !CurrentSchema().method arg1) {\ + RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_();\ + return valid_ = false;\ + } + +#define RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(method, arg2)\ + for (Context* context = schemaStack_.template Bottom(); context != schemaStack_.template End(); context++) {\ + if (context->hasher)\ + static_cast(context->hasher)->method arg2;\ + if (context->validators)\ + for (SizeType i_ = 0; i_ < context->validatorCount; i_++)\ + static_cast(context->validators[i_])->method arg2;\ + if (context->patternPropertiesValidators)\ + for (SizeType i_ = 0; i_ < context->patternPropertiesValidatorCount; i_++)\ + static_cast(context->patternPropertiesValidators[i_])->method arg2;\ + } + +#define RAPIDJSON_SCHEMA_HANDLE_END_(method, arg2)\ + return valid_ = EndValue() && outputHandler_.method arg2 + +#define RAPIDJSON_SCHEMA_HANDLE_VALUE_(method, arg1, arg2) \ + RAPIDJSON_SCHEMA_HANDLE_BEGIN_ (method, arg1);\ + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(method, arg2);\ + RAPIDJSON_SCHEMA_HANDLE_END_ (method, arg2) + + bool Null() { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Null, (CurrentContext() ), ( )); } + bool Bool(bool b) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Bool, (CurrentContext(), b), (b)); } + bool Int(int i) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Int, (CurrentContext(), i), (i)); } + bool Uint(unsigned u) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Uint, (CurrentContext(), u), (u)); } + bool Int64(int64_t i) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Int64, (CurrentContext(), i), (i)); } + bool Uint64(uint64_t u) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Uint64, (CurrentContext(), u), (u)); } + bool Double(double d) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Double, (CurrentContext(), d), (d)); } + bool RawNumber(const Ch* str, SizeType length, bool copy) + { RAPIDJSON_SCHEMA_HANDLE_VALUE_(String, (CurrentContext(), str, length, copy), (str, length, copy)); } + bool String(const Ch* str, SizeType length, bool copy) + { RAPIDJSON_SCHEMA_HANDLE_VALUE_(String, (CurrentContext(), str, length, copy), (str, length, copy)); } + + bool StartObject() { + RAPIDJSON_SCHEMA_HANDLE_BEGIN_(StartObject, (CurrentContext())); + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(StartObject, ()); + return valid_ = outputHandler_.StartObject(); + } + + bool Key(const Ch* str, SizeType len, bool copy) { + if (!valid_) return false; + AppendToken(str, len); + if (!CurrentSchema().Key(CurrentContext(), str, len, copy)) return valid_ = false; + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(Key, (str, len, copy)); + return valid_ = outputHandler_.Key(str, len, copy); + } + + bool EndObject(SizeType memberCount) { + if (!valid_) return false; + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(EndObject, (memberCount)); + if (!CurrentSchema().EndObject(CurrentContext(), memberCount)) return valid_ = false; + RAPIDJSON_SCHEMA_HANDLE_END_(EndObject, (memberCount)); + } + + bool StartArray() { + RAPIDJSON_SCHEMA_HANDLE_BEGIN_(StartArray, (CurrentContext())); + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(StartArray, ()); + return valid_ = outputHandler_.StartArray(); + } + + bool EndArray(SizeType elementCount) { + if (!valid_) return false; + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(EndArray, (elementCount)); + if (!CurrentSchema().EndArray(CurrentContext(), elementCount)) return valid_ = false; + RAPIDJSON_SCHEMA_HANDLE_END_(EndArray, (elementCount)); + } + +#undef RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_ +#undef RAPIDJSON_SCHEMA_HANDLE_BEGIN_ +#undef RAPIDJSON_SCHEMA_HANDLE_PARALLEL_ +#undef RAPIDJSON_SCHEMA_HANDLE_VALUE_ + + // Implementation of ISchemaStateFactory + virtual ISchemaValidator* CreateSchemaValidator(const SchemaType& root) { + return new (GetStateAllocator().Malloc(sizeof(GenericSchemaValidator))) GenericSchemaValidator(*schemaDocument_, root, +#if RAPIDJSON_SCHEMA_VERBOSE + depth_ + 1, +#endif + &GetStateAllocator()); + } + + virtual void DestroySchemaValidator(ISchemaValidator* validator) { + GenericSchemaValidator* v = static_cast(validator); + v->~GenericSchemaValidator(); + StateAllocator::Free(v); + } + + virtual void* CreateHasher() { + return new (GetStateAllocator().Malloc(sizeof(HasherType))) HasherType(&GetStateAllocator()); + } + + virtual uint64_t GetHashCode(void* hasher) { + return static_cast(hasher)->GetHashCode(); + } + + virtual void DestroryHasher(void* hasher) { + HasherType* h = static_cast(hasher); + h->~HasherType(); + StateAllocator::Free(h); + } + + virtual void* MallocState(size_t size) { + return GetStateAllocator().Malloc(size); + } + + virtual void FreeState(void* p) { + return StateAllocator::Free(p); + } + +private: + typedef typename SchemaType::Context Context; + typedef GenericValue, StateAllocator> HashCodeArray; + typedef internal::Hasher HasherType; + + GenericSchemaValidator( + const SchemaDocumentType& schemaDocument, + const SchemaType& root, +#if RAPIDJSON_SCHEMA_VERBOSE + unsigned depth, +#endif + StateAllocator* allocator = 0, + size_t schemaStackCapacity = kDefaultSchemaStackCapacity, + size_t documentStackCapacity = kDefaultDocumentStackCapacity) + : + schemaDocument_(&schemaDocument), + root_(root), + outputHandler_(GetNullHandler()), + stateAllocator_(allocator), + ownStateAllocator_(0), + schemaStack_(allocator, schemaStackCapacity), + documentStack_(allocator, documentStackCapacity), + valid_(true) +#if RAPIDJSON_SCHEMA_VERBOSE + , depth_(depth) +#endif + { + } + + StateAllocator& GetStateAllocator() { + if (!stateAllocator_) + stateAllocator_ = ownStateAllocator_ = RAPIDJSON_NEW(StateAllocator()); + return *stateAllocator_; + } + + bool BeginValue() { + if (schemaStack_.Empty()) + PushSchema(root_); + else { + if (CurrentContext().inArray) + internal::TokenHelper, Ch>::AppendIndexToken(documentStack_, CurrentContext().arrayElementIndex); + + if (!CurrentSchema().BeginValue(CurrentContext())) + return false; + + SizeType count = CurrentContext().patternPropertiesSchemaCount; + const SchemaType** sa = CurrentContext().patternPropertiesSchemas; + typename Context::PatternValidatorType patternValidatorType = CurrentContext().valuePatternValidatorType; + bool valueUniqueness = CurrentContext().valueUniqueness; + if (CurrentContext().valueSchema) + PushSchema(*CurrentContext().valueSchema); + + if (count > 0) { + CurrentContext().objectPatternValidatorType = patternValidatorType; + ISchemaValidator**& va = CurrentContext().patternPropertiesValidators; + SizeType& validatorCount = CurrentContext().patternPropertiesValidatorCount; + va = static_cast(MallocState(sizeof(ISchemaValidator*) * count)); + for (SizeType i = 0; i < count; i++) + va[validatorCount++] = CreateSchemaValidator(*sa[i]); + } + + CurrentContext().arrayUniqueness = valueUniqueness; + } + return true; + } + + bool EndValue() { + if (!CurrentSchema().EndValue(CurrentContext())) + return false; + +#if RAPIDJSON_SCHEMA_VERBOSE + GenericStringBuffer sb; + schemaDocument_->GetPointer(&CurrentSchema()).Stringify(sb); + + *documentStack_.template Push() = '\0'; + documentStack_.template Pop(1); + internal::PrintValidatorPointers(depth_, sb.GetString(), documentStack_.template Bottom()); +#endif + + uint64_t h = CurrentContext().arrayUniqueness ? static_cast(CurrentContext().hasher)->GetHashCode() : 0; + + PopSchema(); + + if (!schemaStack_.Empty()) { + Context& context = CurrentContext(); + if (context.valueUniqueness) { + HashCodeArray* a = static_cast(context.arrayElementHashCodes); + if (!a) + CurrentContext().arrayElementHashCodes = a = new (GetStateAllocator().Malloc(sizeof(HashCodeArray))) HashCodeArray(kArrayType); + for (typename HashCodeArray::ConstValueIterator itr = a->Begin(); itr != a->End(); ++itr) + if (itr->GetUint64() == h) + RAPIDJSON_INVALID_KEYWORD_RETURN(SchemaType::GetUniqueItemsString()); + a->PushBack(h, GetStateAllocator()); + } + } + + // Remove the last token of document pointer + while (!documentStack_.Empty() && *documentStack_.template Pop(1) != '/') + ; + + return true; + } + + void AppendToken(const Ch* str, SizeType len) { + documentStack_.template Reserve(1 + len * 2); // worst case all characters are escaped as two characters + *documentStack_.template PushUnsafe() = '/'; + for (SizeType i = 0; i < len; i++) { + if (str[i] == '~') { + *documentStack_.template PushUnsafe() = '~'; + *documentStack_.template PushUnsafe() = '0'; + } + else if (str[i] == '/') { + *documentStack_.template PushUnsafe() = '~'; + *documentStack_.template PushUnsafe() = '1'; + } + else + *documentStack_.template PushUnsafe() = str[i]; + } + } + + RAPIDJSON_FORCEINLINE void PushSchema(const SchemaType& schema) { new (schemaStack_.template Push()) Context(*this, &schema); } + + RAPIDJSON_FORCEINLINE void PopSchema() { + Context* c = schemaStack_.template Pop(1); + if (HashCodeArray* a = static_cast(c->arrayElementHashCodes)) { + a->~HashCodeArray(); + StateAllocator::Free(a); + } + c->~Context(); + } + + const SchemaType& CurrentSchema() const { return *schemaStack_.template Top()->schema; } + Context& CurrentContext() { return *schemaStack_.template Top(); } + const Context& CurrentContext() const { return *schemaStack_.template Top(); } + + static OutputHandler& GetNullHandler() { + static OutputHandler nullHandler; + return nullHandler; + } + + static const size_t kDefaultSchemaStackCapacity = 1024; + static const size_t kDefaultDocumentStackCapacity = 256; + const SchemaDocumentType* schemaDocument_; + const SchemaType& root_; + OutputHandler& outputHandler_; + StateAllocator* stateAllocator_; + StateAllocator* ownStateAllocator_; + internal::Stack schemaStack_; //!< stack to store the current path of schema (BaseSchemaType *) + internal::Stack documentStack_; //!< stack to store the current path of validating document (Ch) + bool valid_; +#if RAPIDJSON_SCHEMA_VERBOSE + unsigned depth_; +#endif +}; + +typedef GenericSchemaValidator SchemaValidator; + +/////////////////////////////////////////////////////////////////////////////// +// SchemaValidatingReader + +//! A helper class for parsing with validation. +/*! + This helper class is a functor, designed as a parameter of \ref GenericDocument::Populate(). + + \tparam parseFlags Combination of \ref ParseFlag. + \tparam InputStream Type of input stream, implementing Stream concept. + \tparam SourceEncoding Encoding of the input stream. + \tparam SchemaDocumentType Type of schema document. + \tparam StackAllocator Allocator type for stack. +*/ +template < + unsigned parseFlags, + typename InputStream, + typename SourceEncoding, + typename SchemaDocumentType = SchemaDocument, + typename StackAllocator = CrtAllocator> +class SchemaValidatingReader { +public: + typedef typename SchemaDocumentType::PointerType PointerType; + typedef typename InputStream::Ch Ch; + + //! Constructor + /*! + \param is Input stream. + \param sd Schema document. + */ + SchemaValidatingReader(InputStream& is, const SchemaDocumentType& sd) : is_(is), sd_(sd), invalidSchemaKeyword_(), isValid_(true) {} + + template + bool operator()(Handler& handler) { + GenericReader reader; + GenericSchemaValidator validator(sd_, handler); + parseResult_ = reader.template Parse(is_, validator); + + isValid_ = validator.IsValid(); + if (isValid_) { + invalidSchemaPointer_ = PointerType(); + invalidSchemaKeyword_ = 0; + invalidDocumentPointer_ = PointerType(); + } + else { + invalidSchemaPointer_ = validator.GetInvalidSchemaPointer(); + invalidSchemaKeyword_ = validator.GetInvalidSchemaKeyword(); + invalidDocumentPointer_ = validator.GetInvalidDocumentPointer(); + } + + return parseResult_; + } + + const ParseResult& GetParseResult() const { return parseResult_; } + bool IsValid() const { return isValid_; } + const PointerType& GetInvalidSchemaPointer() const { return invalidSchemaPointer_; } + const Ch* GetInvalidSchemaKeyword() const { return invalidSchemaKeyword_; } + const PointerType& GetInvalidDocumentPointer() const { return invalidDocumentPointer_; } + +private: + InputStream& is_; + const SchemaDocumentType& sd_; + + ParseResult parseResult_; + PointerType invalidSchemaPointer_; + const Ch* invalidSchemaKeyword_; + PointerType invalidDocumentPointer_; + bool isValid_; +}; + +RAPIDJSON_NAMESPACE_END +RAPIDJSON_DIAG_POP + +#endif // RAPIDJSON_SCHEMA_H_ diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/stream.h b/Externals/discord-rpc/thirdparty/include/rapidjson/stream.h new file mode 100644 index 0000000000..fef82c252f --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/stream.h @@ -0,0 +1,179 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#include "rapidjson.h" + +#ifndef RAPIDJSON_STREAM_H_ +#define RAPIDJSON_STREAM_H_ + +#include "encodings.h" + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// Stream + +/*! \class rapidjson::Stream + \brief Concept for reading and writing characters. + + For read-only stream, no need to implement PutBegin(), Put(), Flush() and PutEnd(). + + For write-only stream, only need to implement Put() and Flush(). + +\code +concept Stream { + typename Ch; //!< Character type of the stream. + + //! Read the current character from stream without moving the read cursor. + Ch Peek() const; + + //! Read the current character from stream and moving the read cursor to next character. + Ch Take(); + + //! Get the current read cursor. + //! \return Number of characters read from start. + size_t Tell(); + + //! Begin writing operation at the current read pointer. + //! \return The begin writer pointer. + Ch* PutBegin(); + + //! Write a character. + void Put(Ch c); + + //! Flush the buffer. + void Flush(); + + //! End the writing operation. + //! \param begin The begin write pointer returned by PutBegin(). + //! \return Number of characters written. + size_t PutEnd(Ch* begin); +} +\endcode +*/ + +//! Provides additional information for stream. +/*! + By using traits pattern, this type provides a default configuration for stream. + For custom stream, this type can be specialized for other configuration. + See TEST(Reader, CustomStringStream) in readertest.cpp for example. +*/ +template +struct StreamTraits { + //! Whether to make local copy of stream for optimization during parsing. + /*! + By default, for safety, streams do not use local copy optimization. + Stream that can be copied fast should specialize this, like StreamTraits. + */ + enum { copyOptimization = 0 }; +}; + +//! Reserve n characters for writing to a stream. +template +inline void PutReserve(Stream& stream, size_t count) { + (void)stream; + (void)count; +} + +//! Write character to a stream, presuming buffer is reserved. +template +inline void PutUnsafe(Stream& stream, typename Stream::Ch c) { + stream.Put(c); +} + +//! Put N copies of a character to a stream. +template +inline void PutN(Stream& stream, Ch c, size_t n) { + PutReserve(stream, n); + for (size_t i = 0; i < n; i++) + PutUnsafe(stream, c); +} + +/////////////////////////////////////////////////////////////////////////////// +// StringStream + +//! Read-only string stream. +/*! \note implements Stream concept +*/ +template +struct GenericStringStream { + typedef typename Encoding::Ch Ch; + + GenericStringStream(const Ch *src) : src_(src), head_(src) {} + + Ch Peek() const { return *src_; } + Ch Take() { return *src_++; } + size_t Tell() const { return static_cast(src_ - head_); } + + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + + const Ch* src_; //!< Current read position. + const Ch* head_; //!< Original head of the string. +}; + +template +struct StreamTraits > { + enum { copyOptimization = 1 }; +}; + +//! String stream with UTF8 encoding. +typedef GenericStringStream > StringStream; + +/////////////////////////////////////////////////////////////////////////////// +// InsituStringStream + +//! A read-write string stream. +/*! This string stream is particularly designed for in-situ parsing. + \note implements Stream concept +*/ +template +struct GenericInsituStringStream { + typedef typename Encoding::Ch Ch; + + GenericInsituStringStream(Ch *src) : src_(src), dst_(0), head_(src) {} + + // Read + Ch Peek() { return *src_; } + Ch Take() { return *src_++; } + size_t Tell() { return static_cast(src_ - head_); } + + // Write + void Put(Ch c) { RAPIDJSON_ASSERT(dst_ != 0); *dst_++ = c; } + + Ch* PutBegin() { return dst_ = src_; } + size_t PutEnd(Ch* begin) { return static_cast(dst_ - begin); } + void Flush() {} + + Ch* Push(size_t count) { Ch* begin = dst_; dst_ += count; return begin; } + void Pop(size_t count) { dst_ -= count; } + + Ch* src_; + Ch* dst_; + Ch* head_; +}; + +template +struct StreamTraits > { + enum { copyOptimization = 1 }; +}; + +//! Insitu string stream with UTF8 encoding. +typedef GenericInsituStringStream > InsituStringStream; + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_STREAM_H_ diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/stringbuffer.h b/Externals/discord-rpc/thirdparty/include/rapidjson/stringbuffer.h new file mode 100644 index 0000000000..78f34d2098 --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/stringbuffer.h @@ -0,0 +1,117 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_STRINGBUFFER_H_ +#define RAPIDJSON_STRINGBUFFER_H_ + +#include "stream.h" +#include "internal/stack.h" + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS +#include // std::move +#endif + +#include "internal/stack.h" + +#if defined(__clang__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(c++98-compat) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Represents an in-memory output stream. +/*! + \tparam Encoding Encoding of the stream. + \tparam Allocator type for allocating memory buffer. + \note implements Stream concept +*/ +template +class GenericStringBuffer { +public: + typedef typename Encoding::Ch Ch; + + GenericStringBuffer(Allocator* allocator = 0, size_t capacity = kDefaultCapacity) : stack_(allocator, capacity) {} + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericStringBuffer(GenericStringBuffer&& rhs) : stack_(std::move(rhs.stack_)) {} + GenericStringBuffer& operator=(GenericStringBuffer&& rhs) { + if (&rhs != this) + stack_ = std::move(rhs.stack_); + return *this; + } +#endif + + void Put(Ch c) { *stack_.template Push() = c; } + void PutUnsafe(Ch c) { *stack_.template PushUnsafe() = c; } + void Flush() {} + + void Clear() { stack_.Clear(); } + void ShrinkToFit() { + // Push and pop a null terminator. This is safe. + *stack_.template Push() = '\0'; + stack_.ShrinkToFit(); + stack_.template Pop(1); + } + + void Reserve(size_t count) { stack_.template Reserve(count); } + Ch* Push(size_t count) { return stack_.template Push(count); } + Ch* PushUnsafe(size_t count) { return stack_.template PushUnsafe(count); } + void Pop(size_t count) { stack_.template Pop(count); } + + const Ch* GetString() const { + // Push and pop a null terminator. This is safe. + *stack_.template Push() = '\0'; + stack_.template Pop(1); + + return stack_.template Bottom(); + } + + size_t GetSize() const { return stack_.GetSize(); } + + static const size_t kDefaultCapacity = 256; + mutable internal::Stack stack_; + +private: + // Prohibit copy constructor & assignment operator. + GenericStringBuffer(const GenericStringBuffer&); + GenericStringBuffer& operator=(const GenericStringBuffer&); +}; + +//! String buffer with UTF8 encoding +typedef GenericStringBuffer > StringBuffer; + +template +inline void PutReserve(GenericStringBuffer& stream, size_t count) { + stream.Reserve(count); +} + +template +inline void PutUnsafe(GenericStringBuffer& stream, typename Encoding::Ch c) { + stream.PutUnsafe(c); +} + +//! Implement specialized version of PutN() with memset() for better performance. +template<> +inline void PutN(GenericStringBuffer >& stream, char c, size_t n) { + std::memset(stream.stack_.Push(n), c, n * sizeof(c)); +} + +RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_STRINGBUFFER_H_ diff --git a/Externals/discord-rpc/thirdparty/include/rapidjson/writer.h b/Externals/discord-rpc/thirdparty/include/rapidjson/writer.h new file mode 100644 index 0000000000..94f22dd5fc --- /dev/null +++ b/Externals/discord-rpc/thirdparty/include/rapidjson/writer.h @@ -0,0 +1,610 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_WRITER_H_ +#define RAPIDJSON_WRITER_H_ + +#include "stream.h" +#include "internal/stack.h" +#include "internal/strfunc.h" +#include "internal/dtoa.h" +#include "internal/itoa.h" +#include "stringbuffer.h" +#include // placement new + +#if defined(RAPIDJSON_SIMD) && defined(_MSC_VER) +#include +#pragma intrinsic(_BitScanForward) +#endif +#ifdef RAPIDJSON_SSE42 +#include +#elif defined(RAPIDJSON_SSE2) +#include +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(unreachable-code) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// WriteFlag + +/*! \def RAPIDJSON_WRITE_DEFAULT_FLAGS + \ingroup RAPIDJSON_CONFIG + \brief User-defined kWriteDefaultFlags definition. + + User can define this as any \c WriteFlag combinations. +*/ +#ifndef RAPIDJSON_WRITE_DEFAULT_FLAGS +#define RAPIDJSON_WRITE_DEFAULT_FLAGS kWriteNoFlags +#endif + +//! Combination of writeFlags +enum WriteFlag { + kWriteNoFlags = 0, //!< No flags are set. + kWriteValidateEncodingFlag = 1, //!< Validate encoding of JSON strings. + kWriteNanAndInfFlag = 2, //!< Allow writing of Infinity, -Infinity and NaN. + kWriteDefaultFlags = RAPIDJSON_WRITE_DEFAULT_FLAGS //!< Default write flags. Can be customized by defining RAPIDJSON_WRITE_DEFAULT_FLAGS +}; + +//! JSON writer +/*! Writer implements the concept Handler. + It generates JSON text by events to an output os. + + User may programmatically calls the functions of a writer to generate JSON text. + + On the other side, a writer can also be passed to objects that generates events, + + for example Reader::Parse() and Document::Accept(). + + \tparam OutputStream Type of output stream. + \tparam SourceEncoding Encoding of source string. + \tparam TargetEncoding Encoding of output stream. + \tparam StackAllocator Type of allocator for allocating memory of stack. + \note implements Handler concept +*/ +template, typename TargetEncoding = UTF8<>, typename StackAllocator = CrtAllocator, unsigned writeFlags = kWriteDefaultFlags> +class Writer { +public: + typedef typename SourceEncoding::Ch Ch; + + static const int kDefaultMaxDecimalPlaces = 324; + + //! Constructor + /*! \param os Output stream. + \param stackAllocator User supplied allocator. If it is null, it will create a private one. + \param levelDepth Initial capacity of stack. + */ + explicit + Writer(OutputStream& os, StackAllocator* stackAllocator = 0, size_t levelDepth = kDefaultLevelDepth) : + os_(&os), level_stack_(stackAllocator, levelDepth * sizeof(Level)), maxDecimalPlaces_(kDefaultMaxDecimalPlaces), hasRoot_(false) {} + + explicit + Writer(StackAllocator* allocator = 0, size_t levelDepth = kDefaultLevelDepth) : + os_(0), level_stack_(allocator, levelDepth * sizeof(Level)), maxDecimalPlaces_(kDefaultMaxDecimalPlaces), hasRoot_(false) {} + + //! Reset the writer with a new stream. + /*! + This function reset the writer with a new stream and default settings, + in order to make a Writer object reusable for output multiple JSONs. + + \param os New output stream. + \code + Writer writer(os1); + writer.StartObject(); + // ... + writer.EndObject(); + + writer.Reset(os2); + writer.StartObject(); + // ... + writer.EndObject(); + \endcode + */ + void Reset(OutputStream& os) { + os_ = &os; + hasRoot_ = false; + level_stack_.Clear(); + } + + //! Checks whether the output is a complete JSON. + /*! + A complete JSON has a complete root object or array. + */ + bool IsComplete() const { + return hasRoot_ && level_stack_.Empty(); + } + + int GetMaxDecimalPlaces() const { + return maxDecimalPlaces_; + } + + //! Sets the maximum number of decimal places for double output. + /*! + This setting truncates the output with specified number of decimal places. + + For example, + + \code + writer.SetMaxDecimalPlaces(3); + writer.StartArray(); + writer.Double(0.12345); // "0.123" + writer.Double(0.0001); // "0.0" + writer.Double(1.234567890123456e30); // "1.234567890123456e30" (do not truncate significand for positive exponent) + writer.Double(1.23e-4); // "0.0" (do truncate significand for negative exponent) + writer.EndArray(); + \endcode + + The default setting does not truncate any decimal places. You can restore to this setting by calling + \code + writer.SetMaxDecimalPlaces(Writer::kDefaultMaxDecimalPlaces); + \endcode + */ + void SetMaxDecimalPlaces(int maxDecimalPlaces) { + maxDecimalPlaces_ = maxDecimalPlaces; + } + + /*!@name Implementation of Handler + \see Handler + */ + //@{ + + bool Null() { Prefix(kNullType); return EndValue(WriteNull()); } + bool Bool(bool b) { Prefix(b ? kTrueType : kFalseType); return EndValue(WriteBool(b)); } + bool Int(int i) { Prefix(kNumberType); return EndValue(WriteInt(i)); } + bool Uint(unsigned u) { Prefix(kNumberType); return EndValue(WriteUint(u)); } + bool Int64(int64_t i64) { Prefix(kNumberType); return EndValue(WriteInt64(i64)); } + bool Uint64(uint64_t u64) { Prefix(kNumberType); return EndValue(WriteUint64(u64)); } + + //! Writes the given \c double value to the stream + /*! + \param d The value to be written. + \return Whether it is succeed. + */ + bool Double(double d) { Prefix(kNumberType); return EndValue(WriteDouble(d)); } + + bool RawNumber(const Ch* str, SizeType length, bool copy = false) { + (void)copy; + Prefix(kNumberType); + return EndValue(WriteString(str, length)); + } + + bool String(const Ch* str, SizeType length, bool copy = false) { + (void)copy; + Prefix(kStringType); + return EndValue(WriteString(str, length)); + } + +#if RAPIDJSON_HAS_STDSTRING + bool String(const std::basic_string& str) { + return String(str.data(), SizeType(str.size())); + } +#endif + + bool StartObject() { + Prefix(kObjectType); + new (level_stack_.template Push()) Level(false); + return WriteStartObject(); + } + + bool Key(const Ch* str, SizeType length, bool copy = false) { return String(str, length, copy); } + + bool EndObject(SizeType memberCount = 0) { + (void)memberCount; + RAPIDJSON_ASSERT(level_stack_.GetSize() >= sizeof(Level)); + RAPIDJSON_ASSERT(!level_stack_.template Top()->inArray); + level_stack_.template Pop(1); + return EndValue(WriteEndObject()); + } + + bool StartArray() { + Prefix(kArrayType); + new (level_stack_.template Push()) Level(true); + return WriteStartArray(); + } + + bool EndArray(SizeType elementCount = 0) { + (void)elementCount; + RAPIDJSON_ASSERT(level_stack_.GetSize() >= sizeof(Level)); + RAPIDJSON_ASSERT(level_stack_.template Top()->inArray); + level_stack_.template Pop(1); + return EndValue(WriteEndArray()); + } + //@} + + /*! @name Convenience extensions */ + //@{ + + //! Simpler but slower overload. + bool String(const Ch* str) { return String(str, internal::StrLen(str)); } + bool Key(const Ch* str) { return Key(str, internal::StrLen(str)); } + + //@} + + //! Write a raw JSON value. + /*! + For user to write a stringified JSON as a value. + + \param json A well-formed JSON value. It should not contain null character within [0, length - 1] range. + \param length Length of the json. + \param type Type of the root of json. + */ + bool RawValue(const Ch* json, size_t length, Type type) { Prefix(type); return EndValue(WriteRawValue(json, length)); } + +protected: + //! Information for each nested level + struct Level { + Level(bool inArray_) : valueCount(0), inArray(inArray_) {} + size_t valueCount; //!< number of values in this level + bool inArray; //!< true if in array, otherwise in object + }; + + static const size_t kDefaultLevelDepth = 32; + + bool WriteNull() { + PutReserve(*os_, 4); + PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'u'); PutUnsafe(*os_, 'l'); PutUnsafe(*os_, 'l'); return true; + } + + bool WriteBool(bool b) { + if (b) { + PutReserve(*os_, 4); + PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'r'); PutUnsafe(*os_, 'u'); PutUnsafe(*os_, 'e'); + } + else { + PutReserve(*os_, 5); + PutUnsafe(*os_, 'f'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'l'); PutUnsafe(*os_, 's'); PutUnsafe(*os_, 'e'); + } + return true; + } + + bool WriteInt(int i) { + char buffer[11]; + const char* end = internal::i32toa(i, buffer); + PutReserve(*os_, static_cast(end - buffer)); + for (const char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteUint(unsigned u) { + char buffer[10]; + const char* end = internal::u32toa(u, buffer); + PutReserve(*os_, static_cast(end - buffer)); + for (const char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteInt64(int64_t i64) { + char buffer[21]; + const char* end = internal::i64toa(i64, buffer); + PutReserve(*os_, static_cast(end - buffer)); + for (const char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteUint64(uint64_t u64) { + char buffer[20]; + char* end = internal::u64toa(u64, buffer); + PutReserve(*os_, static_cast(end - buffer)); + for (char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteDouble(double d) { + if (internal::Double(d).IsNanOrInf()) { + if (!(writeFlags & kWriteNanAndInfFlag)) + return false; + if (internal::Double(d).IsNan()) { + PutReserve(*os_, 3); + PutUnsafe(*os_, 'N'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'N'); + return true; + } + if (internal::Double(d).Sign()) { + PutReserve(*os_, 9); + PutUnsafe(*os_, '-'); + } + else + PutReserve(*os_, 8); + PutUnsafe(*os_, 'I'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'f'); + PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'y'); + return true; + } + + char buffer[25]; + char* end = internal::dtoa(d, buffer, maxDecimalPlaces_); + PutReserve(*os_, static_cast(end - buffer)); + for (char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteString(const Ch* str, SizeType length) { + static const typename TargetEncoding::Ch hexDigits[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + static const char escape[256] = { +#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + //0 1 2 3 4 5 6 7 8 9 A B C D E F + 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'b', 't', 'n', 'u', 'f', 'r', 'u', 'u', // 00 + 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', // 10 + 0, 0, '"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 20 + Z16, Z16, // 30~4F + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'\\', 0, 0, 0, // 50 + Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16 // 60~FF +#undef Z16 + }; + + if (TargetEncoding::supportUnicode) + PutReserve(*os_, 2 + length * 6); // "\uxxxx..." + else + PutReserve(*os_, 2 + length * 12); // "\uxxxx\uyyyy..." + + PutUnsafe(*os_, '\"'); + GenericStringStream is(str); + while (ScanWriteUnescapedString(is, length)) { + const Ch c = is.Peek(); + if (!TargetEncoding::supportUnicode && static_cast(c) >= 0x80) { + // Unicode escaping + unsigned codepoint; + if (RAPIDJSON_UNLIKELY(!SourceEncoding::Decode(is, &codepoint))) + return false; + PutUnsafe(*os_, '\\'); + PutUnsafe(*os_, 'u'); + if (codepoint <= 0xD7FF || (codepoint >= 0xE000 && codepoint <= 0xFFFF)) { + PutUnsafe(*os_, hexDigits[(codepoint >> 12) & 15]); + PutUnsafe(*os_, hexDigits[(codepoint >> 8) & 15]); + PutUnsafe(*os_, hexDigits[(codepoint >> 4) & 15]); + PutUnsafe(*os_, hexDigits[(codepoint ) & 15]); + } + else { + RAPIDJSON_ASSERT(codepoint >= 0x010000 && codepoint <= 0x10FFFF); + // Surrogate pair + unsigned s = codepoint - 0x010000; + unsigned lead = (s >> 10) + 0xD800; + unsigned trail = (s & 0x3FF) + 0xDC00; + PutUnsafe(*os_, hexDigits[(lead >> 12) & 15]); + PutUnsafe(*os_, hexDigits[(lead >> 8) & 15]); + PutUnsafe(*os_, hexDigits[(lead >> 4) & 15]); + PutUnsafe(*os_, hexDigits[(lead ) & 15]); + PutUnsafe(*os_, '\\'); + PutUnsafe(*os_, 'u'); + PutUnsafe(*os_, hexDigits[(trail >> 12) & 15]); + PutUnsafe(*os_, hexDigits[(trail >> 8) & 15]); + PutUnsafe(*os_, hexDigits[(trail >> 4) & 15]); + PutUnsafe(*os_, hexDigits[(trail ) & 15]); + } + } + else if ((sizeof(Ch) == 1 || static_cast(c) < 256) && RAPIDJSON_UNLIKELY(escape[static_cast(c)])) { + is.Take(); + PutUnsafe(*os_, '\\'); + PutUnsafe(*os_, static_cast(escape[static_cast(c)])); + if (escape[static_cast(c)] == 'u') { + PutUnsafe(*os_, '0'); + PutUnsafe(*os_, '0'); + PutUnsafe(*os_, hexDigits[static_cast(c) >> 4]); + PutUnsafe(*os_, hexDigits[static_cast(c) & 0xF]); + } + } + else if (RAPIDJSON_UNLIKELY(!(writeFlags & kWriteValidateEncodingFlag ? + Transcoder::Validate(is, *os_) : + Transcoder::TranscodeUnsafe(is, *os_)))) + return false; + } + PutUnsafe(*os_, '\"'); + return true; + } + + bool ScanWriteUnescapedString(GenericStringStream& is, size_t length) { + return RAPIDJSON_LIKELY(is.Tell() < length); + } + + bool WriteStartObject() { os_->Put('{'); return true; } + bool WriteEndObject() { os_->Put('}'); return true; } + bool WriteStartArray() { os_->Put('['); return true; } + bool WriteEndArray() { os_->Put(']'); return true; } + + bool WriteRawValue(const Ch* json, size_t length) { + PutReserve(*os_, length); + for (size_t i = 0; i < length; i++) { + RAPIDJSON_ASSERT(json[i] != '\0'); + PutUnsafe(*os_, json[i]); + } + return true; + } + + void Prefix(Type type) { + (void)type; + if (RAPIDJSON_LIKELY(level_stack_.GetSize() != 0)) { // this value is not at root + Level* level = level_stack_.template Top(); + if (level->valueCount > 0) { + if (level->inArray) + os_->Put(','); // add comma if it is not the first element in array + else // in object + os_->Put((level->valueCount % 2 == 0) ? ',' : ':'); + } + if (!level->inArray && level->valueCount % 2 == 0) + RAPIDJSON_ASSERT(type == kStringType); // if it's in object, then even number should be a name + level->valueCount++; + } + else { + RAPIDJSON_ASSERT(!hasRoot_); // Should only has one and only one root. + hasRoot_ = true; + } + } + + // Flush the value if it is the top level one. + bool EndValue(bool ret) { + if (RAPIDJSON_UNLIKELY(level_stack_.Empty())) // end of json text + os_->Flush(); + return ret; + } + + OutputStream* os_; + internal::Stack level_stack_; + int maxDecimalPlaces_; + bool hasRoot_; + +private: + // Prohibit copy constructor & assignment operator. + Writer(const Writer&); + Writer& operator=(const Writer&); +}; + +// Full specialization for StringStream to prevent memory copying + +template<> +inline bool Writer::WriteInt(int i) { + char *buffer = os_->Push(11); + const char* end = internal::i32toa(i, buffer); + os_->Pop(static_cast(11 - (end - buffer))); + return true; +} + +template<> +inline bool Writer::WriteUint(unsigned u) { + char *buffer = os_->Push(10); + const char* end = internal::u32toa(u, buffer); + os_->Pop(static_cast(10 - (end - buffer))); + return true; +} + +template<> +inline bool Writer::WriteInt64(int64_t i64) { + char *buffer = os_->Push(21); + const char* end = internal::i64toa(i64, buffer); + os_->Pop(static_cast(21 - (end - buffer))); + return true; +} + +template<> +inline bool Writer::WriteUint64(uint64_t u) { + char *buffer = os_->Push(20); + const char* end = internal::u64toa(u, buffer); + os_->Pop(static_cast(20 - (end - buffer))); + return true; +} + +template<> +inline bool Writer::WriteDouble(double d) { + if (internal::Double(d).IsNanOrInf()) { + // Note: This code path can only be reached if (RAPIDJSON_WRITE_DEFAULT_FLAGS & kWriteNanAndInfFlag). + if (!(kWriteDefaultFlags & kWriteNanAndInfFlag)) + return false; + if (internal::Double(d).IsNan()) { + PutReserve(*os_, 3); + PutUnsafe(*os_, 'N'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'N'); + return true; + } + if (internal::Double(d).Sign()) { + PutReserve(*os_, 9); + PutUnsafe(*os_, '-'); + } + else + PutReserve(*os_, 8); + PutUnsafe(*os_, 'I'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'f'); + PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'y'); + return true; + } + + char *buffer = os_->Push(25); + char* end = internal::dtoa(d, buffer, maxDecimalPlaces_); + os_->Pop(static_cast(25 - (end - buffer))); + return true; +} + +#if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) +template<> +inline bool Writer::ScanWriteUnescapedString(StringStream& is, size_t length) { + if (length < 16) + return RAPIDJSON_LIKELY(is.Tell() < length); + + if (!RAPIDJSON_LIKELY(is.Tell() < length)) + return false; + + const char* p = is.src_; + const char* end = is.head_ + length; + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + const char* endAligned = reinterpret_cast(reinterpret_cast(end) & static_cast(~15)); + if (nextAligned > end) + return true; + + while (p != nextAligned) + if (*p < 0x20 || *p == '\"' || *p == '\\') { + is.src_ = p; + return RAPIDJSON_LIKELY(is.Tell() < length); + } + else + os_->PutUnsafe(*p++); + + // The rest of string using SIMD + static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; + static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; + static const char space[16] = { 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19 }; + const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); + const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); + const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); + + for (; p != endAligned; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const __m128i t1 = _mm_cmpeq_epi8(s, dq); + const __m128i t2 = _mm_cmpeq_epi8(s, bs); + const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x19) == 0x19 + const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); + unsigned short r = static_cast(_mm_movemask_epi8(x)); + if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped + SizeType len; +#ifdef _MSC_VER // Find the index of first escaped + unsigned long offset; + _BitScanForward(&offset, r); + len = offset; +#else + len = static_cast(__builtin_ffs(r) - 1); +#endif + char* q = reinterpret_cast(os_->PushUnsafe(len)); + for (size_t i = 0; i < len; i++) + q[i] = p[i]; + + p += len; + break; + } + _mm_storeu_si128(reinterpret_cast<__m128i *>(os_->PushUnsafe(16)), s); + } + + is.src_ = p; + return RAPIDJSON_LIKELY(is.Tell() < length); +} +#endif // defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) + +RAPIDJSON_NAMESPACE_END + +#ifdef _MSC_VER +RAPIDJSON_DIAG_POP +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_RAPIDJSON_H_ diff --git a/Source/Core/DolphinQt2/DolphinQt2.vcxproj b/Source/Core/DolphinQt2/DolphinQt2.vcxproj index 2b0698682a..ea0978648b 100644 --- a/Source/Core/DolphinQt2/DolphinQt2.vcxproj +++ b/Source/Core/DolphinQt2/DolphinQt2.vcxproj @@ -40,7 +40,7 @@ - $(ExternalsDir)ffmpeg\lib;$(ExternalsDir)discord-rpc\lib;%(AdditionalLibraryDirectories) + $(ExternalsDir)ffmpeg\lib;$(IntDir)..\discord-rpc\bin;%(AdditionalLibraryDirectories) avrt.lib;iphlpapi.lib;winmm.lib;setupapi.lib;opengl32.lib;glu32.lib;rpcrt4.lib;comctl32.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;Shlwapi.lib;discord-rpc.lib;%(AdditionalDependencies) diff --git a/Source/Core/DolphinWX/DolphinWX.vcxproj b/Source/Core/DolphinWX/DolphinWX.vcxproj index 1aabf572a2..1038bea539 100644 --- a/Source/Core/DolphinWX/DolphinWX.vcxproj +++ b/Source/Core/DolphinWX/DolphinWX.vcxproj @@ -38,7 +38,7 @@ - $(ExternalsDir)ffmpeg\lib;$(ExternalsDir)discord-rpc\lib;%(AdditionalLibraryDirectories) + $(ExternalsDir)ffmpeg\lib;$(IntDir)..\discord-rpc\bin;%(AdditionalLibraryDirectories) avrt.lib;iphlpapi.lib;winmm.lib;setupapi.lib;opengl32.lib;glu32.lib;rpcrt4.lib;comctl32.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;Shlwapi.lib;discord-rpc.lib;%(AdditionalDependencies) diff --git a/Source/Core/UICommon/CMakeLists.txt b/Source/Core/UICommon/CMakeLists.txt index 8b3976fb0c..eafc3e1022 100644 --- a/Source/Core/UICommon/CMakeLists.txt +++ b/Source/Core/UICommon/CMakeLists.txt @@ -2,7 +2,7 @@ add_library(uicommon AutoUpdate.cpp CommandLineParse.cpp Disassembler.cpp - DiscordPresence.cpp + DiscordPresence.cpp GameFile.cpp GameFileCache.cpp UICommon.cpp diff --git a/Source/Core/UICommon/UICommon.vcxproj b/Source/Core/UICommon/UICommon.vcxproj index 1a650b3a0c..4c5459be03 100644 --- a/Source/Core/UICommon/UICommon.vcxproj +++ b/Source/Core/UICommon/UICommon.vcxproj @@ -35,16 +35,6 @@ - - - USE_DISCORD_PRESENCE;%(PreprocessorDefinitions) - - - - - USE_DISCORD_PRESENCE;%(PreprocessorDefinitions) - - @@ -54,6 +44,9 @@ {2c0d058e-de35-4471-ad99-e68a2caf9e18} + + + {4482FD2A-EC43-3FFB-AC20-2E5C54B05EAD} diff --git a/Source/UnitTests/UnitTests.vcxproj b/Source/UnitTests/UnitTests.vcxproj index cb5c37b863..24e814d773 100644 --- a/Source/UnitTests/UnitTests.vcxproj +++ b/Source/UnitTests/UnitTests.vcxproj @@ -45,7 +45,7 @@ The following libs are needed since we pull in pretty much the entire dolphin codebase. --> - $(ExternalsDir)ffmpeg\lib;$(ExternalsDir)discord-rpc\lib;%(AdditionalLibraryDirectories) + $(ExternalsDir)ffmpeg\lib;$(IntDir)..\discord-rpc\bin;%(AdditionalLibraryDirectories) avrt.lib;iphlpapi.lib;winmm.lib;setupapi.lib;opengl32.lib;glu32.lib;rpcrt4.lib;comctl32.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;Shlwapi.lib;discord-rpc.lib;%(AdditionalDependencies) Console diff --git a/Source/VSProps/Base.props b/Source/VSProps/Base.props index 6449222367..5b421cf5df 100644 --- a/Source/VSProps/Base.props +++ b/Source/VSProps/Base.props @@ -59,6 +59,7 @@ _M_X86=1;%(PreprocessorDefinitions) SFML_STATIC;%(PreprocessorDefinitions) USE_ANALYTICS=1;%(PreprocessorDefinitions) + USE_DISCORD_PRESENCE;%(PreprocessorDefinitions) CURL_STATICLIB;%(PreprocessorDefinitions) _ARCH_64=1;_M_X86_64=1;%(PreprocessorDefinitions) - $(ExternalsDir)ffmpeg\lib;$(IntDir)..\discord-rpc\bin;%(AdditionalLibraryDirectories) - avrt.lib;iphlpapi.lib;winmm.lib;setupapi.lib;opengl32.lib;glu32.lib;rpcrt4.lib;comctl32.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;Shlwapi.lib;discord-rpc.lib;%(AdditionalDependencies) + $(ExternalsDir)ffmpeg\lib;%(AdditionalLibraryDirectories) + avrt.lib;iphlpapi.lib;winmm.lib;setupapi.lib;opengl32.lib;glu32.lib;rpcrt4.lib;comctl32.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;Shlwapi.lib;%(AdditionalDependencies) Console diff --git a/Source/VSProps/Base.props b/Source/VSProps/Base.props index 5b421cf5df..568d1d28b2 100644 --- a/Source/VSProps/Base.props +++ b/Source/VSProps/Base.props @@ -59,7 +59,7 @@ _M_X86=1;%(PreprocessorDefinitions) SFML_STATIC;%(PreprocessorDefinitions) USE_ANALYTICS=1;%(PreprocessorDefinitions) - USE_DISCORD_PRESENCE;%(PreprocessorDefinitions) + USE_DISCORD_PRESENCE;%(PreprocessorDefinitions) CURL_STATICLIB;%(PreprocessorDefinitions) _ARCH_64=1;_M_X86_64=1;%(PreprocessorDefinitions)