mirror of
https://github.com/nlohmann/json.git
synced 2025-08-09 05:22:48 +03:00
Provide fallback for missing char8_t
support (#4736)
This commit is contained in:
@@ -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));
|
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*>();
|
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()));
|
p = std_fs::path(std::u8string_view(reinterpret_cast<const char8_t*>(s.data()), s.size()));
|
||||||
#else
|
#else
|
||||||
p = std_fs::u8path(s); // accepts UTF-8 encoded std::string in C++17, deprecated in C++20
|
p = std_fs::u8path(s); // accepts UTF-8 encoded std::string in C++17, deprecated in C++20
|
||||||
|
@@ -15,7 +15,8 @@
|
|||||||
|
|
||||||
#include <algorithm> // copy
|
#include <algorithm> // copy
|
||||||
#include <iterator> // begin, end
|
#include <iterator> // begin, end
|
||||||
#include <string> // string
|
#include <memory> // allocator_traits
|
||||||
|
#include <string> // basic_string, char_traits
|
||||||
#include <tuple> // tuple, get
|
#include <tuple> // tuple, get
|
||||||
#include <type_traits> // is_same, is_constructible, is_floating_point, is_enum, underlying_type
|
#include <type_traits> // is_same, is_constructible, is_floating_point, is_enum, underlying_type
|
||||||
#include <utility> // move, forward, declval, pair
|
#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 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>
|
template<typename BasicJsonType>
|
||||||
inline void to_json(BasicJsonType& j, const std_fs::path& p)
|
inline void to_json(BasicJsonType& j, const std_fs::path& p)
|
||||||
{
|
{
|
||||||
#ifdef JSON_HAS_CPP_20
|
// Returns either a std::string or a std::u8string depending whether library
|
||||||
const std::u8string s = p.u8string();
|
// support for char8_t is enabled.
|
||||||
j = std::string(s.begin(), s.end());
|
j = p.u8string();
|
||||||
#else
|
|
||||||
j = p.u8string(); // returns std::string in C++17
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -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));
|
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*>();
|
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()));
|
p = std_fs::path(std::u8string_view(reinterpret_cast<const char8_t*>(s.data()), s.size()));
|
||||||
#else
|
#else
|
||||||
p = std_fs::u8path(s); // accepts UTF-8 encoded std::string in C++17, deprecated in C++20
|
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 <algorithm> // copy
|
||||||
#include <iterator> // begin, end
|
#include <iterator> // begin, end
|
||||||
#include <string> // string
|
#include <memory> // allocator_traits
|
||||||
|
#include <string> // basic_string, char_traits
|
||||||
#include <tuple> // tuple, get
|
#include <tuple> // tuple, get
|
||||||
#include <type_traits> // is_same, is_constructible, is_floating_point, is_enum, underlying_type
|
#include <type_traits> // is_same, is_constructible, is_floating_point, is_enum, underlying_type
|
||||||
#include <utility> // move, forward, declval, pair
|
#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 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>
|
template<typename BasicJsonType>
|
||||||
inline void to_json(BasicJsonType& j, const std_fs::path& p)
|
inline void to_json(BasicJsonType& j, const std_fs::path& p)
|
||||||
{
|
{
|
||||||
#ifdef JSON_HAS_CPP_20
|
// Returns either a std::string or a std::u8string depending whether library
|
||||||
const std::u8string s = p.u8string();
|
// support for char8_t is enabled.
|
||||||
j = std::string(s.begin(), s.end());
|
j = p.u8string();
|
||||||
#else
|
|
||||||
j = p.u8string(); // returns std::string in C++17
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -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__
|
#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)
|
#define ASCII_TYPES TYPE_LIST(char, wchar_t, char16_t, char32_t, char8_t)
|
||||||
#else
|
#else
|
||||||
#define ASCII_TYPES TYPE_LIST(char, wchar_t, char16_t, char32_t)
|
#define ASCII_TYPES TYPE_LIST(char, wchar_t, char16_t, char32_t)
|
||||||
|
Reference in New Issue
Block a user