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 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
------

View File

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

View File

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

View File

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

View File

@ -282,7 +282,7 @@ class JsonObject : public Internals::JsonPrintable<JsonObject>,
template <typename TStringRef>
node_type* findNode(TStringRef key) const {
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 NULL;

View File

@ -163,7 +163,7 @@ class JsonVariant : public JsonVariantBase<JsonVariant> {
// std::string as<std::string>() const;
// String as<String>() const;
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 {
const char *cstr = asString();
if (cstr) return T(cstr);

View File

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

View File

@ -21,11 +21,11 @@ struct JsonVariantComparer {
template <typename TVariant, typename TString>
struct JsonVariantComparer<
TVariant, TString, typename TypeTraits::EnableIf<
Internals::StringFuncs<TString>::has_equals>::type> {
TVariant, TString, typename TypeTraits::EnableIf<Internals::StringTraits<
TString>::has_equals>::type> {
static bool equals(const TVariant &variant, const TString &comparand) {
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) {}
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;
}

View File

@ -56,7 +56,7 @@ class JsonPrintable {
}
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 {
DynamicStringBuilder<TString> sb(str);
return printTo(sb);
@ -83,7 +83,7 @@ class JsonPrintable {
}
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 {
DynamicStringBuilder<TString> sb(str);
return prettyPrintTo(sb);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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