Fix detection of char types

This commit is contained in:
Benoit Blanchon
2022-12-26 10:21:57 +01:00
parent 67abbef818
commit 09f9bd6b8b
3 changed files with 12 additions and 9 deletions

View File

@ -86,6 +86,8 @@ TEST_CASE("custom_string") {
CHECK(s.size() == 5); CHECK(s.size() == 5);
} }
struct EmptyStruct {};
TEST_CASE("IsString<T>") { TEST_CASE("IsString<T>") {
CHECK(IsString<std::string>::value == true); CHECK(IsString<std::string>::value == true);
CHECK(IsString<std::basic_string<wchar_t> >::value == false); CHECK(IsString<std::basic_string<wchar_t> >::value == false);
@ -95,6 +97,7 @@ TEST_CASE("IsString<T>") {
CHECK(IsString<const char[8]>::value == true); CHECK(IsString<const char[8]>::value == true);
CHECK(IsString< ::String>::value == true); CHECK(IsString< ::String>::value == true);
CHECK(IsString< ::StringSumHelper>::value == true); CHECK(IsString< ::StringSumHelper>::value == true);
CHECK(IsString<const EmptyStruct*>::value == false);
} }
TEST_CASE("stringCompare") { TEST_CASE("stringCompare") {

View File

@ -40,12 +40,8 @@ serialize(JsonVariantConst source, void* buffer, size_t bufferSize) {
} }
template <template <typename> class TSerializer, typename TChar, size_t N> template <template <typename> class TSerializer, typename TChar, size_t N>
#if defined _MSC_VER && _MSC_VER < 1900 typename enable_if<IsChar<TChar>::value, size_t>::type serialize(
typename enable_if<sizeof(remove_reference<TChar>::type) == 1, size_t>::type JsonVariantConst source, TChar (&buffer)[N]) {
#else
typename enable_if<sizeof(TChar) == 1, size_t>::type
#endif
serialize(JsonVariantConst source, TChar (&buffer)[N]) {
return serialize<TSerializer>(source, buffer, N); return serialize<TSerializer>(source, buffer, N);
} }

View File

@ -13,6 +13,10 @@
namespace ARDUINOJSON_NAMESPACE { namespace ARDUINOJSON_NAMESPACE {
template <typename T>
struct IsChar
: integral_constant<bool, is_integral<T>::value && sizeof(T) == 1> {};
class ZeroTerminatedRamString { class ZeroTerminatedRamString {
public: public:
static const size_t typeSortKey = 3; static const size_t typeSortKey = 3;
@ -58,7 +62,7 @@ class ZeroTerminatedRamString {
}; };
template <typename TChar> template <typename TChar>
struct StringAdapter<TChar*, typename enable_if<sizeof(TChar) == 1>::type> { struct StringAdapter<TChar*, typename enable_if<IsChar<TChar>::value>::type> {
typedef ZeroTerminatedRamString AdaptedString; typedef ZeroTerminatedRamString AdaptedString;
static AdaptedString adapt(const TChar* p) { static AdaptedString adapt(const TChar* p) {
@ -67,7 +71,7 @@ struct StringAdapter<TChar*, typename enable_if<sizeof(TChar) == 1>::type> {
}; };
template <typename TChar, size_t N> template <typename TChar, size_t N>
struct StringAdapter<TChar[N], typename enable_if<sizeof(TChar) == 1>::type> { struct StringAdapter<TChar[N], typename enable_if<IsChar<TChar>::value>::type> {
typedef ZeroTerminatedRamString AdaptedString; typedef ZeroTerminatedRamString AdaptedString;
static AdaptedString adapt(const TChar* p) { static AdaptedString adapt(const TChar* p) {
@ -128,7 +132,7 @@ class SizedRamString {
template <typename TChar> template <typename TChar>
struct SizedStringAdapter<TChar*, struct SizedStringAdapter<TChar*,
typename enable_if<sizeof(TChar) == 1>::type> { typename enable_if<IsChar<TChar>::value>::type> {
typedef SizedRamString AdaptedString; typedef SizedRamString AdaptedString;
static AdaptedString adapt(const TChar* p, size_t n) { static AdaptedString adapt(const TChar* p, size_t n) {