Fixed error when both ARDUINOJSON_ENABLE_STD_STREAM and ARDUINOJSON_ENABLE_ARDUINO_STREAM are set to 1

This commit is contained in:
Benoit Blanchon
2017-01-15 15:18:59 +01:00
parent 8499f0b960
commit ec6cbc5135
16 changed files with 50 additions and 48 deletions

View File

@ -6,6 +6,7 @@ HEAD
* Fixed error when assigning a `volatile int` to a `JsonVariant` (issue #415) * Fixed error when assigning a `volatile int` to a `JsonVariant` (issue #415)
* Fixed errors with Variable Length Arrays (issue #416) * Fixed errors with Variable Length Arrays (issue #416)
* Fixed error when both `ARDUINOJSON_ENABLE_STD_STREAM` and `ARDUINOJSON_ENABLE_ARDUINO_STREAM` are set to `1`
v5.8.0 v5.8.0
------ ------

View File

@ -26,8 +26,8 @@ struct ValueSetter {
}; };
template <typename TSource> template <typename TSource>
struct ValueSetter<TSource, typename TypeTraits::EnableIf< struct ValueSetter<TSource, typename TypeTraits::EnableIf<StringTraits<
StringFuncs<TSource>::should_duplicate>::type> { TSource>::should_duplicate>::type> {
template <typename TDestination> template <typename TDestination>
static bool set(JsonBuffer* buffer, TDestination& destination, static bool set(JsonBuffer* buffer, TDestination& destination,
const TSource& source) { const TSource& source) {

View File

@ -74,7 +74,7 @@ class JsonParser {
template <typename TJsonBuffer, typename TString> template <typename TJsonBuffer, typename TString>
struct JsonParserBuilder { struct JsonParserBuilder {
typedef typename Internals::StringFuncs<TString>::Iterator InputIterator; typedef typename Internals::StringTraits<TString>::Iterator InputIterator;
typedef JsonParser<StringReader<InputIterator>, TJsonBuffer &> TParser; typedef JsonParser<StringReader<InputIterator>, TJsonBuffer &> TParser;
static TParser makeParser(TJsonBuffer *buffer, TString &json, static TParser makeParser(TJsonBuffer *buffer, TString &json,
@ -85,7 +85,7 @@ struct JsonParserBuilder {
template <typename TJsonBuffer> template <typename TJsonBuffer>
struct JsonParserBuilder<TJsonBuffer, char *> { struct JsonParserBuilder<TJsonBuffer, char *> {
typedef typename Internals::StringFuncs<char *>::Iterator InputIterator; typedef typename Internals::StringTraits<char *>::Iterator InputIterator;
typedef JsonParser<StringReader<InputIterator>, StringWriter> TParser; typedef JsonParser<StringReader<InputIterator>, StringWriter> TParser;
static TParser makeParser(TJsonBuffer *buffer, char *json, static TParser makeParser(TJsonBuffer *buffer, char *json,

View File

@ -61,14 +61,14 @@ class JsonBuffer {
typename TypeTraits::EnableIf<!TypeTraits::IsArray<TString>::value, typename TypeTraits::EnableIf<!TypeTraits::IsArray<TString>::value,
char *>::type char *>::type
strdup(const TString &src) { strdup(const TString &src) {
return Internals::StringFuncs<TString>::duplicate(src, this); return Internals::StringTraits<TString>::duplicate(src, this);
} }
// //
// char* strdup(TValue); // char* strdup(TValue);
// TValue = const char*, const char[N], const FlashStringHelper* // TValue = const char*, const char[N], const FlashStringHelper*
template <typename TString> template <typename TString>
char *strdup(const TString *src) { char *strdup(const TString *src) {
return Internals::StringFuncs<const TString *>::duplicate(src, this); return Internals::StringTraits<const TString *>::duplicate(src, this);
} }
// Allocates n bytes in the JsonBuffer. // Allocates n bytes in the JsonBuffer.

View File

@ -282,7 +282,7 @@ class JsonObject : public Internals::JsonPrintable<JsonObject>,
template <typename TStringRef> template <typename TStringRef>
node_type* findNode(TStringRef key) const { node_type* findNode(TStringRef key) const {
for (node_type* node = _firstNode; node; node = node->next) { for (node_type* node = _firstNode; node; node = node->next) {
if (Internals::StringFuncs<TStringRef>::equals(key, node->content.key)) if (Internals::StringTraits<TStringRef>::equals(key, node->content.key))
return node; return node;
} }
return NULL; return NULL;

View File

@ -163,7 +163,7 @@ class JsonVariant : public JsonVariantBase<JsonVariant> {
// std::string as<std::string>() const; // std::string as<std::string>() const;
// String as<String>() const; // String as<String>() const;
template <typename T> template <typename T>
typename TypeTraits::EnableIf<Internals::StringFuncs<T>::has_append, T>::type typename TypeTraits::EnableIf<Internals::StringTraits<T>::has_append, T>::type
as() const { as() const {
const char *cstr = asString(); const char *cstr = asString();
if (cstr) return T(cstr); if (cstr) return T(cstr);

View File

@ -83,7 +83,7 @@ class JsonVariantBase : public Internals::JsonPrintable<TImpl> {
// TKey = const std::string&, const String& // TKey = const std::string&, const String&
template <typename TString> template <typename TString>
FORCE_INLINE typename TypeTraits::EnableIf< FORCE_INLINE typename TypeTraits::EnableIf<
Internals::StringFuncs<TString>::has_equals, Internals::StringTraits<TString>::has_equals,
const JsonObjectSubscript<const TString &> >::type const JsonObjectSubscript<const TString &> >::type
operator[](const TString &key) const { operator[](const TString &key) const {
return asObject()[key]; return asObject()[key];
@ -92,10 +92,10 @@ class JsonVariantBase : public Internals::JsonPrintable<TImpl> {
// const JsonObjectSubscript operator[](TKey) const; // const JsonObjectSubscript operator[](TKey) const;
// TKey = const char*, const char[N], const FlashStringHelper* // TKey = const char*, const char[N], const FlashStringHelper*
template <typename TString> template <typename TString>
FORCE_INLINE FORCE_INLINE typename TypeTraits::EnableIf<
typename TypeTraits::EnableIf<Internals::StringFuncs<TString>::has_equals, Internals::StringTraits<TString>::has_equals,
JsonObjectSubscript<const TString &> >::type JsonObjectSubscript<const TString &> >::type
operator[](const TString &key) { operator[](const TString &key) {
return asObject()[key]; return asObject()[key];
} }
// //
@ -103,7 +103,7 @@ class JsonVariantBase : public Internals::JsonPrintable<TImpl> {
// TKey = const std::string&, const String& // TKey = const std::string&, const String&
template <typename TString> template <typename TString>
FORCE_INLINE typename TypeTraits::EnableIf< FORCE_INLINE typename TypeTraits::EnableIf<
Internals::StringFuncs<TString *>::has_equals, Internals::StringTraits<TString *>::has_equals,
JsonObjectSubscript<const TString *> >::type JsonObjectSubscript<const TString *> >::type
operator[](const TString *key) { operator[](const TString *key) {
return asObject()[key]; return asObject()[key];
@ -113,7 +113,7 @@ class JsonVariantBase : public Internals::JsonPrintable<TImpl> {
// TKey = const char*, const char[N], const FlashStringHelper* // TKey = const char*, const char[N], const FlashStringHelper*
template <typename TString> template <typename TString>
FORCE_INLINE typename TypeTraits::EnableIf< FORCE_INLINE typename TypeTraits::EnableIf<
Internals::StringFuncs<TString *>::has_equals, Internals::StringTraits<TString *>::has_equals,
const JsonObjectSubscript<const TString *> >::type const JsonObjectSubscript<const TString *> >::type
operator[](const TString *key) const { operator[](const TString *key) const {
return asObject()[key]; return asObject()[key];

View File

@ -21,11 +21,11 @@ struct JsonVariantComparer {
template <typename TVariant, typename TString> template <typename TVariant, typename TString>
struct JsonVariantComparer< struct JsonVariantComparer<
TVariant, TString, typename TypeTraits::EnableIf< TVariant, TString, typename TypeTraits::EnableIf<Internals::StringTraits<
Internals::StringFuncs<TString>::has_equals>::type> { TString>::has_equals>::type> {
static bool equals(const TVariant &variant, const TString &comparand) { static bool equals(const TVariant &variant, const TString &comparand) {
const char *value = variant.template as<const char *>(); const char *value = variant.template as<const char *>();
return Internals::StringFuncs<TString>::equals(comparand, value); return Internals::StringTraits<TString>::equals(comparand, value);
} }
}; };

View File

@ -20,7 +20,7 @@ class DynamicStringBuilder : public Print {
DynamicStringBuilder(TString &str) : _str(str) {} DynamicStringBuilder(TString &str) : _str(str) {}
virtual size_t write(uint8_t c) { virtual size_t write(uint8_t c) {
StringFuncs<TString>::append(_str, static_cast<char>(c)); StringTraits<TString>::append(_str, static_cast<char>(c));
return 1; return 1;
} }

View File

@ -56,7 +56,7 @@ class JsonPrintable {
} }
template <typename TString> template <typename TString>
typename TypeTraits::EnableIf<StringFuncs<TString>::has_append, size_t>::type typename TypeTraits::EnableIf<StringTraits<TString>::has_append, size_t>::type
printTo(TString &str) const { printTo(TString &str) const {
DynamicStringBuilder<TString> sb(str); DynamicStringBuilder<TString> sb(str);
return printTo(sb); return printTo(sb);
@ -83,7 +83,7 @@ class JsonPrintable {
} }
template <typename TString> template <typename TString>
typename TypeTraits::EnableIf<StringFuncs<TString>::has_append, size_t>::type typename TypeTraits::EnableIf<StringTraits<TString>::has_append, size_t>::type
prettyPrintTo(TString &str) const { prettyPrintTo(TString &str) const {
DynamicStringBuilder<TString> sb(str); DynamicStringBuilder<TString> sb(str);
return prettyPrintTo(sb); return prettyPrintTo(sb);

View File

@ -14,7 +14,7 @@
namespace ArduinoJson { namespace ArduinoJson {
namespace Internals { namespace Internals {
struct StdStreamFuncs { struct ArduinoStreamTraits {
class Iterator { class Iterator {
Stream& _stream; Stream& _stream;
@ -29,11 +29,11 @@ struct StdStreamFuncs {
}; };
template <typename TStream> template <typename TStream>
struct StringFuncs<TStream, struct StringTraits<TStream,
// match any type that is derived from std::istream: // match any type that is derived from Stream:
typename TypeTraits::EnableIf<TypeTraits::IsBaseOf< typename TypeTraits::EnableIf<TypeTraits::IsBaseOf<
Stream, typename TypeTraits::RemoveReference< Stream, typename TypeTraits::RemoveReference<
TStream>::type>::value>::type> TStream>::type>::value>::type>
: StdStreamFuncs {}; : ArduinoStreamTraits {};
} }
} }

View File

@ -10,7 +10,7 @@
namespace ArduinoJson { namespace ArduinoJson {
namespace Internals { namespace Internals {
struct CharPtrFuncs { struct CharPointerTraits {
class Iterator { class Iterator {
const char* _ptr; const char* _ptr;
@ -43,9 +43,9 @@ struct CharPtrFuncs {
}; };
template <> template <>
struct StringFuncs<const char*, void> : CharPtrFuncs {}; struct StringTraits<const char*, void> : CharPointerTraits {};
template <> template <>
struct StringFuncs<char*, void> : CharPtrFuncs {}; struct StringTraits<char*, void> : CharPointerTraits {};
} }
} }

View File

@ -10,7 +10,7 @@
namespace ArduinoJson { namespace ArduinoJson {
namespace Internals { namespace Internals {
template <> template <>
struct StringFuncs<const __FlashStringHelper*, void> { struct StringTraits<const __FlashStringHelper*, void> {
class Iterator { class Iterator {
const char* _ptr; const char* _ptr;

View File

@ -15,7 +15,7 @@
namespace ArduinoJson { namespace ArduinoJson {
namespace Internals { namespace Internals {
struct StdStreamFuncs { struct StdStreamTraits {
class Iterator { class Iterator {
std::istream& _stream; std::istream& _stream;
@ -32,11 +32,11 @@ struct StdStreamFuncs {
}; };
template <typename TStream> template <typename TStream>
struct StringFuncs<TStream, struct StringTraits<TStream,
// match any type that is derived from std::istream: // match any type that is derived from std::istream:
typename TypeTraits::EnableIf<TypeTraits::IsBaseOf< typename TypeTraits::EnableIf<TypeTraits::IsBaseOf<
std::istream, typename TypeTraits::RemoveReference< std::istream, typename TypeTraits::RemoveReference<
TStream>::type>::value>::type> TStream>::type>::value>::type>
: StdStreamFuncs {}; : StdStreamTraits {};
} }
} }

View File

@ -19,7 +19,7 @@ namespace ArduinoJson {
namespace Internals { namespace Internals {
template <typename TString> template <typename TString>
struct StdStringFuncs { struct StdStringTraits {
template <typename Buffer> template <typename Buffer>
static char* duplicate(const TString& str, Buffer* buffer) { static char* duplicate(const TString& str, Buffer* buffer) {
if (!str.c_str()) return NULL; // <- Arduino string can return NULL if (!str.c_str()) return NULL; // <- Arduino string can return NULL
@ -29,8 +29,8 @@ struct StdStringFuncs {
return static_cast<char*>(dup); return static_cast<char*>(dup);
} }
struct Iterator : CharPtrFuncs::Iterator { struct Iterator : CharPointerTraits::Iterator {
Iterator(const TString& str) : CharPtrFuncs::Iterator(str.c_str()) {} Iterator(const TString& str) : CharPointerTraits::Iterator(str.c_str()) {}
}; };
static bool equals(const TString& str, const char* expected) { static bool equals(const TString& str, const char* expected) {
@ -48,14 +48,15 @@ struct StdStringFuncs {
#if ARDUINOJSON_ENABLE_ARDUINO_STRING #if ARDUINOJSON_ENABLE_ARDUINO_STRING
template <> template <>
struct StringFuncs<String, void> : StdStringFuncs<String> {}; struct StringTraits<String, void> : StdStringTraits<String> {};
template <> template <>
struct StringFuncs<StringSumHelper, void> : StdStringFuncs<StringSumHelper> {}; struct StringTraits<StringSumHelper, void> : StdStringTraits<StringSumHelper> {
};
#endif #endif
#if ARDUINOJSON_ENABLE_STD_STRING #if ARDUINOJSON_ENABLE_STD_STRING
template <> template <>
struct StringFuncs<std::string, void> : StdStringFuncs<std::string> {}; struct StringTraits<std::string, void> : StdStringTraits<std::string> {};
#endif #endif
} }
} }

View File

@ -13,13 +13,13 @@ namespace ArduinoJson {
namespace Internals { namespace Internals {
template <typename TString, typename Enable = void> template <typename TString, typename Enable = void>
struct StringFuncs {}; struct StringTraits {};
template <typename TString> template <typename TString>
struct StringFuncs<const TString, void> : StringFuncs<TString> {}; struct StringTraits<const TString, void> : StringTraits<TString> {};
template <typename TString> template <typename TString>
struct StringFuncs<TString&, void> : StringFuncs<TString> {}; struct StringTraits<TString&, void> : StringTraits<TString> {};
} }
} }