diff --git a/src/ArduinoJson/Strings/Adapters/ArduinoString.hpp b/src/ArduinoJson/Strings/Adapters/ArduinoString.hpp index 27977a6a..b12d3670 100644 --- a/src/ArduinoJson/Strings/Adapters/ArduinoString.hpp +++ b/src/ArduinoJson/Strings/Adapters/ArduinoString.hpp @@ -8,12 +8,20 @@ #include #include +#include namespace ARDUINOJSON_NAMESPACE { -inline SizedRamString adaptString(const ::String& s) { - return SizedRamString(s.c_str(), s.length()); -} +template +struct StringAdapter< + T, typename enable_if::value || + is_same::value>::type> { + typedef SizedRamString AdaptedString; + + static AdaptedString adapt(const ::String& s) { + return AdaptedString(s.c_str(), s.length()); + } +}; template <> struct IsString< ::String> : true_type {}; diff --git a/src/ArduinoJson/Strings/Adapters/FlashString.hpp b/src/ArduinoJson/Strings/Adapters/FlashString.hpp index b728f502..f5714b47 100644 --- a/src/ArduinoJson/Strings/Adapters/FlashString.hpp +++ b/src/ArduinoJson/Strings/Adapters/FlashString.hpp @@ -70,13 +70,23 @@ class FlashString { size_t _size; }; -inline FlashString adaptString(const __FlashStringHelper* s) { - return FlashString(s, s ? strlen_P(reinterpret_cast(s)) : 0); -} +template <> +struct StringAdapter { + typedef FlashString AdaptedString; -inline FlashString adaptString(const __FlashStringHelper* s, size_t n) { - return FlashString(s, n); -} + static AdaptedString adapt(const __FlashStringHelper* s) { + return AdaptedString(s, s ? strlen_P(reinterpret_cast(s)) : 0); + } +}; + +template <> +struct SizedStringAdapter { + typedef FlashString AdaptedString; + + static AdaptedString adapt(const __FlashStringHelper* s, size_t n) { + return AdaptedString(s, n); + } +}; template <> struct IsString : true_type {}; diff --git a/src/ArduinoJson/Strings/Adapters/JsonString.hpp b/src/ArduinoJson/Strings/Adapters/JsonString.hpp index 5bf4c6fc..f8bde252 100644 --- a/src/ArduinoJson/Strings/Adapters/JsonString.hpp +++ b/src/ArduinoJson/Strings/Adapters/JsonString.hpp @@ -24,9 +24,14 @@ class JsonStringAdapter : public SizedRamString { bool _linked; }; -inline JsonStringAdapter adaptString(const String& s) { - return JsonStringAdapter(s); -} +template <> +struct StringAdapter { + typedef JsonStringAdapter AdaptedString; + + static AdaptedString adapt(const String& s) { + return AdaptedString(s); + } +}; template <> struct IsString : true_type {}; diff --git a/src/ArduinoJson/Strings/Adapters/RamString.hpp b/src/ArduinoJson/Strings/Adapters/RamString.hpp index dfa4c0cb..44f2f3dc 100644 --- a/src/ArduinoJson/Strings/Adapters/RamString.hpp +++ b/src/ArduinoJson/Strings/Adapters/RamString.hpp @@ -10,6 +10,7 @@ #include #include #include +#include namespace ARDUINOJSON_NAMESPACE { @@ -60,23 +61,35 @@ class ZeroTerminatedRamString { template <> struct IsString : true_type {}; -inline ZeroTerminatedRamString adaptString(char* s) { - return ZeroTerminatedRamString(s); -} - template <> struct IsString : true_type {}; -inline ZeroTerminatedRamString adaptString(const unsigned char* s) { - return ZeroTerminatedRamString(reinterpret_cast(s)); -} +template +struct StringAdapter::type> { + typedef ZeroTerminatedRamString AdaptedString; + + static AdaptedString adapt(const TChar* p) { + return AdaptedString(reinterpret_cast(p)); + } +}; template <> struct IsString : true_type {}; -inline ZeroTerminatedRamString adaptString(const signed char* s) { - return ZeroTerminatedRamString(reinterpret_cast(s)); -} +template +struct IsString : true_type {}; + +template +struct IsString : true_type {}; + +template +struct StringAdapter::type> { + typedef ZeroTerminatedRamString AdaptedString; + + static AdaptedString adapt(const TChar* p) { + return AdaptedString(reinterpret_cast(p)); + } +}; class StaticStringAdapter : public ZeroTerminatedRamString { public: @@ -87,9 +100,14 @@ class StaticStringAdapter : public ZeroTerminatedRamString { } }; -inline StaticStringAdapter adaptString(const char* s) { - return StaticStringAdapter(s); -} +template <> +struct StringAdapter { + typedef StaticStringAdapter AdaptedString; + + static AdaptedString adapt(const char* p) { + return AdaptedString(p); + } +}; class SizedRamString { public: @@ -124,18 +142,14 @@ class SizedRamString { size_t _size; }; -inline SizedRamString adaptString(const char* s, size_t n) { - return SizedRamString(s, n); -} +template +struct SizedStringAdapter::type> { + typedef SizedRamString AdaptedString; -template -struct IsString : true_type {}; + static AdaptedString adapt(const TChar* p, size_t n) { + return AdaptedString(reinterpret_cast(p), n); + } +}; -template -struct IsString : true_type {}; - -template -inline SizedRamString adaptString(char s[N]) { - return SizedRamString(s, strlen(s)); -} } // namespace ARDUINOJSON_NAMESPACE diff --git a/src/ArduinoJson/Strings/Adapters/StdString.hpp b/src/ArduinoJson/Strings/Adapters/StdString.hpp index 9802606f..775a168a 100644 --- a/src/ArduinoJson/Strings/Adapters/StdString.hpp +++ b/src/ArduinoJson/Strings/Adapters/StdString.hpp @@ -11,10 +11,14 @@ namespace ARDUINOJSON_NAMESPACE { template -inline SizedRamString adaptString( - const std::basic_string& s) { - return SizedRamString(s.c_str(), s.size()); -} +struct StringAdapter, void> { + typedef SizedRamString AdaptedString; + + static AdaptedString adapt( + const std::basic_string& s) { + return AdaptedString(s.c_str(), s.size()); + } +}; template struct IsString > : true_type { diff --git a/src/ArduinoJson/Strings/Adapters/StringView.hpp b/src/ArduinoJson/Strings/Adapters/StringView.hpp index 2f431ac2..daef1626 100644 --- a/src/ArduinoJson/Strings/Adapters/StringView.hpp +++ b/src/ArduinoJson/Strings/Adapters/StringView.hpp @@ -10,9 +10,14 @@ namespace ARDUINOJSON_NAMESPACE { -inline SizedRamString adaptString(const std::string_view& s) { - return SizedRamString(s.data(), s.size()); -} +template <> +struct StringAdapter { + typedef SizedRamString AdaptedString; + + static AdaptedString adapt(const std::string_view& s) { + return AdaptedString(s.data(), s.size()); + } +}; template <> struct IsString : true_type {}; diff --git a/src/ArduinoJson/Strings/StringAdapter.hpp b/src/ArduinoJson/Strings/StringAdapter.hpp new file mode 100644 index 00000000..0f19d260 --- /dev/null +++ b/src/ArduinoJson/Strings/StringAdapter.hpp @@ -0,0 +1,31 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2022, Benoit BLANCHON +// MIT License + +#pragma once + +namespace ARDUINOJSON_NAMESPACE { + +template +struct StringAdapter; + +template +struct SizedStringAdapter; + +template +typename StringAdapter::AdaptedString adaptString(const TString& s) { + return StringAdapter::adapt(s); +} + +template +typename StringAdapter::AdaptedString adaptString(TChar* p) { + return StringAdapter::adapt(p); +} + +template +typename SizedStringAdapter::AdaptedString adaptString(TChar* p, + size_t n) { + return SizedStringAdapter::adapt(p, n); +} + +} // namespace ARDUINOJSON_NAMESPACE