Allow mixed configuration in compilation units (issue #809)

This commit is contained in:
Benoit Blanchon
2018-10-02 16:54:05 +02:00
parent 29e71cbb16
commit 527dc19794
122 changed files with 580 additions and 691 deletions

View File

@ -5,6 +5,7 @@ HEAD
---- ----
* Added implicit conversion from `JsonArray` and `JsonObject` to `JsonVariant` * Added implicit conversion from `JsonArray` and `JsonObject` to `JsonVariant`
* Allow mixed configuration in compilation units (issue #809)
v6.4.0-beta (2018-09-11) v6.4.0-beta (2018-09-11)
----------- -----------

View File

@ -4,7 +4,7 @@
#pragma once #pragma once
#include "ArduinoJson/version.hpp" #include "ArduinoJson/Namespace.hpp"
#include "ArduinoJson/DynamicJsonDocument.hpp" #include "ArduinoJson/DynamicJsonDocument.hpp"
#include "ArduinoJson/StaticJsonDocument.hpp" #include "ArduinoJson/StaticJsonDocument.hpp"
@ -24,3 +24,16 @@
#include "ArduinoJson/Json/PrettyJsonSerializer.hpp" #include "ArduinoJson/Json/PrettyJsonSerializer.hpp"
#include "ArduinoJson/MsgPack/MsgPackDeserializer.hpp" #include "ArduinoJson/MsgPack/MsgPackDeserializer.hpp"
#include "ArduinoJson/MsgPack/MsgPackSerializer.hpp" #include "ArduinoJson/MsgPack/MsgPackSerializer.hpp"
namespace ArduinoJson {
using ARDUINOJSON_NAMESPACE::DeserializationError;
using ARDUINOJSON_NAMESPACE::DynamicJsonDocument;
using ARDUINOJSON_NAMESPACE::JsonArray;
using ARDUINOJSON_NAMESPACE::JsonFloat;
using ARDUINOJSON_NAMESPACE::JsonInteger;
using ARDUINOJSON_NAMESPACE::JsonObject;
using ARDUINOJSON_NAMESPACE::JsonUInt;
using ARDUINOJSON_NAMESPACE::JsonVariant;
using ARDUINOJSON_NAMESPACE::serialized;
using ARDUINOJSON_NAMESPACE::StaticJsonDocument;
} // namespace ArduinoJson

View File

@ -4,6 +4,18 @@
#pragma once #pragma once
#if defined(_MSC_VER)
#define ARDUINOJSON_HAS_INT64 1
#else
#define ARDUINOJSON_HAS_INT64 0
#endif
#if __cplusplus >= 201103L
#define ARDUINOJSON_HAS_LONG_LONG 1
#else
#define ARDUINOJSON_HAS_LONG_LONG 0
#endif
// Small or big machine? // Small or big machine?
#ifndef ARDUINOJSON_EMBEDDED_MODE #ifndef ARDUINOJSON_EMBEDDED_MODE
#if defined(ARDUINO) || defined(__IAR_SYSTEMS_ICC__) || defined(__XC) || \ #if defined(ARDUINO) || defined(__IAR_SYSTEMS_ICC__) || defined(__XC) || \
@ -25,9 +37,6 @@
#ifndef ARDUINOJSON_USE_LONG_LONG #ifndef ARDUINOJSON_USE_LONG_LONG
#define ARDUINOJSON_USE_LONG_LONG 0 #define ARDUINOJSON_USE_LONG_LONG 0
#endif #endif
#ifndef ARDUINOJSON_USE_INT64
#define ARDUINOJSON_USE_INT64 0
#endif
// Embedded systems usually don't have std::string // Embedded systems usually don't have std::string
#ifndef ARDUINOJSON_ENABLE_STD_STRING #ifndef ARDUINOJSON_ENABLE_STD_STRING
@ -53,22 +62,13 @@
// Use long long when available // Use long long when available
#ifndef ARDUINOJSON_USE_LONG_LONG #ifndef ARDUINOJSON_USE_LONG_LONG
#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800) #if ARDUINOJSON_HAS_LONG_LONG || ARDUINOJSON_HAS_INT64
#define ARDUINOJSON_USE_LONG_LONG 1 #define ARDUINOJSON_USE_LONG_LONG 1
#else #else
#define ARDUINOJSON_USE_LONG_LONG 0 #define ARDUINOJSON_USE_LONG_LONG 0
#endif #endif
#endif #endif
// Use _int64 on old versions of Visual Studio
#ifndef ARDUINOJSON_USE_INT64
#if defined(_MSC_VER) && _MSC_VER <= 1700
#define ARDUINOJSON_USE_INT64 1
#else
#define ARDUINOJSON_USE_INT64 0
#endif
#endif
// On a computer, we can use std::string // On a computer, we can use std::string
#ifndef ARDUINOJSON_ENABLE_STD_STRING #ifndef ARDUINOJSON_ENABLE_STD_STRING
#define ARDUINOJSON_ENABLE_STD_STRING 1 #define ARDUINOJSON_ENABLE_STD_STRING 1
@ -141,10 +141,6 @@
#define ARDUINOJSON_NEGATIVE_EXPONENTIATION_THRESHOLD 1e-5 #define ARDUINOJSON_NEGATIVE_EXPONENTIATION_THRESHOLD 1e-5
#endif #endif
#if ARDUINOJSON_USE_LONG_LONG && ARDUINOJSON_USE_INT64
#error ARDUINOJSON_USE_LONG_LONG and ARDUINOJSON_USE_INT64 cannot be set together
#endif
#ifndef ARDUINOJSON_LITTLE_ENDIAN #ifndef ARDUINOJSON_LITTLE_ENDIAN
#if defined(_MSC_VER) || \ #if defined(_MSC_VER) || \
(defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) || \ (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) || \

View File

@ -6,12 +6,10 @@
#include "../Polyfills/type_traits.hpp" #include "../Polyfills/type_traits.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
class JsonVariantTag {}; class JsonVariantTag {};
template <typename T> template <typename T>
struct IsVariant : is_base_of<JsonVariantTag, T> {}; struct IsVariant : is_base_of<JsonVariantTag, T> {};
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -6,13 +6,11 @@
#include "../Configuration.hpp" #include "../Configuration.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
#if ARDUINOJSON_USE_DOUBLE #if ARDUINOJSON_USE_DOUBLE
typedef double JsonFloat; typedef double JsonFloat;
#else #else
typedef float JsonFloat; typedef float JsonFloat;
#endif #endif
} } // namespace ARDUINOJSON_NAMESPACE
}

View File

@ -6,18 +6,13 @@
#include "../Configuration.hpp" #include "../Configuration.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
#if ARDUINOJSON_USE_LONG_LONG #if ARDUINOJSON_USE_LONG_LONG
typedef long long JsonInteger; typedef int64_t JsonInteger;
typedef unsigned long long JsonUInt; typedef uint64_t JsonUInt;
#elif ARDUINOJSON_USE_INT64
typedef __int64 JsonInteger;
typedef unsigned _int64 JsonUInt;
#else #else
typedef long JsonInteger; typedef long JsonInteger;
typedef unsigned long JsonUInt; typedef unsigned long JsonUInt;
#endif #endif
} } // namespace ARDUINOJSON_NAMESPACE
}

View File

