Add StringAdapter<T>

This commit is contained in:
Benoit Blanchon
2022-10-26 16:19:14 +02:00
parent 7004c39af6
commit ecb72f9a9d
7 changed files with 121 additions and 44 deletions

View File

@ -8,12 +8,20 @@
#include <ArduinoJson/Strings/Adapters/RamString.hpp> #include <ArduinoJson/Strings/Adapters/RamString.hpp>
#include <ArduinoJson/Strings/IsString.hpp> #include <ArduinoJson/Strings/IsString.hpp>
#include <ArduinoJson/Strings/StringAdapter.hpp>
namespace ARDUINOJSON_NAMESPACE { namespace ARDUINOJSON_NAMESPACE {
inline SizedRamString adaptString(const ::String& s) { template <typename T>
return SizedRamString(s.c_str(), s.length()); struct StringAdapter<
} T, typename enable_if<is_same<T, ::String>::value ||
is_same<T, ::StringSumHelper>::value>::type> {
typedef SizedRamString AdaptedString;
static AdaptedString adapt(const ::String& s) {
return AdaptedString(s.c_str(), s.length());
}
};
template <> template <>
struct IsString< ::String> : true_type {}; struct IsString< ::String> : true_type {};

View File

@ -70,13 +70,23 @@ class FlashString {
size_t _size; size_t _size;
}; };
inline FlashString adaptString(const __FlashStringHelper* s) { template <>
return FlashString(s, s ? strlen_P(reinterpret_cast<const char*>(s)) : 0); struct StringAdapter<const __FlashStringHelper*, void> {
} typedef FlashString AdaptedString;
inline FlashString adaptString(const __FlashStringHelper* s, size_t n) { static AdaptedString adapt(const __FlashStringHelper* s) {
return FlashString(s, n); return AdaptedString(s, s ? strlen_P(reinterpret_cast<const char*>(s)) : 0);
} }
};
template <>
struct SizedStringAdapter<const __FlashStringHelper*, void> {
typedef FlashString AdaptedString;
static AdaptedString adapt(const __FlashStringHelper* s, size_t n) {
return AdaptedString(s, n);
}
};
template <> template <>
struct IsString<const __FlashStringHelper*> : true_type {}; struct IsString<const __FlashStringHelper*> : true_type {};

View File

@ -24,9 +24,14 @@ class JsonStringAdapter : public SizedRamString {
bool _linked; bool _linked;
}; };
inline JsonStringAdapter adaptString(const String& s) { template <>
return JsonStringAdapter(s); struct StringAdapter<String> {
} typedef JsonStringAdapter AdaptedString;
static AdaptedString adapt(const String& s) {
return AdaptedString(s);
}
};
template <> template <>
struct IsString<String> : true_type {}; struct IsString<String> : true_type {};

View File

