diff --git a/CHANGELOG.md b/CHANGELOG.md index 6729817e..d9246206 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ HEAD * Drop support for C++98/C++03. Minimum required is C++11. * Remove `ARDUINOJSON_NAMESPACE`; use `ArduinoJson` instead. +* Make string support generic (issue #1807) v6.20.1 (2023-02-08) ------- diff --git a/extras/tests/Misc/StringAdapters.cpp b/extras/tests/Misc/StringAdapters.cpp index c2a8dc4c..cc6d681b 100644 --- a/extras/tests/Misc/StringAdapters.cpp +++ b/extras/tests/Misc/StringAdapters.cpp @@ -3,7 +3,6 @@ // MIT License #define ARDUINOJSON_ENABLE_PROGMEM 1 -#define ARDUINOJSON_ENABLE_ARDUINO_STRING 1 #include "custom_string.hpp" #include "progmem_emulation.hpp" diff --git a/src/ArduinoJson/Polyfills/type_traits/declval.hpp b/src/ArduinoJson/Polyfills/type_traits/declval.hpp index 4e72d697..41f63e60 100644 --- a/src/ArduinoJson/Polyfills/type_traits/declval.hpp +++ b/src/ArduinoJson/Polyfills/type_traits/declval.hpp @@ -9,6 +9,6 @@ ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE template -T declval(); +T&& declval(); ARDUINOJSON_END_PRIVATE_NAMESPACE diff --git a/src/ArduinoJson/Serialization/Writers/StdStringWriter.hpp b/src/ArduinoJson/Serialization/Writers/StdStringWriter.hpp index 96996b2b..eb9dd3f1 100644 --- a/src/ArduinoJson/Serialization/Writers/StdStringWriter.hpp +++ b/src/ArduinoJson/Serialization/Writers/StdStringWriter.hpp @@ -7,15 +7,17 @@ #include #include -#include - ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE -template +template +using void_t = void; + +template struct is_std_string : false_type {}; -template -struct is_std_string> +template +struct is_std_string< + T, void_t> : true_type {}; template @@ -25,7 +27,7 @@ class Writeroperator+=(static_cast(c)); + _str->push_back(static_cast(c)); return 1; } diff --git a/src/ArduinoJson/Strings/Adapters/ArduinoString.hpp b/src/ArduinoJson/Strings/Adapters/ArduinoString.hpp deleted file mode 100644 index d2af1f24..00000000 --- a/src/ArduinoJson/Strings/Adapters/ArduinoString.hpp +++ /dev/null @@ -1,25 +0,0 @@ -// ArduinoJson - https://arduinojson.org -// Copyright © 2014-2023, Benoit BLANCHON -// MIT License - -#pragma once - -#include - -#include -#include - -ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE - -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()); - } -}; - -ARDUINOJSON_END_PRIVATE_NAMESPACE diff --git a/src/ArduinoJson/Strings/Adapters/StdString.hpp b/src/ArduinoJson/Strings/Adapters/StdString.hpp deleted file mode 100644 index e873cfc2..00000000 --- a/src/ArduinoJson/Strings/Adapters/StdString.hpp +++ /dev/null @@ -1,23 +0,0 @@ -// ArduinoJson - https://arduinojson.org -// Copyright © 2014-2023, Benoit BLANCHON -// MIT License - -#pragma once - -#include - -#include - -ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE - -template -struct StringAdapter, void> { - typedef SizedRamString AdaptedString; - - static AdaptedString adapt( - const std::basic_string& s) { - return AdaptedString(s.c_str(), s.size()); - } -}; - -ARDUINOJSON_END_PRIVATE_NAMESPACE diff --git a/src/ArduinoJson/Strings/Adapters/StringObject.hpp b/src/ArduinoJson/Strings/Adapters/StringObject.hpp new file mode 100644 index 00000000..d52b0c7f --- /dev/null +++ b/src/ArduinoJson/Strings/Adapters/StringObject.hpp @@ -0,0 +1,51 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2023, Benoit BLANCHON +// MIT License + +#pragma once + +#include +#include +#include + +ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE + +template +struct StringAdapter< + T, + typename enable_if< + (string_traits::has_cstr || string_traits::has_data) && + (string_traits::has_length || string_traits::has_size)>::type> { + typedef SizedRamString AdaptedString; + + static AdaptedString adapt(const T& s) { + return AdaptedString(get_data(s), get_size(s)); + } + + private: + template + static typename enable_if::has_size, size_t>::type get_size( + const U& s) { + return s.size(); + } + + template + static typename enable_if::has_size, size_t>::type get_size( + const U& s) { + return s.length(); + } + + template + static typename enable_if::has_data, const char*>::type + get_data(const U& s) { + return s.data(); + } + + template + static typename enable_if::has_data, const char*>::type + get_data(const U& s) { + return s.c_str(); + } +}; + +ARDUINOJSON_END_PRIVATE_NAMESPACE diff --git a/src/ArduinoJson/Strings/Adapters/StringView.hpp b/src/ArduinoJson/Strings/Adapters/StringView.hpp deleted file mode 100644 index 3fb64cb0..00000000 --- a/src/ArduinoJson/Strings/Adapters/StringView.hpp +++ /dev/null @@ -1,22 +0,0 @@ -// ArduinoJson - https://arduinojson.org -// Copyright © 2014-2023, Benoit BLANCHON -// MIT License - -#pragma once - -#include - -#include - -ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE - -template <> -struct StringAdapter { - typedef SizedRamString AdaptedString; - - static AdaptedString adapt(const std::string_view& s) { - return AdaptedString(s.data(), s.size()); - } -}; - -ARDUINOJSON_END_PRIVATE_NAMESPACE diff --git a/src/ArduinoJson/Strings/StringAdapters.hpp b/src/ArduinoJson/Strings/StringAdapters.hpp index 09dcb0dd..edf881ce 100644 --- a/src/ArduinoJson/Strings/StringAdapters.hpp +++ b/src/ArduinoJson/Strings/StringAdapters.hpp @@ -7,18 +7,7 @@ #include #include #include - -#if ARDUINOJSON_ENABLE_STD_STRING -# include -#endif - -#if ARDUINOJSON_ENABLE_STRING_VIEW -# include -#endif - -#if ARDUINOJSON_ENABLE_ARDUINO_STRING -# include -#endif +#include #if ARDUINOJSON_ENABLE_PROGMEM # include diff --git a/src/ArduinoJson/Strings/StringTraits.hpp b/src/ArduinoJson/Strings/StringTraits.hpp new file mode 100644 index 00000000..45804cd1 --- /dev/null +++ b/src/ArduinoJson/Strings/StringTraits.hpp @@ -0,0 +1,79 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2023, Benoit BLANCHON +// MIT License + +#pragma once + +#include +#include + +ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE + +namespace string_traits_impl { + +// const char* c_str() const +// - String +// - std::string + +template +struct has_cstr : false_type {}; + +template +struct has_cstr().c_str()), + const char*>::value>::type> + : true_type {}; + +// const char* data() const +// - std::string +// - std::string_view +// - etl::string + +template +struct has_data : false_type {}; + +template +struct has_data().data()), + const char*>::value>::type> + : true_type {}; + +// size_t length() const +// - String + +template +struct has_length : false_type {}; + +template +struct has_length< + T, typename enable_if< + is_same().length()), size_t>::value>::type> + : true_type {}; + +// size_t size() const +// - std::string +// - std::string_view +// - etl::string + +template +struct has_size : false_type {}; + +template +struct has_size< + T, typename enable_if< + is_same().size()), size_t>::value>::type> + : true_type {}; + +} // namespace string_traits_impl + +template +struct string_traits { + enum { + has_cstr = string_traits_impl::has_cstr::value, + has_length = string_traits_impl::has_length::value, + has_data = string_traits_impl::has_data::value, + has_size = string_traits_impl::has_size::value + }; +}; + +ARDUINOJSON_END_PRIVATE_NAMESPACE