commit:     ce8adefaa0637e141a52d5d88281d3049eab5c41
Author:     Conrad Kostecki <conikost <AT> gentoo <DOT> org>
AuthorDate: Thu May  1 10:53:38 2025 +0000
Commit:     Conrad Kostecki <conikost <AT> gentoo <DOT> org>
CommitDate: Thu May  1 10:55:15 2025 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=ce8adefa

dev-cpp/nlohmann_json: add patch for missing char8_t support

Closes: https://bugs.gentoo.org/954217
Signed-off-by: Conrad Kostecki <conikost <AT> gentoo.org>

 ...mann_json-3.12.0-fallback-missing-char8_t.patch | 141 +++++++++++++++++++++
 ....12.0.ebuild => nlohmann_json-3.12.0-r1.ebuild} |   2 +
 2 files changed, 143 insertions(+)

diff --git 
a/dev-cpp/nlohmann_json/files/nlohmann_json-3.12.0-fallback-missing-char8_t.patch
 
b/dev-cpp/nlohmann_json/files/nlohmann_json-3.12.0-fallback-missing-char8_t.patch
new file mode 100644
index 000000000000..afb1491e10af
--- /dev/null
+++ 
b/dev-cpp/nlohmann_json/files/nlohmann_json-3.12.0-fallback-missing-char8_t.patch
@@ -0,0 +1,141 @@
+From 756ca22ec5b0d89b5d107b4c30891d1293650c87 Mon Sep 17 00:00:00 2001
+From: Sergiu Deitsch <[email protected]>
+Date: Wed, 23 Apr 2025 18:36:41 +0200
+Subject: [PATCH] Provide fallback for missing `char8_t` support (#4736)
+
+---
+ .../nlohmann/detail/conversions/from_json.hpp |  5 +++-
+ .../nlohmann/detail/conversions/to_json.hpp   | 21 ++++++++++-----
+ single_include/nlohmann/json.hpp              | 26 +++++++++++++------
+ tests/src/unit-deserialization.cpp            |  5 ++--
+ 4 files changed, 39 insertions(+), 18 deletions(-)
+
+diff --git a/include/nlohmann/detail/conversions/from_json.hpp 
b/include/nlohmann/detail/conversions/from_json.hpp
+index 797f714dfa..3a24a6f4d2 100644
+--- a/include/nlohmann/detail/conversions/from_json.hpp
++++ b/include/nlohmann/detail/conversions/from_json.hpp
+@@ -539,7 +539,10 @@ inline void from_json(const BasicJsonType& j, 
std_fs::path& p)
+         JSON_THROW(type_error::create(302, concat("type must be string, but 
is ", j.type_name()), &j));
+     }
+     const auto& s = *j.template get_ptr<const typename 
BasicJsonType::string_t*>();
+-#ifdef JSON_HAS_CPP_20
++    // Checking for C++20 standard or later can be insufficient in case the
++    // library support for char8_t is either incomplete or was disabled
++    // altogether. Use the __cpp_lib_char8_t feature test instead.
++#if defined(__cpp_lib_char8_t) && (__cpp_lib_char8_t >= 201907L)
+     p = std_fs::path(std::u8string_view(reinterpret_cast<const 
char8_t*>(s.data()), s.size()));
+ #else
+     p = std_fs::u8path(s); // accepts UTF-8 encoded std::string in C++17, 
deprecated in C++20
+diff --git a/include/nlohmann/detail/conversions/to_json.hpp 
b/include/nlohmann/detail/conversions/to_json.hpp
+index f8413850d5..8b910dd161 100644
+--- a/include/nlohmann/detail/conversions/to_json.hpp
++++ b/include/nlohmann/detail/conversions/to_json.hpp
+@@ -15,7 +15,8 @@
+ 
+ #include <algorithm> // copy
+ #include <iterator> // begin, end
+-#include <string> // string
++#include <memory> // allocator_traits
++#include <string> //  basic_string, char_traits
+ #include <tuple> // tuple, get
+ #include <type_traits> // is_same, is_constructible, is_floating_point, 
is_enum, underlying_type
+ #include <utility> // move, forward, declval, pair
+@@ -440,15 +441,21 @@ inline void to_json(BasicJsonType& j, const T& t)
+ }
+ 
+ #if JSON_HAS_FILESYSTEM || JSON_HAS_EXPERIMENTAL_FILESYSTEM
++#if defined(__cpp_lib_char8_t)
++template<typename BasicJsonType, typename Tr, typename Allocator>
++inline void to_json(BasicJsonType& j, const std::basic_string<char8_t, Tr, 
Allocator>& s)
++{
++    using OtherAllocator = typename 
std::allocator_traits<Allocator>::template rebind_alloc<char>;
++    j = std::basic_string<char, std::char_traits<char>, 
OtherAllocator>(s.begin(), s.end(), s.get_allocator());
++}
++#endif
++
+ template<typename BasicJsonType>
+ inline void to_json(BasicJsonType& j, const std_fs::path& p)
+ {
+-#ifdef JSON_HAS_CPP_20
+-    const std::u8string s = p.u8string();
+-    j = std::string(s.begin(), s.end());
+-#else
+-    j = p.u8string(); // returns std::string in C++17
+-#endif
++    // Returns either a std::string or a std::u8string depending whether 
library
++    // support for char8_t is enabled.
++    j = p.u8string();
+ }
+ #endif
+ 
+diff --git a/single_include/nlohmann/json.hpp 
b/single_include/nlohmann/json.hpp
+index 13b07c0fbc..93e5983cf1 100644
+--- a/single_include/nlohmann/json.hpp
++++ b/single_include/nlohmann/json.hpp
+@@ -5324,7 +5324,10 @@ inline void from_json(const BasicJsonType& j, 
std_fs::path& p)
+         JSON_THROW(type_error::create(302, concat("type must be string, but 
is ", j.type_name()), &j));
+     }
+     const auto& s = *j.template get_ptr<const typename 
BasicJsonType::string_t*>();
+-#ifdef JSON_HAS_CPP_20
++    // Checking for C++20 standard or later can be insufficient in case the
++    // library support for char8_t is either incomplete or was disabled
++    // altogether. Use the __cpp_lib_char8_t feature test instead.
++#if defined(__cpp_lib_char8_t) && (__cpp_lib_char8_t >= 201907L)
+     p = std_fs::path(std::u8string_view(reinterpret_cast<const 
char8_t*>(s.data()), s.size()));
+ #else
+     p = std_fs::u8path(s); // accepts UTF-8 encoded std::string in C++17, 
deprecated in C++20
+@@ -5379,7 +5382,8 @@ NLOHMANN_JSON_NAMESPACE_END
+ 
+ #include <algorithm> // copy
+ #include <iterator> // begin, end
+-#include <string> // string
++#include <memory> // allocator_traits
++#include <string> //  basic_string, char_traits
+ #include <tuple> // tuple, get
+ #include <type_traits> // is_same, is_constructible, is_floating_point, 
is_enum, underlying_type
+ #include <utility> // move, forward, declval, pair
+@@ -6086,15 +6090,21 @@ inline void to_json(BasicJsonType& j, const T& t)
+ }
+ 
+ #if JSON_HAS_FILESYSTEM || JSON_HAS_EXPERIMENTAL_FILESYSTEM
++#if defined(__cpp_lib_char8_t)
++template<typename BasicJsonType, typename Tr, typename Allocator>
++inline void to_json(BasicJsonType& j, const std::basic_string<char8_t, Tr, 
Allocator>& s)
++{
++    using OtherAllocator = typename 
std::allocator_traits<Allocator>::template rebind_alloc<char>;
++    j = std::basic_string<char, std::char_traits<char>, 
OtherAllocator>(s.begin(), s.end(), s.get_allocator());
++}
++#endif
++
+ template<typename BasicJsonType>
+ inline void to_json(BasicJsonType& j, const std_fs::path& p)
+ {
+-#ifdef JSON_HAS_CPP_20
+-    const std::u8string s = p.u8string();
+-    j = std::string(s.begin(), s.end());
+-#else
+-    j = p.u8string(); // returns std::string in C++17
+-#endif
++    // Returns either a std::string or a std::u8string depending whether 
library
++    // support for char8_t is enabled.
++    j = p.u8string();
+ }
+ #endif
+ 
+diff --git a/tests/src/unit-deserialization.cpp 
b/tests/src/unit-deserialization.cpp
+index 84a970a183..5c450c23d3 100644
+--- a/tests/src/unit-deserialization.cpp
++++ b/tests/src/unit-deserialization.cpp
+@@ -1134,9 +1134,10 @@ TEST_CASE("deserialization")
+     }
+ }
+ 
+-// select the types to test - char8_t is only available in C++20
++// select the types to test - char8_t is only available since C++20 if and 
only
++// if __cpp_char8_t is defined.
+ #define TYPE_LIST(...) __VA_ARGS__
+-#ifdef JSON_HAS_CPP_20
++#if defined(__cpp_char8_t) && (__cpp_char8_t >= 201811L)
+     #define ASCII_TYPES TYPE_LIST(char, wchar_t, char16_t, char32_t, char8_t)
+ #else
+     #define ASCII_TYPES TYPE_LIST(char, wchar_t, char16_t, char32_t)

diff --git a/dev-cpp/nlohmann_json/nlohmann_json-3.12.0.ebuild 
b/dev-cpp/nlohmann_json/nlohmann_json-3.12.0-r1.ebuild
similarity index 96%
rename from dev-cpp/nlohmann_json/nlohmann_json-3.12.0.ebuild
rename to dev-cpp/nlohmann_json/nlohmann_json-3.12.0-r1.ebuild
index 75276652d6fc..70f098895022 100644
--- a/dev-cpp/nlohmann_json/nlohmann_json-3.12.0.ebuild
+++ b/dev-cpp/nlohmann_json/nlohmann_json-3.12.0-r1.ebuild
@@ -28,6 +28,8 @@ RESTRICT="!test? ( test )"
 
 DOCS=( ChangeLog.md README.md )
 
+PATCHES=( "${FILESDIR}/${PN}-3.12.0-fallback-missing-char8_t.patch" )
+
 src_prepare() {
        if use test ; then
                ln -s "${WORKDIR}"/json_test_data-${TEST_VERSION} 
"${S}"/json_test_data || die

Reply via email to