@ -10,6 +10,7 @@
#include <ArduinoJson/Polyfills/assert.hpp> #include <ArduinoJson/Polyfills/assert.hpp>
#include <ArduinoJson/Strings/IsString.hpp> #include <ArduinoJson/Strings/IsString.hpp>
#include <ArduinoJson/Strings/StoragePolicy.hpp> #include <ArduinoJson/Strings/StoragePolicy.hpp>
#include <ArduinoJson/Strings/StringAdapter.hpp>
namespace ARDUINOJSON_NAMESPACE { namespace ARDUINOJSON_NAMESPACE {
@ -60,23 +61,35 @@ class ZeroTerminatedRamString {
template <> template <>
struct IsString<char*> : true_type {}; struct IsString<char*> : true_type {};
inline ZeroTerminatedRamString adaptString(char* s) {
return ZeroTerminatedRamString(s);
}
template <> template <>
struct IsString<unsigned char*> : true_type {}; struct IsString<unsigned char*> : true_type {};
inline ZeroTerminatedRamString adaptString(const unsigned char* s) { template <typename TChar>
return ZeroTerminatedRamString(reinterpret_cast<const char*>(s)); struct StringAdapter<TChar*, typename enable_if<sizeof(TChar) == 1>::type> {
} typedef ZeroTerminatedRamString AdaptedString;
static AdaptedString adapt(const TChar* p) {
return AdaptedString(reinterpret_cast<const char*>(p));
}
};
template <> template <>
struct IsString<signed char*> : true_type {}; struct IsString<signed char*> : true_type {};
inline ZeroTerminatedRamString adaptString(const signed char* s) { template <size_t N>
return ZeroTerminatedRamString(reinterpret_cast<const char*>(s)); struct IsString<char[N]> : true_type {};
}
template <size_t N>
struct IsString<const char[N]> : true_type {};
template <typename TChar, size_t N>
struct StringAdapter<TChar[N], typename enable_if<sizeof(TChar) == 1>::type> {
typedef ZeroTerminatedRamString AdaptedString;
static AdaptedString adapt(const TChar* p) {
return AdaptedString(reinterpret_cast<const char*>(p));
}
};
class StaticStringAdapter : public ZeroTerminatedRamString { class StaticStringAdapter : public ZeroTerminatedRamString {
public: public:
@ -87,9 +100,14 @@ class StaticStringAdapter : public ZeroTerminatedRamString {
} }
}; };
inline StaticStringAdapter adaptString(const char* s) { template <>
return StaticStringAdapter(s); struct StringAdapter<const char*, void> {
} typedef StaticStringAdapter AdaptedString;
static AdaptedString adapt(const char* p) {
return AdaptedString(p);
}
};
class SizedRamString { class SizedRamString {
public: public:
@ -124,18 +142,14 @@ class SizedRamString {
size_t _size; size_t _size;
}; };
inline SizedRamString adaptString(const char* s, size_t n) { template <typename TChar>
return SizedRamString(s, n); struct SizedStringAdapter<TChar*,
} typename enable_if<sizeof(TChar) == 1>::type> {
typedef SizedRamString AdaptedString;
template <size_t N> static AdaptedString adapt(const TChar* p, size_t n) {
struct IsString<char[N]> : true_type {}; return AdaptedString(reinterpret_cast<const char*>(p), n);
}
};
template <size_t N>
struct IsString<const char[N]> : true_type {};
template <size_t N>
inline SizedRamString adaptString(char s[N]) {
return SizedRamString(s, strlen(s));
}
} // namespace ARDUINOJSON_NAMESPACE } // namespace ARDUINOJSON_NAMESPACE

View File

@ -11,10 +11,14 @@
namespace ARDUINOJSON_NAMESPACE { namespace ARDUINOJSON_NAMESPACE {
template <typename TCharTraits, typename TAllocator> template <typename TCharTraits, typename TAllocator>
inline SizedRamString adaptString( struct StringAdapter<std::basic_string<char, TCharTraits, TAllocator>, void> {
const std::basic_string<char, TCharTraits, TAllocator>& s) { typedef SizedRamString AdaptedString;
return SizedRamString(s.c_str(), s.size());
} static AdaptedString adapt(
const std::basic_string<char, TCharTraits, TAllocator>& s) {
return AdaptedString(s.c_str(), s.size());
}
};
template <typename TCharTraits, typename TAllocator> template <typename TCharTraits, typename TAllocator>
struct IsString<std::basic_string<char, TCharTraits, TAllocator> > : true_type { struct IsString<std::basic_string<char, TCharTraits, TAllocator> > : true_type {

View File

@ -10,9 +10,14 @@
namespace ARDUINOJSON_NAMESPACE { namespace ARDUINOJSON_NAMESPACE {
inline SizedRamString adaptString(const std::string_view& s) { template <>
return SizedRamString(s.data(), s.size()); struct StringAdapter<std::string_view, void> {
} typedef SizedRamString AdaptedString;
static AdaptedString adapt(const std::string_view& s) {
return AdaptedString(s.data(), s.size());
}
};
template <> template <>
struct IsString<std::string_view> : true_type {}; struct IsString<std::string_view> : true_type {};

View File

@ -0,0 +1,31 @@
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2022, Benoit BLANCHON
// MIT License
#pragma once
namespace ARDUINOJSON_NAMESPACE {
template <typename TString, typename Enable = void>
struct StringAdapter;
template <typename TString, typename Enable = void>
struct SizedStringAdapter;
template <typename TString>
typename StringAdapter<TString>::AdaptedString adaptString(const TString& s) {
return StringAdapter<TString>::adapt(s);
}
template <typename TChar>
typename StringAdapter<TChar*>::AdaptedString adaptString(TChar* p) {
return StringAdapter<TChar*>::adapt(p);
}
template <typename TChar>
typename SizedStringAdapter<TChar*>::AdaptedString adaptString(TChar* p,
size_t n) {
return SizedStringAdapter<TChar*>::adapt(p, n);
}
} // namespace ARDUINOJSON_NAMESPACE