@ -4,8 +4,7 @@
#pragma once #pragma once
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
// A metafunction that returns the type of the value returned by // A metafunction that returns the type of the value returned by
// JsonVariant::as<T>() // JsonVariant::as<T>()
@ -19,5 +18,4 @@ struct JsonVariantAs<char*> {
typedef const char* type; typedef const char* type;
}; };
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -9,8 +9,7 @@
#include "JsonFloat.hpp" #include "JsonFloat.hpp"
#include "JsonInteger.hpp" #include "JsonInteger.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
struct JsonObjectData { struct JsonObjectData {
struct Slot* head; struct Slot* head;
struct Slot* tail; struct Slot* tail;
@ -40,5 +39,4 @@ union JsonVariantContent {
} asRaw; } asRaw;
}; };
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -7,8 +7,7 @@
#include "JsonVariantContent.hpp" #include "JsonVariantContent.hpp"
#include "JsonVariantType.hpp" #include "JsonVariantType.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
// this struct must be a POD type to prevent error calling offsetof on clang // this struct must be a POD type to prevent error calling offsetof on clang
struct JsonVariantData { struct JsonVariantData {
@ -31,5 +30,4 @@ inline JsonVariantData *getVariantData(JsonObjectData *obj) {
return reinterpret_cast<JsonVariantData *>(reinterpret_cast<char *>(obj) - return reinterpret_cast<JsonVariantData *>(reinterpret_cast<char *>(obj) -
offset); offset);
} }
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -4,13 +4,11 @@
#pragma once #pragma once
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
class JsonArray; class JsonArray;
class JsonObject; class JsonObject;
class JsonVariant; class JsonVariant;
namespace Internals {
// A metafunction that returns the type of the value returned by // A metafunction that returns the type of the value returned by
// JsonVariant::to<T>() // JsonVariant::to<T>()
template <typename T> template <typename T>
@ -29,5 +27,4 @@ struct JsonVariantTo<JsonVariant> {
typedef JsonVariant type; typedef JsonVariant type;
}; };
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -4,10 +4,7 @@
#pragma once #pragma once
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
// Enumerated type to know the current type of a JsonVariant. // Enumerated type to know the current type of a JsonVariant.
// The value determines which member of JsonVariantContent is used. // The value determines which member of JsonVariantContent is used.
enum JsonVariantType { enum JsonVariantType {
@ -23,5 +20,4 @@ enum JsonVariantType {
JSON_OBJECT, JSON_OBJECT,
JSON_FLOAT JSON_FLOAT
}; };
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -7,8 +7,7 @@
#include "../Memory/AllocableInMemoryPool.hpp" #include "../Memory/AllocableInMemoryPool.hpp"
#include "JsonVariantData.hpp" #include "JsonVariantData.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
struct Slot : AllocableInMemoryPool { struct Slot : AllocableInMemoryPool {
JsonVariantData value; JsonVariantData value;
@ -17,5 +16,4 @@ struct Slot : AllocableInMemoryPool {
const char* key; const char* key;
}; };
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -8,8 +8,7 @@
#include <Stream.h> #include <Stream.h>
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
struct ArduinoStreamReader { struct ArduinoStreamReader {
Stream& _stream; Stream& _stream;
@ -35,7 +34,6 @@ struct ArduinoStreamReader {
inline ArduinoStreamReader makeReader(Stream& input) { inline ArduinoStreamReader makeReader(Stream& input) {
return ArduinoStreamReader(input); return ArduinoStreamReader(input);
} }
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson
#endif #endif

View File

@ -4,8 +4,7 @@
#pragma once #pragma once
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
template <typename TChar> template <typename TChar>
class UnsafeCharPointerReader { class UnsafeCharPointerReader {
@ -60,5 +59,4 @@ inline SafeCharPointerReader<char> makeReader(const String& input) {
} }
#endif #endif
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -8,7 +8,7 @@
#include <ostream> #include <ostream>
#endif #endif
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
class DeserializationError { class DeserializationError {
public: public:
@ -80,4 +80,4 @@ inline std::ostream& operator<<(std::ostream& s, DeserializationError::Code c) {
} }
#endif #endif
} // namespace ArduinoJson } // namespace ARDUINOJSON_NAMESPACE

View File

@ -6,8 +6,7 @@
#if ARDUINOJSON_ENABLE_PROGMEM #if ARDUINOJSON_ENABLE_PROGMEM
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
class UnsafeFlashStringReader { class UnsafeFlashStringReader {
const char* _ptr; const char* _ptr;
@ -50,7 +49,6 @@ inline SafeFlashStringReader makeReader(const __FlashStringHelper* input,
size_t size) { size_t size) {
return SafeFlashStringReader(input, size); return SafeFlashStringReader(input, size);
} }
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson
#endif #endif

View File

@ -4,8 +4,7 @@
#pragma once #pragma once
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
template <typename TIterator> template <typename TIterator>
class IteratorReader { class IteratorReader {
@ -30,5 +29,4 @@ inline IteratorReader<typename TInput::const_iterator> makeReader(
return IteratorReader<typename TInput::const_iterator>(input.begin(), return IteratorReader<typename TInput::const_iterator>(input.begin(),
input.end()); input.end());
} }
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -8,8 +8,7 @@
#include <istream> #include <istream>
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
class StdStreamReader { class StdStreamReader {
std::istream& _stream; std::istream& _stream;
@ -34,7 +33,6 @@ class StdStreamReader {
inline StdStreamReader makeReader(std::istream& input) { inline StdStreamReader makeReader(std::istream& input) {
return StdStreamReader(input); return StdStreamReader(input);
} }
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson
#endif #endif

View File

@ -12,8 +12,7 @@
#include "./IteratorReader.hpp" #include "./IteratorReader.hpp"
#include "./StdStreamReader.hpp" #include "./StdStreamReader.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
template <template <typename, typename> class TDeserializer, template <template <typename, typename> class TDeserializer,
typename TMemoryPool, typename TReader, typename TWriter> typename TMemoryPool, typename TReader, typename TWriter>
@ -29,10 +28,8 @@ TDeserializer<TReader, TWriter> makeDeserializer(TMemoryPool &memoryPool,
// TString = const std::string&, const String& // TString = const std::string&, const String&
template <template <typename, typename> class TDeserializer, typename TDocument, template <template <typename, typename> class TDeserializer, typename TDocument,
typename TString> typename TString>
typename Internals::enable_if<!Internals::is_array<TString>::value, typename enable_if<!is_array<TString>::value, DeserializationError>::type
DeserializationError>::type
deserialize(TDocument &doc, const TString &input) { deserialize(TDocument &doc, const TString &input) {
using namespace Internals;
return makeDeserializer<TDeserializer>( return makeDeserializer<TDeserializer>(
doc.memoryPool(), makeReader(input), doc.memoryPool(), makeReader(input),
makeStringStorage(doc.memoryPool(), input), doc.nestingLimit) makeStringStorage(doc.memoryPool(), input), doc.nestingLimit)
@ -45,7 +42,6 @@ deserialize(TDocument &doc, const TString &input) {
template <template <typename, typename> class TDeserializer, typename TDocument, template <template <typename, typename> class TDeserializer, typename TDocument,
typename TChar> typename TChar>
DeserializationError deserialize(TDocument &doc, TChar *input) { DeserializationError deserialize(TDocument &doc, TChar *input) {
using namespace Internals;
return makeDeserializer<TDeserializer>( return makeDeserializer<TDeserializer>(
doc.memoryPool(), makeReader(input), doc.memoryPool(), makeReader(input),
makeStringStorage(doc.memoryPool(), input), doc.nestingLimit) makeStringStorage(doc.memoryPool(), input), doc.nestingLimit)
@ -60,7 +56,6 @@ template <template <typename, typename> class TDeserializer, typename TDocument,
typename TChar> typename TChar>
DeserializationError deserialize(TDocument &doc, TChar *input, DeserializationError deserialize(TDocument &doc, TChar *input,
size_t inputSize) { size_t inputSize) {
using namespace Internals;
return makeDeserializer<TDeserializer>( return makeDeserializer<TDeserializer>(
doc.memoryPool(), makeReader(input, inputSize), doc.memoryPool(), makeReader(input, inputSize),
makeStringStorage(doc.memoryPool(), input), doc.nestingLimit) makeStringStorage(doc.memoryPool(), input), doc.nestingLimit)
@ -73,11 +68,9 @@ DeserializationError deserialize(TDocument &doc, TChar *input,
template <template <typename, typename> class TDeserializer, typename TDocument, template <template <typename, typename> class TDeserializer, typename TDocument,
typename TStream> typename TStream>
DeserializationError deserialize(TDocument &doc, TStream &input) { DeserializationError deserialize(TDocument &doc, TStream &input) {
using namespace Internals;
return makeDeserializer<TDeserializer>( return makeDeserializer<TDeserializer>(
doc.memoryPool(), makeReader(input), doc.memoryPool(), makeReader(input),
makeStringStorage(doc.memoryPool(), input), doc.nestingLimit) makeStringStorage(doc.memoryPool(), input), doc.nestingLimit)
.parse(doc.template to<JsonVariant>()); .parse(doc.template to<JsonVariant>());
} }
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -8,7 +8,7 @@
#include "JsonVariant.hpp" #include "JsonVariant.hpp"
#include "Memory/DynamicMemoryPool.hpp" #include "Memory/DynamicMemoryPool.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
class DynamicJsonDocument { class DynamicJsonDocument {
public: public:
@ -25,19 +25,19 @@ class DynamicJsonDocument {
} }
template <typename T> template <typename T>
typename Internals::JsonVariantAs<T>::type as() const { typename JsonVariantAs<T>::type as() const {
return getVariant().as<T>(); return getVariant().as<T>();
} }
template <typename T> template <typename T>
typename Internals::JsonVariantTo<T>::type to() { typename JsonVariantTo<T>::type to() {
_memoryPool.clear(); _memoryPool.clear();
return getVariant().to<T>(); return getVariant().to<T>();
} }
void clear() { void clear() {
_memoryPool.clear(); _memoryPool.clear();
_rootData.type = Internals::JSON_NULL; _rootData.type = JSON_NULL;
} }
size_t memoryUsage() const { size_t memoryUsage() const {
@ -49,7 +49,7 @@ class DynamicJsonDocument {
return getVariant().accept(visitor); return getVariant().accept(visitor);
} }
Internals::DynamicMemoryPool& memoryPool() { DynamicMemoryPool& memoryPool() {
return _memoryPool; return _memoryPool;
} }
@ -58,7 +58,7 @@ class DynamicJsonDocument {
return JsonVariant(&_memoryPool, &_rootData); return JsonVariant(&_memoryPool, &_rootData);
} }
mutable Internals::DynamicMemoryPool _memoryPool; mutable DynamicMemoryPool _memoryPool;
mutable Internals::JsonVariantData _rootData; mutable JsonVariantData _rootData;
}; };
} // namespace ArduinoJson } // namespace ARDUINOJSON_NAMESPACE

View File

@ -4,8 +4,7 @@
#pragma once #pragma once
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
class EscapeSequence { class EscapeSequence {
public: public:
@ -33,5 +32,4 @@ class EscapeSequence {
return &"\"\"\\\\b\bf\fn\nr\rt\t"[excludeIdenticals ? 4 : 0]; return &"\"\"\\\\b\bf\fn\nr\rt\t"[excludeIdenticals ? 4 : 0];
} }
}; };
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -4,8 +4,7 @@
#pragma once #pragma once
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
// Decorator on top of Print to allow indented output. // Decorator on top of Print to allow indented output.
// This class is used by serializeJsonPretty() but can also be used // This class is used by serializeJsonPretty() but can also be used
@ -67,5 +66,4 @@ class IndentedPrint {
static const int MAX_LEVEL = 15; // because it's only 4 bits static const int MAX_LEVEL = 15; // because it's only 4 bits
static const int MAX_TAB_SIZE = 7; // because it's only 3 bits static const int MAX_TAB_SIZE = 7; // because it's only 3 bits
}; };
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -12,8 +12,7 @@
#include "../Polyfills/type_traits.hpp" #include "../Polyfills/type_traits.hpp"
#include "./EscapeSequence.hpp" #include "./EscapeSequence.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
template <typename TReader, typename TStringStorage> template <typename TReader, typename TStringStorage>
class JsonDeserializer { class JsonDeserializer {
@ -339,31 +338,26 @@ class JsonDeserializer {
uint8_t _nestingLimit; uint8_t _nestingLimit;
char _current; char _current;
bool _loaded; bool _loaded;
}; // namespace Internals };
} // namespace Internals
template <typename TDocument, typename TInput> template <typename TDocument, typename TInput>
DeserializationError deserializeJson(TDocument &doc, const TInput &input) { DeserializationError deserializeJson(TDocument &doc, const TInput &input) {
using namespace Internals;
return deserialize<JsonDeserializer>(doc, input); return deserialize<JsonDeserializer>(doc, input);
} }
template <typename TDocument, typename TInput> template <typename TDocument, typename TInput>
DeserializationError deserializeJson(TDocument &doc, TInput *input) { DeserializationError deserializeJson(TDocument &doc, TInput *input) {
using namespace Internals;
return deserialize<JsonDeserializer>(doc, input); return deserialize<JsonDeserializer>(doc, input);
} }
template <typename TDocument, typename TInput> template <typename TDocument, typename TInput>
DeserializationError deserializeJson(TDocument &doc, TInput *input, DeserializationError deserializeJson(TDocument &doc, TInput *input,
size_t inputSize) { size_t inputSize) {
using namespace Internals;
return deserialize<JsonDeserializer>(doc, input, inputSize); return deserialize<JsonDeserializer>(doc, input, inputSize);
} }
template <typename TDocument, typename TInput> template <typename TDocument, typename TInput>
DeserializationError deserializeJson(TDocument &doc, TInput &input) { DeserializationError deserializeJson(TDocument &doc, TInput &input) {
using namespace Internals;
return deserialize<JsonDeserializer>(doc, input); return deserialize<JsonDeserializer>(doc, input);
} }
} // namespace ArduinoJson } // namespace ARDUINOJSON_NAMESPACE

View File

@ -8,8 +8,7 @@
#include "../Serialization/serialize.hpp" #include "../Serialization/serialize.hpp"
#include "./JsonWriter.hpp" #include "./JsonWriter.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
template <typename TWriter> template <typename TWriter>
class JsonSerializer { class JsonSerializer {
@ -88,23 +87,18 @@ class JsonSerializer {
JsonWriter<TWriter> _writer; JsonWriter<TWriter> _writer;
}; };
} // namespace Internals
template <typename TSource, typename TDestination> template <typename TSource, typename TDestination>
size_t serializeJson(const TSource &source, TDestination &destination) { size_t serializeJson(const TSource &source, TDestination &destination) {
using namespace Internals;
return serialize<JsonSerializer>(source, destination); return serialize<JsonSerializer>(source, destination);
} }
template <typename TSource> template <typename TSource>
size_t serializeJson(const TSource &source, char *buffer, size_t bufferSize) { size_t serializeJson(const TSource &source, char *buffer, size_t bufferSize) {
using namespace Internals;
return serialize<JsonSerializer>(source, buffer, bufferSize); return serialize<JsonSerializer>(source, buffer, bufferSize);
} }
template <typename TSource> template <typename TSource>
size_t measureJson(const TSource &source) { size_t measureJson(const TSource &source) {
using namespace Internals;
return measure<JsonSerializer>(source); return measure<JsonSerializer>(source);
} }
@ -122,7 +116,6 @@ inline std::ostream &operator<<(std::ostream &os, const JsonVariant &source) {
return os; return os;
} }
namespace Internals {
inline std::ostream &operator<<(std::ostream &os, inline std::ostream &operator<<(std::ostream &os,
const JsonArraySubscript &source) { const JsonArraySubscript &source) {
serializeJson(source, os); serializeJson(source, os);
@ -135,8 +128,6 @@ inline std::ostream &operator<<(std::ostream &os,
serializeJson(source, os); serializeJson(source, os);
return os; return os;
} }
} // namespace Internals
#endif #endif
} // namespace ArduinoJson } // namespace ARDUINOJSON_NAMESPACE

View File

@ -11,8 +11,7 @@
#include "../Polyfills/attributes.hpp" #include "../Polyfills/attributes.hpp"
#include "./EscapeSequence.hpp" #include "./EscapeSequence.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
template <typename TWriter> template <typename TWriter>
class JsonWriter { class JsonWriter {
@ -154,5 +153,4 @@ class JsonWriter {
private: private:
JsonWriter &operator=(const JsonWriter &); // cannot be assigned JsonWriter &operator=(const JsonWriter &); // cannot be assigned
}; };
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -10,8 +10,7 @@
#include "./JsonSerializer.hpp" #include "./JsonSerializer.hpp"
#include "./Prettyfier.hpp" #include "./Prettyfier.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
template <typename TPrint> template <typename TPrint>
class PrettyJsonSerializer_Base { class PrettyJsonSerializer_Base {
@ -33,25 +32,21 @@ class PrettyJsonSerializer : PrettyJsonSerializer_Base<TPrint>,
JsonSerializer<Prettyfier<TPrint> >( JsonSerializer<Prettyfier<TPrint> >(
PrettyJsonSerializer_Base<TPrint>::_prettyfier) {} PrettyJsonSerializer_Base<TPrint>::_prettyfier) {}
}; };
} // namespace Internals
template <typename TSource, typename TDestination> template <typename TSource, typename TDestination>
size_t serializeJsonPretty(TSource &source, TDestination &destination) { size_t serializeJsonPretty(TSource &source, TDestination &destination) {
using namespace Internals;
return serialize<PrettyJsonSerializer>(source, destination); return serialize<PrettyJsonSerializer>(source, destination);
} }
template <typename TSource> template <typename TSource>
size_t serializeJsonPretty(const TSource &source, char *buffer, size_t serializeJsonPretty(const TSource &source, char *buffer,
size_t bufferSize) { size_t bufferSize) {
using namespace Internals;
return serialize<PrettyJsonSerializer>(source, buffer, bufferSize); return serialize<PrettyJsonSerializer>(source, buffer, bufferSize);
} }
template <typename TSource> template <typename TSource>
size_t measureJsonPretty(const TSource &source) { size_t measureJsonPretty(const TSource &source) {
using namespace Internals;
return measure<PrettyJsonSerializer>(source); return measure<PrettyJsonSerializer>(source);
} }
} // namespace ArduinoJson } // namespace ARDUINOJSON_NAMESPACE

View File

@ -6,8 +6,7 @@
#include "IndentedPrint.hpp" #include "IndentedPrint.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
// Converts a compact JSON string into an indented one. // Converts a compact JSON string into an indented one.
template <typename TWriter> template <typename TWriter>
@ -141,5 +140,4 @@ class Prettyfier {
IndentedPrint<TWriter>& _sink; IndentedPrint<TWriter>& _sink;
bool _inString; bool _inString;
}; };
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -10,14 +10,12 @@
// Returns the size (in bytes) of an array with n elements. // Returns the size (in bytes) of an array with n elements.
// Can be very handy to determine the size of a StaticMemoryPool. // Can be very handy to determine the size of a StaticMemoryPool.
#define JSON_ARRAY_SIZE(NUMBER_OF_ELEMENTS) \ #define JSON_ARRAY_SIZE(NUMBER_OF_ELEMENTS) \
((NUMBER_OF_ELEMENTS) * sizeof(ArduinoJson::Internals::Slot)) ((NUMBER_OF_ELEMENTS) * sizeof(ARDUINOJSON_NAMESPACE::Slot))
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
class JsonObject; class JsonObject;
namespace Internals {
class JsonArraySubscript; class JsonArraySubscript;
}
class JsonArray { class JsonArray {
friend class JsonVariant; friend class JsonVariant;
@ -26,12 +24,10 @@ class JsonArray {
typedef JsonArrayIterator iterator; typedef JsonArrayIterator iterator;
FORCE_INLINE JsonArray() : _memoryPool(0), _data(0) {} FORCE_INLINE JsonArray() : _memoryPool(0), _data(0) {}
FORCE_INLINE JsonArray(Internals::MemoryPool* pool, FORCE_INLINE JsonArray(MemoryPool* pool, JsonArrayData* arr)
Internals::JsonArrayData* arr)
: _memoryPool(pool), _data(arr) {} : _memoryPool(pool), _data(arr) {}
operator JsonVariant() { operator JsonVariant() {
using namespace Internals;
return JsonVariant(_memoryPool, getVariantData(_data)); return JsonVariant(_memoryPool, getVariantData(_data));
} }
@ -59,7 +55,7 @@ class JsonArray {
JsonVariant add() { JsonVariant add() {
if (!_data) return JsonVariant(); if (!_data) return JsonVariant();
Internals::Slot* slot = new (_memoryPool) Internals::Slot(); Slot* slot = new (_memoryPool) Slot();
if (!slot) return JsonVariant(); if (!slot) return JsonVariant();
slot->next = 0; slot->next = 0;
@ -151,10 +147,9 @@ class JsonArray {
FORCE_INLINE JsonArray createNestedArray(); FORCE_INLINE JsonArray createNestedArray();
FORCE_INLINE JsonObject createNestedObject(); FORCE_INLINE JsonObject createNestedObject();
FORCE_INLINE Internals::JsonArraySubscript operator[](size_t index); FORCE_INLINE JsonArraySubscript operator[](size_t index);
FORCE_INLINE const Internals::JsonArraySubscript operator[]( FORCE_INLINE const JsonArraySubscript operator[](size_t index) const;
size_t index) const;
FORCE_INLINE bool operator==(JsonArray rhs) const { FORCE_INLINE bool operator==(JsonArray rhs) const {
iterator it1 = begin(); iterator it1 = begin();
@ -171,8 +166,7 @@ class JsonArray {
// Gets the value at the specified index. // Gets the value at the specified index.
template <typename T> template <typename T>
FORCE_INLINE typename Internals::JsonVariantAs<T>::type get( FORCE_INLINE typename JsonVariantAs<T>::type get(size_t index) const {
size_t index) const {
iterator it = begin() += index; iterator it = begin() += index;
return it != end() ? it->as<T>() : T(); return it != end() ? it->as<T>() : T();
} }
@ -188,7 +182,7 @@ class JsonArray {
FORCE_INLINE void remove(iterator it) { FORCE_INLINE void remove(iterator it) {
if (!_data) return; if (!_data) return;
Internals::Slot* slot = it.internal(); Slot* slot = it.internal();
if (!slot) return; if (!slot) return;
if (slot->prev) if (slot->prev)
@ -235,7 +229,7 @@ class JsonArray {
FORCE_INLINE size_t size() const { FORCE_INLINE size_t size() const {
if (!_data) return 0; if (!_data) return 0;
Internals::Slot* slot = _data->head; Slot* slot = _data->head;
size_t n = 0; size_t n = 0;
while (slot) { while (slot) {
slot = slot->next; slot = slot->next;
@ -269,7 +263,7 @@ class JsonArray {
return add().set(value); return add().set(value);
} }
Internals::MemoryPool* _memoryPool; MemoryPool* _memoryPool;
Internals::JsonArrayData* _data; JsonArrayData* _data;
}; };
} // namespace ArduinoJson } // namespace ARDUINOJSON_NAMESPACE

View File

@ -7,7 +7,7 @@
#include "JsonArray.hpp" #include "JsonArray.hpp"
#include "JsonObject.hpp" #include "JsonObject.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
inline JsonArray JsonArray::createNestedArray() { inline JsonArray JsonArray::createNestedArray() {
return add().to<JsonArray>(); return add().to<JsonArray>();
@ -16,4 +16,4 @@ inline JsonArray JsonArray::createNestedArray() {
inline JsonObject JsonArray::createNestedObject() { inline JsonObject JsonArray::createNestedObject() {
return add().to<JsonObject>(); return add().to<JsonObject>();
} }
} // namespace ArduinoJson } // namespace ARDUINOJSON_NAMESPACE

View File

@ -7,12 +7,11 @@
#include "Data/Slot.hpp" #include "Data/Slot.hpp"
#include "JsonVariant.hpp" #include "JsonVariant.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
class JsonVariantPtr { class JsonVariantPtr {
public: public:
JsonVariantPtr(Internals::MemoryPool *memoryPool, JsonVariantPtr(MemoryPool *memoryPool, JsonVariantData *data)
Internals::JsonVariantData *data)
: _variant(memoryPool, data) {} : _variant(memoryPool, data) {}
JsonVariant *operator->() { JsonVariant *operator->() {
@ -30,8 +29,7 @@ class JsonVariantPtr {
class JsonArrayIterator { class JsonArrayIterator {
public: public:
JsonArrayIterator() : _slot(0) {} JsonArrayIterator() : _slot(0) {}
explicit JsonArrayIterator(Internals::MemoryPool *memoryPool, explicit JsonArrayIterator(MemoryPool *memoryPool, Slot *iterator)
Internals::Slot *iterator)
: _memoryPool(memoryPool), _slot(iterator) {} : _memoryPool(memoryPool), _slot(iterator) {}
JsonVariant operator*() const { JsonVariant operator*() const {
@ -62,12 +60,12 @@ class JsonArrayIterator {
return *this; return *this;
} }
Internals::Slot *internal() { Slot *internal() {
return _slot; return _slot;
} }
private: private:
Internals::MemoryPool *_memoryPool; MemoryPool *_memoryPool;
Internals::Slot *_slot; Slot *_slot;
}; };
} // namespace ArduinoJson } // namespace ARDUINOJSON_NAMESPACE

View File

@ -12,8 +12,7 @@
#pragma warning(disable : 4522) #pragma warning(disable : 4522)
#endif #endif
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
class JsonArraySubscript : public JsonVariantBase<JsonArraySubscript> { class JsonArraySubscript : public JsonVariantBase<JsonArraySubscript> {
public: public:
FORCE_INLINE JsonArraySubscript(JsonArray array, size_t index) FORCE_INLINE JsonArraySubscript(JsonArray array, size_t index)
@ -100,17 +99,15 @@ inline const JsonArraySubscript JsonVariantSubscripts<TImpl>::operator[](
size_t index) const { size_t index) const {
return impl()->template as<JsonArray>()[index]; return impl()->template as<JsonArray>()[index];
} }
} // namespace Internals
inline Internals::JsonArraySubscript JsonArray::operator[](size_t index) { inline JsonArraySubscript JsonArray::operator[](size_t index) {
return Internals::JsonArraySubscript(*this, index); return JsonArraySubscript(*this, index);
} }
inline const Internals::JsonArraySubscript JsonArray::operator[]( inline const JsonArraySubscript JsonArray::operator[](size_t index) const {
size_t index) const { return JsonArraySubscript(*this, index);
return Internals::JsonArraySubscript(*this, index);
} }
} // namespace ArduinoJson } // namespace ARDUINOJSON_NAMESPACE
#ifdef _MSC_VER #ifdef _MSC_VER
#pragma warning(pop) #pragma warning(pop)

View File

@ -9,9 +9,9 @@
// Returns the size (in bytes) of an object with n elements. // Returns the size (in bytes) of an object with n elements.
// Can be very handy to determine the size of a StaticMemoryPool. // Can be very handy to determine the size of a StaticMemoryPool.
#define JSON_OBJECT_SIZE(NUMBER_OF_ELEMENTS) \ #define JSON_OBJECT_SIZE(NUMBER_OF_ELEMENTS) \
((NUMBER_OF_ELEMENTS) * sizeof(ArduinoJson::Internals::Slot)) ((NUMBER_OF_ELEMENTS) * sizeof(ARDUINOJSON_NAMESPACE::Slot))
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
class JsonObject { class JsonObject {
friend class JsonVariant; friend class JsonVariant;
@ -20,12 +20,10 @@ class JsonObject {
typedef JsonObjectIterator iterator; typedef JsonObjectIterator iterator;
FORCE_INLINE JsonObject() : _memoryPool(0), _data(0) {} FORCE_INLINE JsonObject() : _memoryPool(0), _data(0) {}
FORCE_INLINE JsonObject(Internals::MemoryPool* buf, FORCE_INLINE JsonObject(MemoryPool* buf, JsonObjectData* object)
Internals::JsonObjectData* object)
: _memoryPool(buf), _data(object) {} : _memoryPool(buf), _data(object) {}
operator JsonVariant() { operator JsonVariant() {
using namespace Internals;
return JsonVariant(_memoryPool, getVariantData(_data)); return JsonVariant(_memoryPool, getVariantData(_data));
} }
@ -103,7 +101,7 @@ class JsonObject {
// TValue = bool, char, long, int, short, float, double, // TValue = bool, char, long, int, short, float, double,
// std::string, String, JsonArray, JsonObject // std::string, String, JsonArray, JsonObject
template <typename TValue, typename TString> template <typename TValue, typename TString>
FORCE_INLINE typename Internals::JsonVariantAs<TValue>::type get( FORCE_INLINE typename JsonVariantAs<TValue>::type get(
const TString& key) const { const TString& key) const {
return get_impl<const TString&, TValue>(key); return get_impl<const TString&, TValue>(key);
} }
@ -113,8 +111,7 @@ class JsonObject {
// TValue = bool, char, long, int, short, float, double, // TValue = bool, char, long, int, short, float, double,
// std::string, String, JsonArray, JsonObject // std::string, String, JsonArray, JsonObject
template <typename TValue, typename TString> template <typename TValue, typename TString>
FORCE_INLINE typename Internals::JsonVariantAs<TValue>::type get( FORCE_INLINE typename JsonVariantAs<TValue>::type get(TString* key) const {
TString* key) const {
return get_impl<TString*, TValue>(key); return get_impl<TString*, TValue>(key);
} }
@ -144,17 +141,16 @@ class JsonObject {
// JsonObjectSubscript operator[](TKey) // JsonObjectSubscript operator[](TKey)
// TKey = const std::string&, const String& // TKey = const std::string&, const String&
template <typename TString> template <typename TString>
FORCE_INLINE Internals::JsonObjectSubscript<const TString&> operator[]( FORCE_INLINE JsonObjectSubscript<const TString&> operator[](
const TString& key) { const TString& key) {
return Internals::JsonObjectSubscript<const TString&>(*this, key); return JsonObjectSubscript<const TString&>(*this, key);
} }
// //
// JsonObjectSubscript operator[](TKey) // JsonObjectSubscript operator[](TKey)
// TKey = char*, const char*, char[], const char[N], const FlashStringHelper* // TKey = char*, const char*, char[], const char[N], const FlashStringHelper*
template <typename TString> template <typename TString>
FORCE_INLINE Internals::JsonObjectSubscript<TString*> operator[]( FORCE_INLINE JsonObjectSubscript<TString*> operator[](TString* key) {
TString* key) { return JsonObjectSubscript<TString*>(*this, key);
return Internals::JsonObjectSubscript<TString*>(*this, key);
} }
// Gets the value associated with the specified key. // Gets the value associated with the specified key.
@ -162,17 +158,17 @@ class JsonObject {
// const JsonObjectSubscript operator[](TKey) const; // const JsonObjectSubscript operator[](TKey) const;
// TKey = const std::string&, const String& // TKey = const std::string&, const String&
template <typename TString> template <typename TString>
FORCE_INLINE const Internals::JsonObjectSubscript<const TString&> operator[]( FORCE_INLINE const JsonObjectSubscript<const TString&> operator[](
const TString& key) const { const TString& key) const {
return Internals::JsonObjectSubscript<const TString&>(*this, key); return JsonObjectSubscript<const TString&>(*this, key);
} }
// //
// 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 const Internals::JsonObjectSubscript<TString*> operator[]( FORCE_INLINE const JsonObjectSubscript<TString*> operator[](
TString* key) const { TString* key) const {
return Internals::JsonObjectSubscript<TString*>(*this, key); return JsonObjectSubscript<TString*>(*this, key);
} }
FORCE_INLINE bool operator==(JsonObject rhs) const { FORCE_INLINE bool operator==(JsonObject rhs) const {
@ -185,7 +181,7 @@ class JsonObject {
FORCE_INLINE void remove(iterator it) { FORCE_INLINE void remove(iterator it) {
if (!_data) return; if (!_data) return;
Internals::Slot* slot = it.internal(); Slot* slot = it.internal();
if (!slot) return; if (!slot) return;
if (slot->prev) if (slot->prev)
slot->prev->next = slot->next; slot->prev->next = slot->next;
@ -262,7 +258,7 @@ class JsonObject {
FORCE_INLINE size_t size() const { FORCE_INLINE size_t size() const {
if (!_data) return 0; if (!_data) return 0;
size_t n = 0; size_t n = 0;
Internals::Slot* slot = _data->head; Slot* slot = _data->head;
while (slot) { while (slot) {
n++; n++;
slot = slot->next; slot = slot->next;
@ -296,38 +292,38 @@ class JsonObject {
// Returns the list node that matches the specified key. // Returns the list node that matches the specified key.
template <typename TStringRef> template <typename TStringRef>
Internals::Slot* findSlot(TStringRef key) { Slot* findSlot(TStringRef key) {
if (!_data) return 0; if (!_data) return 0;
Internals::Slot* slot = _data->head; Slot* slot = _data->head;
while (slot) { while (slot) {
if (Internals::makeString(key).equals(slot->key)) break; if (makeString(key).equals(slot->key)) break;
slot = slot->next; slot = slot->next;
} }
return slot; return slot;
} }
template <typename TStringRef> template <typename TStringRef>
FORCE_INLINE Internals::Slot* findSlot(TStringRef key) const { FORCE_INLINE Slot* findSlot(TStringRef key) const {
return const_cast<JsonObject*>(this)->findSlot<TStringRef>(key); return const_cast<JsonObject*>(this)->findSlot<TStringRef>(key);
} }
template <typename TStringRef, typename TValue> template <typename TStringRef, typename TValue>
FORCE_INLINE typename Internals::JsonVariantAs<TValue>::type get_impl( FORCE_INLINE typename JsonVariantAs<TValue>::type get_impl(
TStringRef key) const { TStringRef key) const {
Internals::Slot* slot = findSlot<TStringRef>(key); Slot* slot = findSlot<TStringRef>(key);
return slot ? JsonVariant(_memoryPool, &slot->value).as<TValue>() return slot ? JsonVariant(_memoryPool, &slot->value).as<TValue>()
: TValue(); : TValue();
} }
template <typename TStringRef, typename TValue> template <typename TStringRef, typename TValue>
FORCE_INLINE bool is_impl(TStringRef key) const { FORCE_INLINE bool is_impl(TStringRef key) const {
Internals::Slot* slot = findSlot<TStringRef>(key); Slot* slot = findSlot<TStringRef>(key);
return slot ? JsonVariant(_memoryPool, &slot->value).is<TValue>() : false; return slot ? JsonVariant(_memoryPool, &slot->value).is<TValue>() : false;
} }
template <typename TStringRef> template <typename TStringRef>
FORCE_INLINE void remove_impl(TStringRef key) { FORCE_INLINE void remove_impl(TStringRef key) {
if (!_data) return; if (!_data) return;
Internals::Slot* slot = findSlot<TStringRef>(key); Slot* slot = findSlot<TStringRef>(key);
if (!slot) return; if (!slot) return;
if (slot->prev) if (slot->prev)
slot->prev->next = slot->next; slot->prev->next = slot->next;
@ -344,13 +340,13 @@ class JsonObject {
if (!_data) return JsonVariant(); if (!_data) return JsonVariant();
// ignore null key // ignore null key
if (Internals::makeString(key).is_null()) return JsonVariant(); if (makeString(key).is_null()) return JsonVariant();
// search a matching key // search a matching key
Internals::Slot* slot = findSlot<TStringRef>(key); Slot* slot = findSlot<TStringRef>(key);
if (!slot) { if (!slot) {
// add the key // add the key
slot = new (_memoryPool) Internals::Slot(); slot = new (_memoryPool) Slot();
if (!slot) return JsonVariant(); if (!slot) return JsonVariant();
slot->next = 0; slot->next = 0;
@ -371,20 +367,20 @@ class JsonObject {
return JsonVariant(_memoryPool, &slot->value); return JsonVariant(_memoryPool, &slot->value);
} }
FORCE_INLINE bool set_key(Internals::Slot* slot, const char* key) { FORCE_INLINE bool set_key(Slot* slot, const char* key) {
slot->key = key; slot->key = key;
return true; return true;
} }
template <typename T> template <typename T>
FORCE_INLINE bool set_key(Internals::Slot* slot, const T& key) { FORCE_INLINE bool set_key(Slot* slot, const T& key) {
const char* dup = Internals::makeString(key).save(_memoryPool); const char* dup = makeString(key).save(_memoryPool);
if (!dup) return false; if (!dup) return false;
slot->key = dup; slot->key = dup;
return true; return true;
} }
mutable Internals::MemoryPool* _memoryPool; mutable MemoryPool* _memoryPool;
mutable Internals::JsonObjectData* _data; mutable JsonObjectData* _data;
}; // namespace ArduinoJson }; // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson } // namespace ARDUINOJSON_NAMESPACE

View File

@ -7,7 +7,7 @@
#include "JsonArray.hpp" #include "JsonArray.hpp"
#include "JsonObject.hpp" #include "JsonObject.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
template <typename TString> template <typename TString>
inline JsonArray JsonObject::createNestedArray(const TString& key) { inline JsonArray JsonObject::createNestedArray(const TString& key) {
@ -30,4 +30,4 @@ inline JsonObject JsonObject::createNestedObject_impl(TStringRef key) {
if (!_data) return JsonObject(); if (!_data) return JsonObject();
return set(key).template to<JsonObject>(); return set(key).template to<JsonObject>();
} }
} // namespace ArduinoJson } // namespace ARDUINOJSON_NAMESPACE

View File

@ -6,12 +6,11 @@
#include "JsonPair.hpp" #include "JsonPair.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
class JsonPairPtr { class JsonPairPtr {
public: public:
JsonPairPtr(Internals::MemoryPool *memoryPool, Internals::Slot *slot) JsonPairPtr(MemoryPool *memoryPool, Slot *slot) : _pair(memoryPool, slot) {}
: _pair(memoryPool, slot) {}
const JsonPair *operator->() const { const JsonPair *operator->() const {
return &_pair; return &_pair;
@ -29,8 +28,7 @@ class JsonObjectIterator {
public: public:
JsonObjectIterator() : _slot(0) {} JsonObjectIterator() : _slot(0) {}
explicit JsonObjectIterator(Internals::MemoryPool *memoryPool, explicit JsonObjectIterator(MemoryPool *memoryPool, Slot *slot)
Internals::Slot *slot)
: _memoryPool(memoryPool), _slot(slot) {} : _memoryPool(memoryPool), _slot(slot) {}
JsonPair operator*() const { JsonPair operator*() const {
@ -61,12 +59,12 @@ class JsonObjectIterator {
return *this; return *this;
} }
Internals::Slot *internal() { Slot *internal() {
return _slot; return _slot;
} }
private: private:
Internals::MemoryPool *_memoryPool; MemoryPool *_memoryPool;
Internals::Slot *_slot; Slot *_slot;
}; };
} // namespace ArduinoJson } // namespace ARDUINOJSON_NAMESPACE

View File

@ -13,8 +13,7 @@
#pragma warning(disable : 4522) #pragma warning(disable : 4522)
#endif #endif
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
template <typename TStringRef> template <typename TStringRef>
class JsonObjectSubscript class JsonObjectSubscript
@ -130,8 +129,7 @@ inline typename enable_if<IsString<TString *>::value,
return impl()->template as<JsonObject>()[key]; return impl()->template as<JsonObject>()[key];
} }
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson
#ifdef _MSC_VER #ifdef _MSC_VER
#pragma warning(pop) #pragma warning(pop)

View File

@ -6,12 +6,12 @@
#include "JsonVariant.hpp" #include "JsonVariant.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
// A key value pair for JsonObjectData. // A key value pair for JsonObjectData.
class JsonPair { class JsonPair {
public: public:
JsonPair(Internals::MemoryPool* memoryPool, Internals::Slot* slot) { JsonPair(MemoryPool* memoryPool, Slot* slot) {
if (slot) { if (slot) {
_key = slot->key; _key = slot->key;
_value = JsonVariant(memoryPool, &slot->value); _value = JsonVariant(memoryPool, &slot->value);
@ -32,4 +32,4 @@ class JsonPair {
const char* _key; const char* _key;
JsonVariant _value; JsonVariant _value;
}; };
} // namespace ArduinoJson } // namespace ARDUINOJSON_NAMESPACE

View File

@ -17,7 +17,7 @@
#include "Serialization/DynamicStringWriter.hpp" #include "Serialization/DynamicStringWriter.hpp"
#include "SerializedValue.hpp" #include "SerializedValue.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
// Forward declarations. // Forward declarations.
class JsonArray; class JsonArray;
@ -30,11 +30,10 @@ class JsonObject;
// - a char, short, int or a long (signed or unsigned) // - a char, short, int or a long (signed or unsigned)
// - a string (const char*) // - a string (const char*)
// - a reference to a JsonArray or JsonObject // - a reference to a JsonArray or JsonObject
class JsonVariant : public Internals::JsonVariantBase<JsonVariant> { class JsonVariant : public JsonVariantBase<JsonVariant> {
public: public:
// Intenal use only // Intenal use only
FORCE_INLINE JsonVariant(Internals::MemoryPool *memoryPool, FORCE_INLINE JsonVariant(MemoryPool *memoryPool, JsonVariantData *data)
Internals::JsonVariantData *data)
: _memoryPool(memoryPool), _data(data) {} : _memoryPool(memoryPool), _data(data) {}
// Creates an uninitialized JsonVariant // Creates an uninitialized JsonVariant
@ -43,8 +42,8 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
// set(bool value) // set(bool value)
FORCE_INLINE bool set(bool value) { FORCE_INLINE bool set(bool value) {
if (!_data) return false; if (!_data) return false;
_data->type = Internals::JSON_BOOLEAN; _data->type = JSON_BOOLEAN;
_data->content.asInteger = static_cast<Internals::JsonUInt>(value); _data->content.asInteger = static_cast<JsonUInt>(value);
return true; return true;
} }
@ -52,11 +51,10 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
// set(float value); // set(float value);
template <typename T> template <typename T>
FORCE_INLINE bool set( FORCE_INLINE bool set(
T value, typename Internals::enable_if< T value, typename enable_if<is_floating_point<T>::value>::type * = 0) {
Internals::is_floating_point<T>::value>::type * = 0) {
if (!_data) return false; if (!_data) return false;
_data->type = Internals::JSON_FLOAT; _data->type = JSON_FLOAT;
_data->content.asFloat = static_cast<Internals::JsonFloat>(value); _data->content.asFloat = static_cast<JsonFloat>(value);
return true; return true;
} }
@ -66,18 +64,16 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
// set(signed long) // set(signed long)
// set(signed char) // set(signed char)
template <typename T> template <typename T>
FORCE_INLINE bool set( FORCE_INLINE bool set(T value,
T value, typename enable_if<is_integral<T>::value &&
typename Internals::enable_if<Internals::is_integral<T>::value && is_signed<T>::value>::type * = 0) {
Internals::is_signed<T>::value>::type * =
0) {
if (!_data) return false; if (!_data) return false;
if (value >= 0) { if (value >= 0) {
_data->type = Internals::JSON_POSITIVE_INTEGER; _data->type = JSON_POSITIVE_INTEGER;
_data->content.asInteger = static_cast<Internals::JsonUInt>(value); _data->content.asInteger = static_cast<JsonUInt>(value);
} else { } else {
_data->type = Internals::JSON_NEGATIVE_INTEGER; _data->type = JSON_NEGATIVE_INTEGER;
_data->content.asInteger = ~static_cast<Internals::JsonUInt>(value) + 1; _data->content.asInteger = ~static_cast<JsonUInt>(value) + 1;
} }
return true; return true;
} }
@ -86,21 +82,19 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
// set(unsigned int) // set(unsigned int)
// set(unsigned long) // set(unsigned long)
template <typename T> template <typename T>
FORCE_INLINE bool set( FORCE_INLINE bool set(T value,
T value, typename enable_if<is_integral<T>::value &&
typename Internals::enable_if<Internals::is_integral<T>::value && is_unsigned<T>::value>::type * = 0) {
Internals::is_unsigned<T>::value>::type * =
0) {
if (!_data) return false; if (!_data) return false;
_data->type = Internals::JSON_POSITIVE_INTEGER; _data->type = JSON_POSITIVE_INTEGER;
_data->content.asInteger = static_cast<Internals::JsonUInt>(value); _data->content.asInteger = static_cast<JsonUInt>(value);
return true; return true;
} }
// set(SerializedValue<const char *>) // set(SerializedValue<const char *>)
FORCE_INLINE bool set(Internals::SerializedValue<const char *> value) { FORCE_INLINE bool set(SerializedValue<const char *> value) {
if (!_data) return false; if (!_data) return false;
_data->type = Internals::JSON_LINKED_RAW; _data->type = JSON_LINKED_RAW;
_data->content.asRaw.data = value.data(); _data->content.asRaw.data = value.data();
_data->content.asRaw.size = value.size(); _data->content.asRaw.size = value.size();
return true; return true;
@ -111,19 +105,17 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
// set(SerializedValue<const __FlashStringHelper*>) // set(SerializedValue<const __FlashStringHelper*>)
template <typename T> template <typename T>
FORCE_INLINE bool set( FORCE_INLINE bool set(
Internals::SerializedValue<T> value, SerializedValue<T> value,
typename Internals::enable_if< typename enable_if<!is_same<const char *, T>::value>::type * = 0) {
!Internals::is_same<const char *, T>::value>::type * = 0) {
if (!_data) return false; if (!_data) return false;
const char *dup = const char *dup = makeString(value.data(), value.size()).save(_memoryPool);
Internals::makeString(value.data(), value.size()).save(_memoryPool);
if (dup) { if (dup) {
_data->type = Internals::JSON_OWNED_RAW; _data->type = JSON_OWNED_RAW;
_data->content.asRaw.data = dup; _data->content.asRaw.data = dup;
_data->content.asRaw.size = value.size(); _data->content.asRaw.size = value.size();
return true; return true;
} else { } else {
_data->type = Internals::JSON_NULL; _data->type = JSON_NULL;
return false; return false;
} }
} }
@ -131,36 +123,32 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
// set(const std::string&) // set(const std::string&)
// set(const String&) // set(const String&)
template <typename T> template <typename T>
FORCE_INLINE bool set( FORCE_INLINE bool set(const T &value,
const T &value, typename enable_if<IsString<T>::value>::type * = 0) {
typename Internals::enable_if<Internals::IsString<T>::value>::type * =
0) {
if (!_data) return false; if (!_data) return false;
const char *dup = Internals::makeString(value).save(_memoryPool); const char *dup = makeString(value).save(_memoryPool);
if (dup) { if (dup) {
_data->type = Internals::JSON_OWNED_STRING; _data->type = JSON_OWNED_STRING;
_data->content.asString = dup; _data->content.asString = dup;
return true; return true;
} else { } else {
_data->type = Internals::JSON_NULL; _data->type = JSON_NULL;
return false; return false;
} }
} }
// set(char*) // set(char*)
template <typename T> template <typename T>
FORCE_INLINE bool set( FORCE_INLINE bool set(T *value,
T *value, typename enable_if<IsString<T *>::value>::type * = 0) {
typename Internals::enable_if<Internals::IsString<T *>::value>::type * =
0) {
if (!_data) return false; if (!_data) return false;
const char *dup = Internals::makeString(value).save(_memoryPool); const char *dup = makeString(value).save(_memoryPool);
if (dup) { if (dup) {
_data->type = Internals::JSON_OWNED_STRING; _data->type = JSON_OWNED_STRING;
_data->content.asString = dup; _data->content.asString = dup;
return true; return true;
} else { } else {
_data->type = Internals::JSON_NULL; _data->type = JSON_NULL;
return false; return false;
} }
} }
@ -168,7 +156,7 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
// set(const char*); // set(const char*);
FORCE_INLINE bool set(const char *value) { FORCE_INLINE bool set(const char *value) {
if (!_data) return false; if (!_data) return false;
_data->type = Internals::JSON_LINKED_STRING; _data->type = JSON_LINKED_STRING;
_data->content.asString = value; _data->content.asString = value;
return true; return true;
} }
@ -176,10 +164,10 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
bool set(const JsonVariant &value); bool set(const JsonVariant &value);
FORCE_INLINE bool set(JsonArray array); FORCE_INLINE bool set(JsonArray array);
FORCE_INLINE bool set(const Internals::JsonArraySubscript &); FORCE_INLINE bool set(const JsonArraySubscript &);
FORCE_INLINE bool set(JsonObject object); FORCE_INLINE bool set(JsonObject object);
template <typename TString> template <typename TString>
FORCE_INLINE bool set(const Internals::JsonObjectSubscript<TString> &); FORCE_INLINE bool set(const JsonObjectSubscript<TString> &);
// Get the variant as the specified type. // Get the variant as the specified type.
// //
@ -193,20 +181,19 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
// unsigned int as<unsigned int>() const; // unsigned int as<unsigned int>() const;
// unsigned long as<unsigned long>() const; // unsigned long as<unsigned long>() const;
template <typename T> template <typename T>
FORCE_INLINE const typename Internals::enable_if< FORCE_INLINE const typename enable_if<is_integral<T>::value, T>::type as()
Internals::is_integral<T>::value, T>::type const {
as() const {
if (!_data) return 0; if (!_data) return 0;
switch (_data->type) { switch (_data->type) {
case Internals::JSON_POSITIVE_INTEGER: case JSON_POSITIVE_INTEGER:
case Internals::JSON_BOOLEAN: case JSON_BOOLEAN:
return T(_data->content.asInteger); return T(_data->content.asInteger);
case Internals::JSON_NEGATIVE_INTEGER: case JSON_NEGATIVE_INTEGER:
return T(~_data->content.asInteger + 1); return T(~_data->content.asInteger + 1);
case Internals::JSON_LINKED_STRING: case JSON_LINKED_STRING:
case Internals::JSON_OWNED_STRING: case JSON_OWNED_STRING:
return Internals::parseInteger<T>(_data->content.asString); return parseInteger<T>(_data->content.asString);
case Internals::JSON_FLOAT: case JSON_FLOAT:
return T(_data->content.asFloat); return T(_data->content.asFloat);
default: default:
return 0; return 0;
@ -214,29 +201,27 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
} }
// bool as<bool>() const // bool as<bool>() const
template <typename T> template <typename T>
FORCE_INLINE const typename Internals::enable_if< FORCE_INLINE const typename enable_if<is_same<T, bool>::value, T>::type as()
Internals::is_same<T, bool>::value, T>::type const {
as() const {
return as<int>() != 0; return as<int>() != 0;
} }
// //
// double as<double>() const; // double as<double>() const;
// float as<float>() const; // float as<float>() const;
template <typename T> template <typename T>
FORCE_INLINE const typename Internals::enable_if< FORCE_INLINE const typename enable_if<is_floating_point<T>::value, T>::type
Internals::is_floating_point<T>::value, T>::type
as() const { as() const {
if (!_data) return 0; if (!_data) return 0;
switch (_data->type) { switch (_data->type) {
case Internals::JSON_POSITIVE_INTEGER: case JSON_POSITIVE_INTEGER:
case Internals::JSON_BOOLEAN: case JSON_BOOLEAN:
return static_cast<T>(_data->content.asInteger); return static_cast<T>(_data->content.asInteger);
case Internals::JSON_NEGATIVE_INTEGER: case JSON_NEGATIVE_INTEGER:
return -static_cast<T>(_data->content.asInteger); return -static_cast<T>(_data->content.asInteger);
case Internals::JSON_LINKED_STRING: case JSON_LINKED_STRING:
case Internals::JSON_OWNED_STRING: case JSON_OWNED_STRING:
return Internals::parseFloat<T>(_data->content.asString); return parseFloat<T>(_data->content.asString);
case Internals::JSON_FLOAT: case JSON_FLOAT:
return static_cast<T>(_data->content.asFloat); return static_cast<T>(_data->content.asFloat);
default: default:
return 0; return 0;
@ -246,14 +231,13 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
// const char* as<const char*>() const; // const char* as<const char*>() const;
// const char* as<char*>() const; // const char* as<char*>() const;
template <typename T> template <typename T>
FORCE_INLINE typename Internals::enable_if< FORCE_INLINE typename enable_if<is_same<T, const char *>::value ||
Internals::is_same<T, const char *>::value || is_same<T, char *>::value,
Internals::is_same<T, char *>::value, const char *>::type
const char *>::type
as() const { as() const {
if (!_data) return 0; if (!_data) return 0;
if (_data && (_data->type == Internals::JSON_LINKED_STRING || if (_data &&
_data->type == Internals::JSON_OWNED_STRING)) (_data->type == JSON_LINKED_STRING || _data->type == JSON_OWNED_STRING))
return _data->content.asString; return _data->content.asString;
else else
return 0; return 0;
@ -262,10 +246,8 @@ class JsonVariant : public Internals::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>
FORCE_INLINE FORCE_INLINE typename enable_if<IsWriteableString<T>::value, T>::type as()
typename Internals::enable_if<Internals::IsWriteableString<T>::value, const {
T>::type
as() const {
const char *cstr = as<const char *>(); const char *cstr = as<const char *>();
if (cstr) return T(cstr); if (cstr) return T(cstr);
T s; T s;
@ -276,27 +258,22 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
// JsonArray as<JsonArray>() const; // JsonArray as<JsonArray>() const;
// const JsonArray as<const JsonArray>() const; // const JsonArray as<const JsonArray>() const;
template <typename T> template <typename T>
FORCE_INLINE typename Internals::enable_if< FORCE_INLINE typename enable_if<
Internals::is_same<typename Internals::remove_const<T>::type, is_same<typename remove_const<T>::type, JsonArray>::value,
JsonArray>::value,
JsonArray>::type JsonArray>::type
as() const; as() const;
// //
// JsonObject as<JsonObject>() const; // JsonObject as<JsonObject>() const;
// const JsonObject as<const JsonObject>() const; // const JsonObject as<const JsonObject>() const;
template <typename T> template <typename T>
FORCE_INLINE typename Internals::enable_if< FORCE_INLINE typename enable_if<
Internals::is_same<typename Internals::remove_const<T>::type, is_same<typename remove_const<T>::type, JsonObject>::value, T>::type
JsonObject>::value,
T>::type
as() const; as() const;
// //
// JsonVariant as<JsonVariant> const; // JsonVariant as<JsonVariant> const;
template <typename T> template <typename T>
FORCE_INLINE FORCE_INLINE typename enable_if<is_same<T, JsonVariant>::value, T>::type as()
typename Internals::enable_if<Internals::is_same<T, JsonVariant>::value, const {
T>::type
as() const {
return *this; return *this;
} }
@ -313,69 +290,59 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
// bool is<unsigned int>() const; // bool is<unsigned int>() const;
// bool is<unsigned long>() const; // bool is<unsigned long>() const;
template <typename T> template <typename T>
FORCE_INLINE typename Internals::enable_if<Internals::is_integral<T>::value, FORCE_INLINE typename enable_if<is_integral<T>::value, bool>::type is()
bool>::type const {
is() const { return _data && (_data->type == JSON_POSITIVE_INTEGER ||
return _data && (_data->type == Internals::JSON_POSITIVE_INTEGER || _data->type == JSON_NEGATIVE_INTEGER);
_data->type == Internals::JSON_NEGATIVE_INTEGER);
} }
// //
// bool is<double>() const; // bool is<double>() const;
// bool is<float>() const; // bool is<float>() const;
template <typename T> template <typename T>
FORCE_INLINE FORCE_INLINE typename enable_if<is_floating_point<T>::value, bool>::type is()
typename Internals::enable_if<Internals::is_floating_point<T>::value, const {
bool>::type return _data &&
is() const { (_data->type == JSON_FLOAT || _data->type == JSON_POSITIVE_INTEGER ||
return _data && (_data->type == Internals::JSON_FLOAT || _data->type == JSON_NEGATIVE_INTEGER);
_data->type == Internals::JSON_POSITIVE_INTEGER ||
_data->type == Internals::JSON_NEGATIVE_INTEGER);
} }
// //
// bool is<bool>() const // bool is<bool>() const
template <typename T> template <typename T>
FORCE_INLINE typename Internals::enable_if<Internals::is_same<T, bool>::value, FORCE_INLINE typename enable_if<is_same<T, bool>::value, bool>::type is()
bool>::type const {
is() const { return _data && _data->type == JSON_BOOLEAN;
return _data && _data->type == Internals::JSON_BOOLEAN;
} }
// //
// bool is<const char*>() const; // bool is<const char*>() const;
// bool is<char*>() const; // bool is<char*>() const;
template <typename T> template <typename T>
FORCE_INLINE typename Internals::enable_if< FORCE_INLINE typename enable_if<
Internals::is_same<T, const char *>::value || is_same<T, const char *>::value || is_same<T, char *>::value, bool>::type
Internals::is_same<T, char *>::value,
bool>::type
is() const { is() const {
return _data && (_data->type == Internals::JSON_LINKED_STRING || return _data && (_data->type == JSON_LINKED_STRING ||
_data->type == Internals::JSON_OWNED_STRING); _data->type == JSON_OWNED_STRING);
} }
// //
// bool is<JsonArray> const; // bool is<JsonArray> const;
// bool is<const JsonArray> const; // bool is<const JsonArray> const;
template <typename T> template <typename T>
FORCE_INLINE typename Internals::enable_if< FORCE_INLINE typename enable_if<
Internals::is_same<typename Internals::remove_const<T>::type, is_same<typename remove_const<T>::type, JsonArray>::value, bool>::type
JsonArray>::value,
bool>::type
is() const { is() const {
return _data && _data->type == Internals::JSON_ARRAY; return _data && _data->type == JSON_ARRAY;
} }
// //
// bool is<JsonObject> const; // bool is<JsonObject> const;
// bool is<const JsonObject> const; // bool is<const JsonObject> const;
template <typename T> template <typename T>
FORCE_INLINE typename Internals::enable_if< FORCE_INLINE typename enable_if<
Internals::is_same<typename Internals::remove_const<T>::type, is_same<typename remove_const<T>::type, JsonObject>::value, bool>::type
JsonObject>::value,
bool>::type
is() const { is() const {
return _data && _data->type == Internals::JSON_OBJECT; return _data && _data->type == JSON_OBJECT;
} }
FORCE_INLINE bool isNull() const { FORCE_INLINE bool isNull() const {
return _data == 0 || _data->type == Internals::JSON_NULL; return _data == 0 || _data->type == JSON_NULL;
} }
FORCE_INLINE bool isInvalid() const { FORCE_INLINE bool isInvalid() const {
@ -389,35 +356,29 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
// //
// JsonArray to<JsonArray>() // JsonArray to<JsonArray>()
template <typename T> template <typename T>
typename Internals::enable_if<Internals::is_same<T, JsonArray>::value, typename enable_if<is_same<T, JsonArray>::value, JsonArray>::type to();
JsonArray>::type
to();
// //
// JsonObject to<JsonObject>() // JsonObject to<JsonObject>()
template <typename T> template <typename T>
typename Internals::enable_if<Internals::is_same<T, JsonObject>::value, typename enable_if<is_same<T, JsonObject>::value, JsonObject>::type to();
JsonObject>::type
to();
// //
// JsonObject to<JsonVariant>() // JsonObject to<JsonVariant>()
template <typename T> template <typename T>
typename Internals::enable_if<Internals::is_same<T, JsonVariant>::value, typename enable_if<is_same<T, JsonVariant>::value, JsonVariant>::type to();
JsonVariant>::type
to();
private: private:
Internals::MemoryPool *_memoryPool; MemoryPool *_memoryPool;
Internals::JsonVariantData *_data; JsonVariantData *_data;
}; };
class JsonVariantLocal : public JsonVariant { class JsonVariantLocal : public JsonVariant {
public: public:
explicit JsonVariantLocal(Internals::MemoryPool *memoryPool) explicit JsonVariantLocal(MemoryPool *memoryPool)
: JsonVariant(memoryPool, &_localData) { : JsonVariant(memoryPool, &_localData) {
_localData.type = Internals::JSON_NULL; _localData.type = JSON_NULL;
} }
private: private:
Internals::JsonVariantData _localData; JsonVariantData _localData;
}; };
} // namespace ArduinoJson } // namespace ARDUINOJSON_NAMESPACE

View File

@ -9,8 +9,7 @@
#include "JsonVariantOr.hpp" #include "JsonVariantOr.hpp"
#include "JsonVariantSubscripts.hpp" #include "JsonVariantSubscripts.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
template <typename TImpl> template <typename TImpl>
class JsonVariantBase : public JsonVariantCasts<TImpl>, class JsonVariantBase : public JsonVariantCasts<TImpl>,
@ -18,5 +17,4 @@ class JsonVariantBase : public JsonVariantCasts<TImpl>,
public JsonVariantOr<TImpl>, public JsonVariantOr<TImpl>,
public JsonVariantSubscripts<TImpl>, public JsonVariantSubscripts<TImpl>,
public JsonVariantTag {}; public JsonVariantTag {};
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -7,8 +7,7 @@
#include "Data/JsonVariantAs.hpp" #include "Data/JsonVariantAs.hpp"
#include "Polyfills/attributes.hpp" #include "Polyfills/attributes.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
template <typename TImpl> template <typename TImpl>
class JsonVariantCasts { class JsonVariantCasts {
@ -23,5 +22,4 @@ class JsonVariantCasts {
return static_cast<const TImpl *>(this); return static_cast<const TImpl *>(this);
} }
}; };
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -10,12 +10,10 @@
#include "Polyfills/type_traits.hpp" #include "Polyfills/type_traits.hpp"
#include "Strings/StringTypes.hpp" #include "Strings/StringTypes.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
class JsonArray; class JsonArray;
class JsonObject; class JsonObject;
namespace Internals {
template <typename TImpl> template <typename TImpl>
class JsonVariantComparisons { class JsonVariantComparisons {
public: public:
@ -120,7 +118,6 @@ class JsonVariantComparisons {
template <typename TVariant2> template <typename TVariant2>
bool equals(const JsonVariantComparisons<TVariant2> &right) const { bool equals(const JsonVariantComparisons<TVariant2> &right) const {
using namespace Internals;
if (is<bool>() && right.template is<bool>()) if (is<bool>() && right.template is<bool>())
return as<bool>() == right.template as<bool>(); return as<bool>() == right.template as<bool>();
if (is<JsonInteger>() && right.template is<JsonInteger>()) if (is<JsonInteger>() && right.template is<JsonInteger>())
@ -137,5 +134,4 @@ class JsonVariantComparisons {
return false; return false;
} }
}; };
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -11,13 +11,13 @@
#include <string.h> // for strcmp #include <string.h> // for strcmp
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
inline bool JsonVariant::set(JsonArray array) { inline bool JsonVariant::set(JsonArray array) {
return to<JsonArray>().copyFrom(array); return to<JsonArray>().copyFrom(array);
} }
inline bool JsonVariant::set(const Internals::JsonArraySubscript& value) { inline bool JsonVariant::set(const JsonArraySubscript& value) {
return set(value.as<JsonVariant>()); return set(value.as<JsonVariant>());
} }
@ -26,25 +26,24 @@ inline bool JsonVariant::set(JsonObject object) {
} }
template <typename TString> template <typename TString>
inline bool JsonVariant::set( inline bool JsonVariant::set(const JsonObjectSubscript<TString>& value) {
const Internals::JsonObjectSubscript<TString>& value) {
return set(value.template as<JsonVariant>()); return set(value.template as<JsonVariant>());
} }
inline bool JsonVariant::set(const JsonVariant& value) { inline bool JsonVariant::set(const JsonVariant& value) {
if (!_data) return false; if (!_data) return false;
if (!value._data) { if (!value._data) {
_data->type = Internals::JSON_NULL; _data->type = JSON_NULL;
return true; return true;
} }
switch (value._data->type) { switch (value._data->type) {
case Internals::JSON_ARRAY: case JSON_ARRAY:
return set(value.as<JsonArray>()); return set(value.as<JsonArray>());
case Internals::JSON_OBJECT: case JSON_OBJECT:
return set(value.as<JsonObject>()); return set(value.as<JsonObject>());
case Internals::JSON_OWNED_STRING: case JSON_OWNED_STRING:
return set(const_cast<char*>(value._data->content.asString)); return set(const_cast<char*>(value._data->content.asString));
case Internals::JSON_OWNED_RAW: case JSON_OWNED_RAW:
return set(serialized(const_cast<char*>(value._data->content.asRaw.data), return set(serialized(const_cast<char*>(value._data->content.asRaw.data),
value._data->content.asRaw.size)); value._data->content.asRaw.size));
default: default:
@ -54,63 +53,55 @@ inline bool JsonVariant::set(const JsonVariant& value) {
} }
template <typename T> template <typename T>
inline typename Internals::enable_if< inline typename enable_if<
Internals::is_same<typename Internals::remove_const<T>::type, is_same<typename remove_const<T>::type, JsonArray>::value, JsonArray>::type
JsonArray>::value,
JsonArray>::type
JsonVariant::as() const { JsonVariant::as() const {
if (_data && _data->type == Internals::JSON_ARRAY) if (_data && _data->type == JSON_ARRAY)
return JsonArray(_memoryPool, &_data->content.asArray); return JsonArray(_memoryPool, &_data->content.asArray);
else else
return JsonArray(); return JsonArray();
} }
template <typename T> template <typename T>
inline typename Internals::enable_if< inline typename enable_if<
Internals::is_same<typename Internals::remove_const<T>::type, is_same<typename remove_const<T>::type, JsonObject>::value, T>::type
JsonObject>::value,
T>::type
JsonVariant::as() const { JsonVariant::as() const {
if (_data && _data->type == Internals::JSON_OBJECT) if (_data && _data->type == JSON_OBJECT)
return JsonObject(_memoryPool, &_data->content.asObject); return JsonObject(_memoryPool, &_data->content.asObject);
else else
return JsonObject(); return JsonObject();
} }
template <typename T> template <typename T>
inline typename Internals::enable_if<Internals::is_same<T, JsonArray>::value, inline typename enable_if<is_same<T, JsonArray>::value, JsonArray>::type
JsonArray>::type
JsonVariant::to() { JsonVariant::to() {
if (!_data) return JsonArray(); if (!_data) return JsonArray();
_data->type = Internals::JSON_ARRAY; _data->type = JSON_ARRAY;
_data->content.asArray.head = 0; _data->content.asArray.head = 0;
_data->content.asArray.tail = 0; _data->content.asArray.tail = 0;
return JsonArray(_memoryPool, &_data->content.asArray); return JsonArray(_memoryPool, &_data->content.asArray);
} }
template <typename T> template <typename T>
typename Internals::enable_if<Internals::is_same<T, JsonObject>::value, typename enable_if<is_same<T, JsonObject>::value, JsonObject>::type
JsonObject>::type
JsonVariant::to() { JsonVariant::to() {
if (!_data) return JsonObject(); if (!_data) return JsonObject();
_data->type = Internals::JSON_OBJECT; _data->type = JSON_OBJECT;
_data->content.asObject.head = 0; _data->content.asObject.head = 0;
_data->content.asObject.tail = 0; _data->content.asObject.tail = 0;
return JsonObject(_memoryPool, &_data->content.asObject); return JsonObject(_memoryPool, &_data->content.asObject);
} }
template <typename T> template <typename T>
typename Internals::enable_if<Internals::is_same<T, JsonVariant>::value, typename enable_if<is_same<T, JsonVariant>::value, JsonVariant>::type
JsonVariant>::type
JsonVariant::to() { JsonVariant::to() {
if (!_data) return JsonVariant(); if (!_data) return JsonVariant();
_data->type = Internals::JSON_NULL; _data->type = JSON_NULL;
return *this; return *this;
} }
template <typename Visitor> template <typename Visitor>
inline void JsonVariant::accept(Visitor& visitor) const { inline void JsonVariant::accept(Visitor& visitor) const {
using namespace Internals;
if (!_data) return visitor.visitNull(); if (!_data) return visitor.visitNull();
switch (_data->type) { switch (_data->type) {
@ -147,4 +138,4 @@ inline void JsonVariant::accept(Visitor& visitor) const {
return visitor.visitNull(); return visitor.visitNull();
} }
} }
} // namespace ArduinoJson } // namespace ARDUINOJSON_NAMESPACE

View File

@ -8,8 +8,7 @@
#include "Polyfills/attributes.hpp" #include "Polyfills/attributes.hpp"
#include "Polyfills/type_traits.hpp" #include "Polyfills/type_traits.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
template <typename TImpl> template <typename TImpl>
class JsonVariantOr { class JsonVariantOr {
@ -47,5 +46,4 @@ class JsonVariantOr {
return static_cast<const TImpl *>(this); return static_cast<const TImpl *>(this);
} }
}; };
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -9,10 +9,9 @@
#include "Polyfills/type_traits.hpp" #include "Polyfills/type_traits.hpp"
#include "Strings/StringTypes.hpp" #include "Strings/StringTypes.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
class JsonArray; class JsonArray;
class JsonObject; class JsonObject;
namespace Internals {
// Forward declarations. // Forward declarations.
class JsonArraySubscript; class JsonArraySubscript;
@ -73,5 +72,4 @@ class JsonVariantSubscripts {
return static_cast<const TImpl *>(this); return static_cast<const TImpl *>(this);
} }
}; };
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -6,8 +6,7 @@
#include "MemoryPool.hpp" #include "MemoryPool.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
class AllocableInMemoryPool { class AllocableInMemoryPool {
public: public:
@ -17,5 +16,4 @@ class AllocableInMemoryPool {
void operator delete(void *, MemoryPool *)NOEXCEPT {} void operator delete(void *, MemoryPool *)NOEXCEPT {}
}; };
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -18,8 +18,7 @@
#pragma GCC diagnostic ignored "-Wnon-virtual-dtor" #pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
#endif #endif
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
class DefaultAllocator { class DefaultAllocator {
public: public:
void* allocate(size_t size) { void* allocate(size_t size) {
@ -156,8 +155,7 @@ class DynamicMemoryPoolBase : public MemoryPool {
// You are strongly encouraged to consider using StaticMemoryPool which is much // You are strongly encouraged to consider using StaticMemoryPool which is much
// more suitable for embedded systems. // more suitable for embedded systems.
typedef DynamicMemoryPoolBase<DefaultAllocator> DynamicMemoryPool; typedef DynamicMemoryPoolBase<DefaultAllocator> DynamicMemoryPool;
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson
#if defined(__clang__) #if defined(__clang__)
#pragma clang diagnostic pop #pragma clang diagnostic pop

View File

@ -11,8 +11,7 @@
#include "../Configuration.hpp" #include "../Configuration.hpp"
#include "../Polyfills/attributes.hpp" #include "../Polyfills/attributes.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
// Handle the memory management (done in derived classes) and calls the parser. // Handle the memory management (done in derived classes) and calls the parser.
// This abstract class is implemented by StaticMemoryPool which implements a // This abstract class is implemented by StaticMemoryPool which implements a
// fixed memory allocation. // fixed memory allocation.
@ -38,5 +37,4 @@ class MemoryPool {
#endif #endif
} }
}; };
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -7,8 +7,7 @@
#include "../Polyfills/mpl/max.hpp" #include "../Polyfills/mpl/max.hpp"
#include "MemoryPool.hpp" #include "MemoryPool.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
class StaticMemoryPoolBase : public MemoryPool { class StaticMemoryPoolBase : public MemoryPool {
public: public:
@ -117,8 +116,7 @@ class StaticMemoryPool : public StaticMemoryPoolBase {
private: private:
char _buffer[ACTUAL_CAPACITY]; char _buffer[ACTUAL_CAPACITY];
}; };
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson
#if defined(__clang__) #if defined(__clang__)
#pragma clang diagnostic pop #pragma clang diagnostic pop

View File

@ -11,8 +11,7 @@
#include "./endianess.hpp" #include "./endianess.hpp"
#include "./ieee754.hpp" #include "./ieee754.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
template <typename TReader, typename TStringStorage> template <typename TReader, typename TStringStorage>
class MsgPackDeserializer { class MsgPackDeserializer {
@ -69,7 +68,7 @@ class MsgPackDeserializer {
return readInteger<uint32_t>(variant); return readInteger<uint32_t>(variant);
case 0xcf: case 0xcf:
#if ARDUINOJSON_USE_LONG_LONG || ARDUINOJSON_USE_INT64 #if ARDUINOJSON_USE_LONG_LONG
return readInteger<uint64_t>(variant); return readInteger<uint64_t>(variant);
#else #else
readInteger<uint32_t>(); readInteger<uint32_t>();
@ -86,7 +85,7 @@ class MsgPackDeserializer {
return readInteger<int32_t>(variant); return readInteger<int32_t>(variant);
case 0xd3: case 0xd3:
#if ARDUINOJSON_USE_LONG_LONG || ARDUINOJSON_USE_INT64 #if ARDUINOJSON_USE_LONG_LONG
return readInteger<int64_t>(variant); return readInteger<int64_t>(variant);
#else #else
if (!skip(4)) return DeserializationError::IncompleteInput; if (!skip(4)) return DeserializationError::IncompleteInput;
@ -297,30 +296,25 @@ class MsgPackDeserializer {
TStringStorage _stringStorage; TStringStorage _stringStorage;
uint8_t _nestingLimit; uint8_t _nestingLimit;
}; };
} // namespace Internals
template <typename TDocument, typename TInput> template <typename TDocument, typename TInput>
DeserializationError deserializeMsgPack(TDocument &doc, const TInput &input) { DeserializationError deserializeMsgPack(TDocument &doc, const TInput &input) {
using namespace Internals;
return deserialize<MsgPackDeserializer>(doc, input); return deserialize<MsgPackDeserializer>(doc, input);
} }
template <typename TDocument, typename TInput> template <typename TDocument, typename TInput>
DeserializationError deserializeMsgPack(TDocument &doc, TInput *input) { DeserializationError deserializeMsgPack(TDocument &doc, TInput *input) {
using namespace Internals;
return deserialize<MsgPackDeserializer>(doc, input); return deserialize<MsgPackDeserializer>(doc, input);
} }
template <typename TDocument, typename TInput> template <typename TDocument, typename TInput>
DeserializationError deserializeMsgPack(TDocument &doc, TInput *input, DeserializationError deserializeMsgPack(TDocument &doc, TInput *input,
size_t inputSize) { size_t inputSize) {
using namespace Internals;
return deserialize<MsgPackDeserializer>(doc, input, inputSize); return deserialize<MsgPackDeserializer>(doc, input, inputSize);
} }
template <typename TDocument, typename TInput> template <typename TDocument, typename TInput>
DeserializationError deserializeMsgPack(TDocument &doc, TInput &input) { DeserializationError deserializeMsgPack(TDocument &doc, TInput &input) {
using namespace Internals;
return deserialize<MsgPackDeserializer>(doc, input); return deserialize<MsgPackDeserializer>(doc, input);
} }
} // namespace ArduinoJson } // namespace ARDUINOJSON_NAMESPACE

View File

@ -10,8 +10,7 @@
#include "../Serialization/serialize.hpp" #include "../Serialization/serialize.hpp"
#include "./endianess.hpp" #include "./endianess.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
template <typename TWriter> template <typename TWriter>
class MsgPackSerializer { class MsgPackSerializer {
@ -107,7 +106,7 @@ class MsgPackSerializer {
writeByte(0xD2); writeByte(0xD2);
writeInteger(int32_t(negated)); writeInteger(int32_t(negated));
} }
#if ARDUINOJSON_USE_LONG_LONG || ARDUINOJSON_USE_INT64 #if ARDUINOJSON_USE_LONG_LONG
else { else {
writeByte(0xD3); writeByte(0xD3);
writeInteger(int64_t(negated)); writeInteger(int64_t(negated));
@ -128,7 +127,7 @@ class MsgPackSerializer {
writeByte(0xCE); writeByte(0xCE);
writeInteger(uint32_t(value)); writeInteger(uint32_t(value));
} }
#if ARDUINOJSON_USE_LONG_LONG || ARDUINOJSON_USE_INT64 #if ARDUINOJSON_USE_LONG_LONG
else { else {
writeByte(0xCF); writeByte(0xCF);
writeInteger(uint64_t(value)); writeInteger(uint64_t(value));
@ -166,25 +165,21 @@ class MsgPackSerializer {
TWriter* _writer; TWriter* _writer;
size_t _bytesWritten; size_t _bytesWritten;
}; };
} // namespace Internals
template <typename TSource, typename TDestination> template <typename TSource, typename TDestination>
inline size_t serializeMsgPack(const TSource& source, TDestination& output) { inline size_t serializeMsgPack(const TSource& source, TDestination& output) {
using namespace Internals;
return serialize<MsgPackSerializer>(source, output); return serialize<MsgPackSerializer>(source, output);
} }
template <typename TSource, typename TDestination> template <typename TSource, typename TDestination>
inline size_t serializeMsgPack(const TSource& source, TDestination* output, inline size_t serializeMsgPack(const TSource& source, TDestination* output,
size_t size) { size_t size) {
using namespace Internals;
return serialize<MsgPackSerializer>(source, output, size); return serialize<MsgPackSerializer>(source, output, size);
} }
template <typename TSource> template <typename TSource>
inline size_t measureMsgPack(const TSource& source) { inline size_t measureMsgPack(const TSource& source) {
using namespace Internals;
return measure<MsgPackSerializer>(source); return measure<MsgPackSerializer>(source);
} }
} // namespace ArduinoJson } // namespace ARDUINOJSON_NAMESPACE

View File

@ -7,8 +7,7 @@
#include "../Polyfills/type_traits.hpp" #include "../Polyfills/type_traits.hpp"
#include "../Polyfills/utility.hpp" #include "../Polyfills/utility.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
inline void fixEndianess(uint8_t* p, integral_constant<size_t, 8>) { inline void fixEndianess(uint8_t* p, integral_constant<size_t, 8>) {
swap(p[0], p[7]); swap(p[0], p[7]);
@ -36,5 +35,4 @@ inline void fixEndianess(T& value) {
#endif #endif
} }
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -4,8 +4,7 @@
#pragma once #pragma once
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
inline void doubleToFloat(const uint8_t d[8], uint8_t f[4]) { inline void doubleToFloat(const uint8_t d[8], uint8_t f[4]) {
f[0] = uint8_t((d[0] & 0xC0) | (d[0] << 3 & 0x3f) | (d[1] >> 5)); f[0] = uint8_t((d[0] & 0xC0) | (d[0] << 3 & 0x3f) | (d[1] >> 5));
@ -14,5 +13,4 @@ inline void doubleToFloat(const uint8_t d[8], uint8_t f[4]) {
f[3] = uint8_t((d[3] << 3) | (d[4] >> 5)); f[3] = uint8_t((d[3] << 3) | (d[4] >> 5));
} }
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -0,0 +1,22 @@
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2018
// MIT License
#pragma once
#include "version.hpp"
#include "Configuration.hpp"
#define ARDUINOJSON_DO_CONCAT(A, B) A##B
#define ARDUINOJSON_CONCAT2(A, B) ARDUINOJSON_DO_CONCAT(A, B)
#define ARDUINOJSON_CONCAT4(A, B, C, D) \
ARDUINOJSON_CONCAT2(ARDUINOJSON_CONCAT2(A, B), ARDUINOJSON_CONCAT2(C, D))
#define ARDUINOJSON_CONCAT8(A, B, C, D, E, F, G, H) \
ARDUINOJSON_CONCAT2(ARDUINOJSON_CONCAT4(A, B, C, D), \
ARDUINOJSON_CONCAT4(E, F, G, H))
#define ARDUINOJSON_NAMESPACE \
ARDUINOJSON_CONCAT8(ArduinoJson, ARDUINOJSON_VERSION_MAJOR, \
ARDUINOJSON_VERSION_MINOR, ARDUINOJSON_VERSION_REVISION, \
_, ARDUINOJSON_USE_LONG_LONG, _, ARDUINOJSON_USE_DOUBLE)

View File

@ -8,8 +8,7 @@
#include "../Polyfills/math.hpp" #include "../Polyfills/math.hpp"
#include "./FloatTraits.hpp" #include "./FloatTraits.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
template <typename TFloat> template <typename TFloat>
struct FloatParts { struct FloatParts {
@ -85,5 +84,4 @@ struct FloatParts {
return powersOf10; return powersOf10;
} }
}; };
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -9,8 +9,7 @@
#include "../Configuration.hpp" #include "../Configuration.hpp"
#include "../Polyfills/math.hpp" #include "../Polyfills/math.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
template <typename T, size_t = sizeof(T)> template <typename T, size_t = sizeof(T)>
struct FloatTraits {}; struct FloatTraits {};
@ -167,5 +166,4 @@ struct FloatTraits<T, 4 /*32bits*/> {
return forge(0x7f800000); return forge(0x7f800000);
} }
}; };
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -7,8 +7,7 @@
#include <string.h> // for strcmp #include <string.h> // for strcmp
#include "../Polyfills/ctype.hpp" #include "../Polyfills/ctype.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
inline bool isFloat(const char* s) { inline bool isFloat(const char* s) {
if (!s) return false; if (!s) return false;
@ -34,5 +33,4 @@ inline bool isFloat(const char* s) {
return *s == '\0'; return *s == '\0';
} }
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -6,8 +6,7 @@
#include "../Polyfills/ctype.hpp" #include "../Polyfills/ctype.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
inline bool isInteger(const char* s) { inline bool isInteger(const char* s) {
if (!s || !*s) return false; if (!s || !*s) return false;
@ -15,5 +14,4 @@ inline bool isInteger(const char* s) {
while (isdigit(*s)) s++; while (isdigit(*s)) s++;
return *s == '\0'; return *s == '\0';
} }
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -8,8 +8,7 @@
#include "../Polyfills/ctype.hpp" #include "../Polyfills/ctype.hpp"
#include "../Polyfills/math.hpp" #include "../Polyfills/math.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
template <typename T> template <typename T>
inline T parseFloat(const char* s) { inline T parseFloat(const char* s) {
@ -86,5 +85,4 @@ inline T parseFloat(const char* s) {
return negative_result ? -result : result; return negative_result ? -result : result;
} }
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -9,8 +9,7 @@
#include "../Configuration.hpp" #include "../Configuration.hpp"
#include "../Polyfills/ctype.hpp" #include "../Polyfills/ctype.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
template <typename T> template <typename T>
T parseInteger(const char *s) { T parseInteger(const char *s) {
if (!s) return 0; // NULL if (!s) return 0; // NULL
@ -37,5 +36,4 @@ T parseInteger(const char *s) {
return negative_result ? T(~result + 1) : result; return negative_result ? T(~result + 1) : result;
} }
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -4,8 +4,7 @@
#pragma once #pragma once
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
inline bool isdigit(char c) { inline bool isdigit(char c) {
return '0' <= c && c <= '9'; return '0' <= c && c <= '9';
@ -14,5 +13,4 @@ inline bool isdigit(char c) {
inline bool issign(char c) { inline bool issign(char c) {
return '-' == c || c == '+'; return '-' == c || c == '+';
} }
} } // namespace ARDUINOJSON_NAMESPACE
}

View File

@ -4,8 +4,7 @@
#pragma once #pragma once
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
// Some libraries #define isnan() and isinf() so we need to check before // Some libraries #define isnan() and isinf() so we need to check before
// using this name // using this name
@ -23,5 +22,4 @@ bool isinf(T x) {
return x != 0.0 && x * 2 == x; return x != 0.0 && x * 2 == x;
} }
#endif #endif
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -6,8 +6,7 @@
#include <stdlib.h> // for size_t #include <stdlib.h> // for size_t
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
// A meta-function that returns the highest value // A meta-function that returns the highest value
template <size_t X, size_t Y, bool MaxIsX = (X > Y)> template <size_t X, size_t Y, bool MaxIsX = (X > Y)>
@ -22,5 +21,4 @@ template <size_t X, size_t Y>
struct Max<X, Y, false> { struct Max<X, Y, false> {
static const size_t value = Y; static const size_t value = Y;
}; };
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -4,8 +4,7 @@
#pragma once #pragma once
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
// A meta-function that return the type T if Condition is true. // A meta-function that return the type T if Condition is true.
template <bool Condition, typename T = void> template <bool Condition, typename T = void>
@ -15,5 +14,4 @@ template <typename T>
struct enable_if<true, T> { struct enable_if<true, T> {
typedef T type; typedef T type;
}; };
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -4,8 +4,7 @@
#pragma once #pragma once
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
template <typename T, T v> template <typename T, T v>
struct integral_constant { struct integral_constant {
@ -15,5 +14,4 @@ struct integral_constant {
typedef integral_constant<bool, true> true_type; typedef integral_constant<bool, true> true_type;
typedef integral_constant<bool, false> false_type; typedef integral_constant<bool, false> false_type;
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -4,8 +4,7 @@
#pragma once #pragma once
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
template <typename T> template <typename T>
struct is_array : false_type {}; struct is_array : false_type {};
@ -15,5 +14,4 @@ struct is_array<T[]> : true_type {};
template <typename T, size_t N> template <typename T, size_t N>
struct is_array<T[N]> : true_type {}; struct is_array<T[N]> : true_type {};
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -4,8 +4,7 @@
#pragma once #pragma once
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
// A meta-function that returns true if Derived inherits from TBase is an // A meta-function that returns true if Derived inherits from TBase is an
// integral type. // integral type.
@ -23,5 +22,4 @@ class is_base_of {
value = sizeof(probe(reinterpret_cast<TDerived *>(0))) == sizeof(Yes) value = sizeof(probe(reinterpret_cast<TDerived *>(0))) == sizeof(Yes)
}; };
}; };
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -6,8 +6,7 @@
#include "integral_constant.hpp" #include "integral_constant.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
// A meta-function that return the type T without the const modifier // A meta-function that return the type T without the const modifier
template <typename T> template <typename T>
@ -15,5 +14,4 @@ struct is_const : false_type {};
template <typename T> template <typename T>
struct is_const<const T> : true_type {}; struct is_const<const T> : true_type {};
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -6,8 +6,7 @@
#include "integral_constant.hpp" #include "integral_constant.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
template <typename> template <typename>
struct is_floating_point : false_type {}; struct is_floating_point : false_type {};
@ -17,5 +16,4 @@ struct is_floating_point<float> : true_type {};
template <> template <>
struct is_floating_point<double> : true_type {}; struct is_floating_point<double> : true_type {};
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -7,8 +7,7 @@
#include "../../Configuration.hpp" #include "../../Configuration.hpp"
#include "is_same.hpp" #include "is_same.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
// A meta-function that returns true if T is an integral type. // A meta-function that returns true if T is an integral type.
template <typename T> template <typename T>
@ -18,19 +17,19 @@ struct is_integral {
is_same<T, signed short>::value || is_same<T, unsigned short>::value || is_same<T, signed short>::value || is_same<T, unsigned short>::value ||
is_same<T, signed int>::value || is_same<T, unsigned int>::value || is_same<T, signed int>::value || is_same<T, unsigned int>::value ||
is_same<T, signed long>::value || is_same<T, unsigned long>::value || is_same<T, signed long>::value || is_same<T, unsigned long>::value ||
#if ARDUINOJSON_USE_LONG_LONG #if ARDUINOJSON_HAS_LONG_LONG
is_same<T, unsigned long long>::value ||
is_same<T, signed long long>::value || is_same<T, signed long long>::value ||
is_same<T, unsigned long long>::value ||
#endif #endif
#if ARDUINOJSON_USE_INT64 #if ARDUINOJSON_HAS_INT64
is_same<T, unsigned __int64>::value ||
is_same<T, signed __int64>::value || is_same<T, signed __int64>::value ||
is_same<T, unsigned __int64>::value ||
#endif #endif
is_same<T, char>::value; is_same<T, char>::value;
// CAUTION: differs from std::is_integral as it doesn't include bool // CAUTION: differs from std::is_integral as it doesn't include bool
}; };
template <typename T> template <typename T>
struct is_integral<const T> : is_integral<T> {}; struct is_integral<const T> : is_integral<T> {};
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -6,8 +6,7 @@
#include "integral_constant.hpp" #include "integral_constant.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
// A meta-function that returns true if types T and U are the same. // A meta-function that returns true if types T and U are the same.
template <typename T, typename U> template <typename T, typename U>
@ -15,5 +14,4 @@ struct is_same : false_type {};
template <typename T> template <typename T>
struct is_same<T, T> : true_type {}; struct is_same<T, T> : true_type {};
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -5,8 +5,7 @@
#pragma once #pragma once
#include "integral_constant.hpp" #include "integral_constant.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
template <typename> template <typename>
struct is_signed : false_type {}; struct is_signed : false_type {};
@ -32,13 +31,13 @@ struct is_signed<float> : true_type {};
template <> template <>
struct is_signed<double> : true_type {}; struct is_signed<double> : true_type {};
#if ARDUINOJSON_USE_LONG_LONG #if ARDUINOJSON_HAS_LONG_LONG
template <> template <>
struct is_signed<signed long long> : true_type {}; struct is_signed<signed long long> : true_type {};
#endif #endif
#if ARDUINOJSON_USE_INT64
#if ARDUINOJSON_HAS_INT64
template <> template <>
struct is_signed<signed __int64> : true_type {}; struct is_signed<signed __int64> : true_type {};
#endif #endif
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -5,8 +5,7 @@
#pragma once #pragma once
#include "integral_constant.hpp" #include "integral_constant.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
template <typename> template <typename>
struct is_unsigned : false_type {}; struct is_unsigned : false_type {};
@ -26,13 +25,13 @@ struct is_unsigned<unsigned int> : true_type {};
template <> template <>
struct is_unsigned<unsigned long> : true_type {}; struct is_unsigned<unsigned long> : true_type {};
#if ARDUINOJSON_USE_LONG_LONG #if ARDUINOJSON_HAS_INT64
template <>
struct is_unsigned<unsigned long long> : true_type {};
#endif
#if ARDUINOJSON_USE_INT64
template <> template <>
struct is_unsigned<unsigned __int64> : true_type {}; struct is_unsigned<unsigned __int64> : true_type {};
#endif #endif
} // namespace Internals
} // namespace ArduinoJson #if ARDUINOJSON_HAS_LONG_LONG
template <>
struct is_unsigned<unsigned long long> : true_type {};
#endif
} // namespace ARDUINOJSON_NAMESPACE

View File

@ -4,8 +4,7 @@
#pragma once #pragma once
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
// A meta-function that return the type T without the const modifier // A meta-function that return the type T without the const modifier
template <typename T> template <typename T>
@ -16,5 +15,4 @@ template <typename T>
struct remove_const<const T> { struct remove_const<const T> {
typedef T type; typedef T type;
}; };
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -4,8 +4,7 @@
#pragma once #pragma once
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
// A meta-function that return the type T without the reference modifier. // A meta-function that return the type T without the reference modifier.
template <typename T> template <typename T>
@ -16,5 +15,4 @@ template <typename T>
struct remove_reference<T&> { struct remove_reference<T&> {
typedef T type; typedef T type;
}; };
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -4,13 +4,11 @@
#pragma once #pragma once
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
template <typename T> template <typename T>
inline void swap(T& a, T& b) { inline void swap(T& a, T& b) {
T t(a); T t(a);
a = b; a = b;
b = t; b = t;
} }
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -4,8 +4,7 @@
#pragma once #pragma once
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
class DummyWriter { class DummyWriter {
public: public:
@ -17,5 +16,4 @@ class DummyWriter {
return n; return n;
} }
}; };
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -14,8 +14,7 @@
#include <string> #include <string>
#endif #endif
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
template <typename> template <typename>
struct IsWriteableString : false_type {}; struct IsWriteableString : false_type {};
@ -77,5 +76,4 @@ class DynamicStringWriter<std::string> {
std::string *_str; std::string *_str;
}; };
#endif #endif
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -4,8 +4,7 @@
#pragma once #pragma once
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
// A Print implementation that allows to write in a char[] // A Print implementation that allows to write in a char[]
class StaticStringWriter { class StaticStringWriter {
@ -35,5 +34,4 @@ class StaticStringWriter {
char *end; char *end;
char *p; char *p;
}; };
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -10,8 +10,7 @@
#include <ostream> #include <ostream>
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
class StreamWriter { class StreamWriter {
public: public:
@ -34,7 +33,6 @@ class StreamWriter {
std::ostream& _os; std::ostream& _os;
}; };
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson
#endif // ARDUINOJSON_ENABLE_STD_STREAM #endif // ARDUINOJSON_ENABLE_STD_STREAM

View File

@ -6,8 +6,7 @@
#include "./DummyWriter.hpp" #include "./DummyWriter.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
template <template <typename> class TSerializer, typename TSource> template <template <typename> class TSerializer, typename TSource>
size_t measure(const TSource &source) { size_t measure(const TSource &source) {
@ -17,5 +16,4 @@ size_t measure(const TSource &source) {
return serializer.bytesWritten(); return serializer.bytesWritten();
} }
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -11,8 +11,7 @@
#include "./StreamWriter.hpp" #include "./StreamWriter.hpp"
#endif #endif
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
template <template <typename> class TSerializer, typename TSource, template <template <typename> class TSerializer, typename TSource,
typename TPrint> typename TPrint>
@ -51,5 +50,4 @@ typename enable_if<IsWriteableString<TString>::value, size_t>::type serialize(
return serialize<TSerializer>(source, writer); return serialize<TSerializer>(source, writer);
} }
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -6,9 +6,8 @@
#include "Strings/StringTypes.hpp" #include "Strings/StringTypes.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
// A special type of data that can be used to insert pregenerated JSON portions. // A special type of data that can be used to insert pregenerated JSON portions.
template <typename T> template <typename T>
class SerializedValue { class SerializedValue {
@ -51,20 +50,19 @@ class SerializedValue<TChar*> {
TChar* _data; TChar* _data;
size_t _size; size_t _size;
}; };
} // namespace Internals
template <typename T> template <typename T>
inline Internals::SerializedValue<T> serialized(T str) { inline SerializedValue<T> serialized(T str) {
return Internals::SerializedValue<T>(str); return SerializedValue<T>(str);
} }
template <typename TChar> template <typename TChar>
inline Internals::SerializedValue<TChar*> serialized(TChar* p) { inline SerializedValue<TChar*> serialized(TChar* p) {
return Internals::SerializedValue<TChar*>(p, Internals::makeString(p).size()); return SerializedValue<TChar*>(p, makeString(p).size());
} }
template <typename TChar> template <typename TChar>
inline Internals::SerializedValue<TChar*> serialized(TChar* p, size_t n) { inline SerializedValue<TChar*> serialized(TChar* p, size_t n) {
return Internals::SerializedValue<TChar*>(p, n); return SerializedValue<TChar*>(p, n);
} }
} // namespace ArduinoJson } // namespace ARDUINOJSON_NAMESPACE

View File

@ -8,7 +8,7 @@
#include "JsonVariant.hpp" #include "JsonVariant.hpp"
#include "Memory/StaticMemoryPool.hpp" #include "Memory/StaticMemoryPool.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
template <size_t CAPACITY> template <size_t CAPACITY>
class StaticJsonDocument { class StaticJsonDocument {
@ -17,7 +17,7 @@ class StaticJsonDocument {
StaticJsonDocument() : nestingLimit(ARDUINOJSON_DEFAULT_NESTING_LIMIT) {} StaticJsonDocument() : nestingLimit(ARDUINOJSON_DEFAULT_NESTING_LIMIT) {}
Internals::StaticMemoryPoolBase& memoryPool() { StaticMemoryPoolBase& memoryPool() {
return _memoryPool; return _memoryPool;
} }
@ -27,19 +27,19 @@ class StaticJsonDocument {
} }
template <typename T> template <typename T>
typename Internals::JsonVariantAs<T>::type as() const { typename JsonVariantAs<T>::type as() const {
return getVariant().template as<T>(); return getVariant().template as<T>();
} }
template <typename T> template <typename T>
typename Internals::JsonVariantTo<T>::type to() { typename JsonVariantTo<T>::type to() {
_memoryPool.clear(); _memoryPool.clear();
return getVariant().template to<T>(); return getVariant().template to<T>();
} }
void clear() { void clear() {
_memoryPool.clear(); _memoryPool.clear();
_rootData.type = Internals::JSON_NULL; _rootData.type = JSON_NULL;
} }
size_t memoryUsage() const { size_t memoryUsage() const {
@ -56,8 +56,8 @@ class StaticJsonDocument {
return JsonVariant(&_memoryPool, &_rootData); return JsonVariant(&_memoryPool, &_rootData);
} }
mutable Internals::StaticMemoryPool<CAPACITY> _memoryPool; mutable StaticMemoryPool<CAPACITY> _memoryPool;
mutable Internals::JsonVariantData _rootData; mutable JsonVariantData _rootData;
}; };
} // namespace ArduinoJson } // namespace ARDUINOJSON_NAMESPACE

View File

@ -4,8 +4,7 @@
#pragma once #pragma once
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
template <typename TMemoryPool> template <typename TMemoryPool>
class StringCopier { class StringCopier {
@ -21,5 +20,4 @@ class StringCopier {
private: private:
TMemoryPool* _memoryPool; TMemoryPool* _memoryPool;
}; };
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -4,8 +4,7 @@
#pragma once #pragma once
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
template <typename TChar> template <typename TChar>
class StringMover { class StringMover {
@ -37,5 +36,4 @@ class StringMover {
private: private:
TChar* _ptr; TChar* _ptr;
}; };
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -7,8 +7,7 @@
#include "./StringCopier.hpp" #include "./StringCopier.hpp"
#include "./StringMover.hpp" #include "./StringMover.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
template <typename TMemoryPool, typename TInput, typename Enable = void> template <typename TMemoryPool, typename TInput, typename Enable = void>
struct StringStorage { struct StringStorage {
@ -40,5 +39,4 @@ typename StringStorage<TMemoryPool, TChar*>::type makeStringStorage(
TMemoryPool& jb, TChar* input) { TMemoryPool& jb, TChar* input) {
return StringStorage<TMemoryPool, TChar*>::create(jb, input); return StringStorage<TMemoryPool, TChar*>::create(jb, input);
} }
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -6,8 +6,7 @@
#include <WString.h> #include <WString.h>
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
class ArduinoString { class ArduinoString {
public: public:
@ -56,5 +55,4 @@ inline ArduinoString makeString(const ::String& str) {
return ArduinoString(str); return ArduinoString(str);
} }
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -4,8 +4,7 @@
#pragma once #pragma once
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
class FixedSizeFlashString { class FixedSizeFlashString {
public: public:
@ -43,5 +42,4 @@ inline FixedSizeFlashString makeString(const __FlashStringHelper* str,
size_t sz) { size_t sz) {
return FixedSizeFlashString(str, sz); return FixedSizeFlashString(str, sz);
} }
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -6,8 +6,7 @@
#include <string.h> // strcmp #include <string.h> // strcmp
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
class FixedSizeRamString { class FixedSizeRamString {
public: public:
@ -46,5 +45,4 @@ inline FixedSizeRamString makeString(const TChar* str, size_t size) {
return FixedSizeRamString(reinterpret_cast<const char*>(str), size); return FixedSizeRamString(reinterpret_cast<const char*>(str), size);
} }
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -6,8 +6,7 @@
#include <string> #include <string>
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
class StlString { class StlString {
public: public:
@ -49,5 +48,4 @@ inline StlString makeString(const std::string& str) {
return StlString(str); return StlString(str);
} }
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -6,8 +6,7 @@
#include "../Polyfills/type_traits.hpp" #include "../Polyfills/type_traits.hpp"
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
template <typename> template <typename>
struct IsString : false_type {}; struct IsString : false_type {};
@ -16,8 +15,7 @@ struct IsString<const T> : IsString<T> {};
template <typename T> template <typename T>
struct IsString<T&> : IsString<T> {}; struct IsString<T&> : IsString<T> {};
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson
#include "FixedSizeRamString.hpp" #include "FixedSizeRamString.hpp"
#include "ZeroTerminatedRamString.hpp" #include "ZeroTerminatedRamString.hpp"

View File

@ -4,8 +4,7 @@
#pragma once #pragma once
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
class ZeroTerminatedFlashString { class ZeroTerminatedFlashString {
public: public:
@ -44,5 +43,4 @@ inline ZeroTerminatedFlashString makeString(const __FlashStringHelper* str) {
template <> template <>
struct IsString<const __FlashStringHelper*> : true_type {}; struct IsString<const __FlashStringHelper*> : true_type {};
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -4,8 +4,7 @@
#pragma once #pragma once
namespace ArduinoJson { namespace ARDUINOJSON_NAMESPACE {
namespace Internals {
class ZeroTerminatedRamString { class ZeroTerminatedRamString {
public: public:
@ -49,5 +48,4 @@ struct IsString<TChar*> {
static const bool value = sizeof(TChar) == 1; static const bool value = sizeof(TChar) == 1;
}; };
} // namespace Internals } // namespace ARDUINOJSON_NAMESPACE
} // namespace ArduinoJson

View File

@ -85,3 +85,4 @@ add_subdirectory(MsgPackDeserializer)
add_subdirectory(MsgPackSerializer) add_subdirectory(MsgPackSerializer)
add_subdirectory(Numbers) add_subdirectory(Numbers)
add_subdirectory(StaticMemoryPool) add_subdirectory(StaticMemoryPool)
add_subdirectory(MixedConfiguration)

View File

@ -6,7 +6,7 @@
#include <catch.hpp> #include <catch.hpp>
#include <sstream> #include <sstream>
using namespace ArduinoJson::Internals; using namespace ARDUINOJSON_NAMESPACE;
static bool isAligned(void* ptr) { static bool isAligned(void* ptr) {
const size_t mask = sizeof(void*) - 1; const size_t mask = sizeof(void*) - 1;

View File

@ -5,7 +5,7 @@
#include <ArduinoJson.h> #include <ArduinoJson.h>
#include <catch.hpp> #include <catch.hpp>
using namespace ArduinoJson::Internals; using namespace ARDUINOJSON_NAMESPACE;
struct NoMemoryAllocator { struct NoMemoryAllocator {
void* allocate(size_t) { void* allocate(size_t) {

View File

@ -5,7 +5,7 @@
#include <ArduinoJson/Memory/DynamicMemoryPool.hpp> #include <ArduinoJson/Memory/DynamicMemoryPool.hpp>
#include <catch.hpp> #include <catch.hpp>
using namespace ArduinoJson::Internals; using namespace ARDUINOJSON_NAMESPACE;
TEST_CASE("DynamicMemoryPool::size()") { TEST_CASE("DynamicMemoryPool::size()") {
DynamicMemoryPool memoryPool; DynamicMemoryPool memoryPool;

View File

@ -5,7 +5,7 @@
#include <ArduinoJson/Memory/DynamicMemoryPool.hpp> #include <ArduinoJson/Memory/DynamicMemoryPool.hpp>
#include <catch.hpp> #include <catch.hpp>
using namespace ArduinoJson::Internals; using namespace ARDUINOJSON_NAMESPACE;
TEST_CASE("DynamicMemoryPool::startString()") { TEST_CASE("DynamicMemoryPool::startString()") {
SECTION("WorksWhenBufferIsBigEnough") { SECTION("WorksWhenBufferIsBigEnough") {

View File

@ -18,10 +18,10 @@ TEST_CASE("JsonArray::operator[]") {
REQUIRE(false == array[0].is<bool>()); REQUIRE(false == array[0].is<bool>());
} }
#if ARDUINOJSON_USE_LONG_LONG || ARDUINOJSON_USE_INT64 #if ARDUINOJSON_USE_LONG_LONG
SECTION("long long") { SECTION("long long") {
array[0] = 9223372036854775807; array[0] = 9223372036854775807;
REQUIRE(9223372036854775807 == array[0].as<long long>()); REQUIRE(9223372036854775807 == array[0].as<int64_t>());
REQUIRE(true == array[0].is<int>()); REQUIRE(true == array[0].is<int>());
REQUIRE(false == array[0].is<bool>()); REQUIRE(false == array[0].is<bool>());
} }

View File

@ -7,6 +7,11 @@
using namespace Catch::Matchers; using namespace Catch::Matchers;
namespace my {
using ARDUINOJSON_NAMESPACE::isinf;
using ARDUINOJSON_NAMESPACE::isnan;
}
TEST_CASE("deserializeJson(DynamicJsonDocument&)") { TEST_CASE("deserializeJson(DynamicJsonDocument&)") {
DynamicJsonDocument doc; DynamicJsonDocument doc;
@ -99,28 +104,28 @@ TEST_CASE("deserializeJson(DynamicJsonDocument&)") {
DeserializationError err = deserializeJson(doc, "NaN"); DeserializationError err = deserializeJson(doc, "NaN");
REQUIRE(err == DeserializationError::Ok); REQUIRE(err == DeserializationError::Ok);
REQUIRE(doc.is<float>() == true); REQUIRE(doc.is<float>() == true);
REQUIRE(Internals::isnan(doc.as<float>())); REQUIRE(my::isnan(doc.as<float>()));
} }
SECTION("Infinity") { SECTION("Infinity") {
DeserializationError err = deserializeJson(doc, "Infinity"); DeserializationError err = deserializeJson(doc, "Infinity");
REQUIRE(err == DeserializationError::Ok); REQUIRE(err == DeserializationError::Ok);
REQUIRE(doc.is<float>() == true); REQUIRE(doc.is<float>() == true);
REQUIRE(Internals::isinf(doc.as<float>())); REQUIRE(my::isinf(doc.as<float>()));
} }
SECTION("+Infinity") { SECTION("+Infinity") {
DeserializationError err = deserializeJson(doc, "+Infinity"); DeserializationError err = deserializeJson(doc, "+Infinity");
REQUIRE(err == DeserializationError::Ok); REQUIRE(err == DeserializationError::Ok);
REQUIRE(doc.is<float>() == true); REQUIRE(doc.is<float>() == true);
REQUIRE(Internals::isinf(doc.as<float>())); REQUIRE(my::isinf(doc.as<float>()));
} }
SECTION("-Infinity") { SECTION("-Infinity") {
DeserializationError err = deserializeJson(doc, "-Infinity"); DeserializationError err = deserializeJson(doc, "-Infinity");
REQUIRE(err == DeserializationError::Ok); REQUIRE(err == DeserializationError::Ok);
REQUIRE(doc.is<float>() == true); REQUIRE(doc.is<float>() == true);
REQUIRE(Internals::isinf(doc.as<float>())); REQUIRE(my::isinf(doc.as<float>()));
} }
SECTION("issue #628") { SECTION("issue #628") {

View File

@ -69,7 +69,7 @@ TEST_CASE("serializeJson(JsonVariant)") {
check(false, "false"); check(false, "false");
} }
#if ARDUINOJSON_USE_LONG_LONG || ARDUINOJSON_USE_INT64 #if ARDUINOJSON_USE_LONG_LONG
SECTION("NegativeInt64") { SECTION("NegativeInt64") {
check(-9223372036854775807 - 1, "-9223372036854775808"); check(-9223372036854775807 - 1, "-9223372036854775808");
} }

Some files were not shown because too many files have changed in this diff Show More