From 10a906d51ba86127fb021a2462960f6330394f40 Mon Sep 17 00:00:00 2001 From: Ari Vuollet Date: Wed, 15 Jan 2025 00:16:32 +0200 Subject: [PATCH] Apply patches to rapidjson --- Source/Engine/Serialization/Json.h | 15 +++++++-- Source/ThirdParty/rapidjson/document.h | 32 +++++++++++++++++++ .../rapidjson/internal/biginteger.h | 6 ++-- Source/ThirdParty/rapidjson/internal/diyfp.h | 6 ++-- Source/ThirdParty/rapidjson/internal/stack.h | 14 ++++++++ Source/ThirdParty/rapidjson/stringbuffer.h | 8 +++++ 6 files changed, 74 insertions(+), 7 deletions(-) diff --git a/Source/Engine/Serialization/Json.h b/Source/Engine/Serialization/Json.h index ce62a89ca..b154068cd 100644 --- a/Source/Engine/Serialization/Json.h +++ b/Source/Engine/Serialization/Json.h @@ -5,14 +5,23 @@ #include "Engine/Core/Types/String.h" #include "Engine/Core/Types/StringView.h" -// TODO: config RAPIDJSON_SSE2 for rapidjson +// TODO: config RAPIDJSON_SSE42 for rapidjson +#if defined(__x86_64) || defined(__x86_64__) || defined(__amd64__) || defined(_M_X64) || defined(_M_AMD64) +//#define RAPIDJSON_SSE42 +#elif defined(__arm64__) || defined(__aarch64__) || defined(_M_ARM64) +//#define RAPIDJSON_NEON +#endif + #define RAPIDJSON_ERROR_CHARTYPE Char #define RAPIDJSON_ERROR_STRING(x) TEXT(x) #define RAPIDJSON_ASSERT(x) ASSERT(x) -#define RAPIDJSON_NEW(x) New() +#define RAPIDJSON_NEW(x) New #define RAPIDJSON_DELETE(x) Delete(x) #define RAPIDJSON_NOMEMBERITERATORCLASS -#include +//#define RAPIDJSON_MALLOC(size) ::malloc(size) +//#define RAPIDJSON_REALLOC(ptr, new_size) ::realloc(ptr, new_size) +//#define RAPIDJSON_FREE(ptr) ::free(ptr) + #include #include #include diff --git a/Source/ThirdParty/rapidjson/document.h b/Source/ThirdParty/rapidjson/document.h index 4b2d72322..c55ac1569 100644 --- a/Source/ThirdParty/rapidjson/document.h +++ b/Source/ThirdParty/rapidjson/document.h @@ -1852,6 +1852,32 @@ public: const Ch* GetString() const { RAPIDJSON_ASSERT(IsString()); return DataString(data_); } + ::StringAnsiView GetStringAnsiView() const { RAPIDJSON_ASSERT(IsString()); return data_.f.flags & kInlineStrFlag ? ::StringAnsiView(data_.ss.str, data_.ss.GetLength()) : ::StringAnsiView(GetStringPointer(), data_.s.length); } + ::String GetText() const + { + ::String result; + if (IsString()) + { + if (data_.f.flags & kInlineStrFlag) + result.SetUTF8(data_.ss.str, data_.ss.GetLength()); + else + result.SetUTF8(GetStringPointer(), data_.s.length); + } + return result; + } + StringAnsi GetTextAnsi() const + { + StringAnsi result; + if (IsString()) + { + if (data_.f.flags & kInlineStrFlag) + result.Set(data_.ss.str, data_.ss.GetLength()); + else + result.Set(GetStringPointer(), data_.s.length); + } + return result; + } + //! Get the length of string. /*! Since rapidjson permits "\\u0000" in the json string, strlen(v.GetString()) may not equal to v.GetStringLength(). */ @@ -2798,6 +2824,12 @@ public: return *allocator_; } + //! Get the allocator of this document. + Allocator& GetAllocator() const { + RAPIDJSON_ASSERT(allocator_); + return *allocator_; + } + //! Get the capacity of stack in bytes. size_t GetStackCapacity() const { return stack_.GetCapacity(); } diff --git a/Source/ThirdParty/rapidjson/internal/biginteger.h b/Source/ThirdParty/rapidjson/internal/biginteger.h index 4930043dc..1eac15d42 100644 --- a/Source/ThirdParty/rapidjson/internal/biginteger.h +++ b/Source/ThirdParty/rapidjson/internal/biginteger.h @@ -17,9 +17,11 @@ #include "../rapidjson.h" -#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && defined(_M_AMD64) +#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && (defined(_M_AMD64) || defined(_M_ARM64)) #include // for _umul128 -#if !defined(_ARM64EC_) +#if defined(_M_ARM64) +#pragma intrinsic(__umulh) +#elif !defined(_ARM64EC_) #pragma intrinsic(_umul128) #else #pragma comment(lib,"softintrin") diff --git a/Source/ThirdParty/rapidjson/internal/diyfp.h b/Source/ThirdParty/rapidjson/internal/diyfp.h index 1f60fb60c..43498232e 100644 --- a/Source/ThirdParty/rapidjson/internal/diyfp.h +++ b/Source/ThirdParty/rapidjson/internal/diyfp.h @@ -23,9 +23,11 @@ #include "clzll.h" #include -#if defined(_MSC_VER) && defined(_M_AMD64) && !defined(__INTEL_COMPILER) +#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && (defined(_M_AMD64) || defined(_M_ARM64)) #include -#if !defined(_ARM64EC_) +#if defined(_M_ARM64) +#pragma intrinsic(__umulh) +#elif !defined(_ARM64EC_) #pragma intrinsic(_umul128) #else #pragma comment(lib,"softintrin") diff --git a/Source/ThirdParty/rapidjson/internal/stack.h b/Source/ThirdParty/rapidjson/internal/stack.h index 73abd706e..d57764313 100644 --- a/Source/ThirdParty/rapidjson/internal/stack.h +++ b/Source/ThirdParty/rapidjson/internal/stack.h @@ -41,6 +41,18 @@ public: Stack(Allocator* allocator, size_t stackCapacity) : allocator_(allocator), ownAllocator_(0), stack_(0), stackTop_(0), stackEnd_(0), initialCapacity_(stackCapacity) { } +#if false + Stack(const Stack& other) + : Stack(nullptr, other.initialCapacity_) + { + if (other.Empty()) + return; + char* dst = Push(other.GetSize()); + const char* src = other.Bottom(); + memcpy(dst, src, other.GetSize()); + } +#endif + #if RAPIDJSON_HAS_CXX11_RVALUE_REFS Stack(Stack&& rhs) : allocator_(rhs.allocator_), @@ -211,7 +223,9 @@ private: } // Prohibit copy constructor & assignment operator. +#if false Stack(const Stack&); +#endif Stack& operator=(const Stack&); Allocator* allocator_; diff --git a/Source/ThirdParty/rapidjson/stringbuffer.h b/Source/ThirdParty/rapidjson/stringbuffer.h index 82ad3ca6b..b2aefda75 100644 --- a/Source/ThirdParty/rapidjson/stringbuffer.h +++ b/Source/ThirdParty/rapidjson/stringbuffer.h @@ -43,6 +43,9 @@ public: typedef typename Encoding::Ch Ch; GenericStringBuffer(Allocator* allocator = 0, size_t capacity = kDefaultCapacity) : stack_(allocator, capacity) {} +#if false + GenericStringBuffer(const GenericStringBuffer& other) : stack_(other.stack_) {} +#endif #if RAPIDJSON_HAS_CXX11_RVALUE_REFS GenericStringBuffer(GenericStringBuffer&& rhs) : stack_(std::move(rhs.stack_)) {} @@ -57,6 +60,9 @@ public: void PutUnsafe(Ch c) { *stack_.template PushUnsafe() = c; } void Flush() {} +#if false + void Destroy() { stack_.Clear(); stack_.ShrinkToFit(); } +#endif void Clear() { stack_.Clear(); } void ShrinkToFit() { // Push and pop a null terminator. This is safe. @@ -89,7 +95,9 @@ public: private: // Prohibit copy constructor & assignment operator. +#if false GenericStringBuffer(const GenericStringBuffer&); +#endif GenericStringBuffer& operator=(const GenericStringBuffer&); };