diff --git a/src/ArduinoJson/Strings/Adapters/FlashString.hpp b/src/ArduinoJson/Strings/Adapters/FlashString.hpp index 4cbbc0f4..9a25462b 100644 --- a/src/ArduinoJson/Strings/Adapters/FlashString.hpp +++ b/src/ArduinoJson/Strings/Adapters/FlashString.hpp @@ -34,7 +34,7 @@ class FlashString { return size_; } - friend bool stringEquals(FlashString a, SizedRamString b) { + friend bool stringEquals(FlashString a, RamString b) { ARDUINOJSON_ASSERT(a.typeSortKey < b.typeSortKey); ARDUINOJSON_ASSERT(!a.isNull()); ARDUINOJSON_ASSERT(!b.isNull()); @@ -43,7 +43,7 @@ class FlashString { return ::memcmp_P(b.data(), a.str_, a.size_) == 0; } - friend int stringCompare(FlashString a, SizedRamString b) { + friend int stringCompare(FlashString a, RamString b) { ARDUINOJSON_ASSERT(a.typeSortKey < b.typeSortKey); ARDUINOJSON_ASSERT(!a.isNull()); ARDUINOJSON_ASSERT(!b.isNull()); diff --git a/src/ArduinoJson/Strings/Adapters/JsonString.hpp b/src/ArduinoJson/Strings/Adapters/JsonString.hpp index b611bcf8..1344e881 100644 --- a/src/ArduinoJson/Strings/Adapters/JsonString.hpp +++ b/src/ArduinoJson/Strings/Adapters/JsonString.hpp @@ -10,25 +10,12 @@ ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE -class JsonStringAdapter : public SizedRamString { - public: - JsonStringAdapter(const JsonString& s) - : SizedRamString(s.c_str(), s.size()), linked_(s.isLinked()) {} - - bool isLinked() const { - return linked_; - } - - private: - bool linked_; -}; - template <> struct StringAdapter { - using AdaptedString = JsonStringAdapter; + using AdaptedString = RamString; static AdaptedString adapt(const JsonString& s) { - return AdaptedString(s); + return AdaptedString(s.c_str(), s.size(), s.isLinked()); } }; diff --git a/src/ArduinoJson/Strings/Adapters/RamString.hpp b/src/ArduinoJson/Strings/Adapters/RamString.hpp index 0864c934..950c24e8 100644 --- a/src/ArduinoJson/Strings/Adapters/RamString.hpp +++ b/src/ArduinoJson/Strings/Adapters/RamString.hpp @@ -17,79 +17,12 @@ template struct IsChar : integral_constant::value && sizeof(T) == 1> {}; -class ZeroTerminatedRamString { - public: - static const size_t typeSortKey = 3; - - ZeroTerminatedRamString(const char* str) : str_(str) {} - - bool isNull() const { - return !str_; - } - - FORCE_INLINE size_t size() const { - return str_ ? ::strlen(str_) : 0; - } - - char operator[](size_t i) const { - ARDUINOJSON_ASSERT(str_ != 0); - ARDUINOJSON_ASSERT(i <= size()); - return str_[i]; - } - - const char* data() const { - return str_; - } - - bool isLinked() const { - return false; - } - - protected: - const char* str_; -}; - -template -struct StringAdapter::value>> { - using AdaptedString = ZeroTerminatedRamString; - - static AdaptedString adapt(const TChar* p) { - return AdaptedString(reinterpret_cast(p)); - } -}; - -template -struct StringAdapter::value>> { - using AdaptedString = ZeroTerminatedRamString; - - static AdaptedString adapt(const TChar* p) { - return AdaptedString(reinterpret_cast(p)); - } -}; - -class StaticStringAdapter : public ZeroTerminatedRamString { - public: - StaticStringAdapter(const char* str) : ZeroTerminatedRamString(str) {} - - bool isLinked() const { - return true; - } -}; - -template <> -struct StringAdapter { - using AdaptedString = StaticStringAdapter; - - static AdaptedString adapt(const char* p) { - return AdaptedString(p); - } -}; - -class SizedRamString { +class RamString { public: static const size_t typeSortKey = 2; - SizedRamString(const char* str, size_t sz) : str_(str), size_(sz) {} + RamString(const char* str, size_t sz, bool linked = false) + : str_(str), size_(sz), linked_(linked) {} bool isNull() const { return !str_; @@ -110,17 +43,47 @@ class SizedRamString { } bool isLinked() const { - return false; + return linked_; } protected: const char* str_; size_t size_; + bool linked_; // TODO: merge with size_ +}; + +template +struct StringAdapter::value>> { + using AdaptedString = RamString; + + static AdaptedString adapt(const TChar* p) { + auto str = reinterpret_cast(p); + return AdaptedString(str, str ? ::strlen(str) : 0); + } +}; + +template +struct StringAdapter::value>> { + using AdaptedString = RamString; + + static AdaptedString adapt(const TChar* p) { + auto str = reinterpret_cast(p); + return AdaptedString(str, str ? ::strlen(str) : 0); + } +}; + +template <> +struct StringAdapter { + using AdaptedString = RamString; + + static AdaptedString adapt(const char* p) { + return AdaptedString(p, p ? ::strlen(p) : 0, true); + } }; template struct SizedStringAdapter::value>> { - using AdaptedString = SizedRamString; + using AdaptedString = RamString; static AdaptedString adapt(const TChar* p, size_t n) { return AdaptedString(reinterpret_cast(p), n); diff --git a/src/ArduinoJson/Strings/Adapters/StringObject.hpp b/src/ArduinoJson/Strings/Adapters/StringObject.hpp index d29d6537..1547ab9c 100644 --- a/src/ArduinoJson/Strings/Adapters/StringObject.hpp +++ b/src/ArduinoJson/Strings/Adapters/StringObject.hpp @@ -15,7 +15,7 @@ struct StringAdapter< T, enable_if_t<(string_traits::has_cstr || string_traits::has_data) && (string_traits::has_length || string_traits::has_size)>> { - using AdaptedString = SizedRamString; + using AdaptedString = RamString; static AdaptedString adapt(const T& s) { return AdaptedString(get_data(s), get_size(s));