Reduced executable size

This commit is contained in:
Benoit Blanchon
2018-08-31 16:29:08 +02:00
parent 6d290bd001
commit e3639918eb
6 changed files with 152 additions and 126 deletions

View File

@ -15,7 +15,7 @@ namespace Internals {
// Used by List<T> and its iterators. // Used by List<T> and its iterators.
template <typename T> template <typename T>
struct ListNode : public Internals::JsonBufferAllocated { struct ListNode : public Internals::JsonBufferAllocated {
ListNode() throw() : next(NULL) {} ListNode() NOEXCEPT : next(NULL) {}
ListNode<T> *next; ListNode<T> *next;
T content; T content;

View File

@ -21,10 +21,11 @@ class JsonArray {
public: public:
typedef JsonArrayIterator iterator; typedef JsonArrayIterator iterator;
JsonArray() : _buffer(0), _data(0) {} FORCE_INLINE JsonArray() : _buffer(0), _data(0) {}
explicit JsonArray(Internals::JsonBuffer* buf, Internals::JsonArrayData* arr) FORCE_INLINE JsonArray(Internals::JsonBuffer* buf,
Internals::JsonArrayData* arr)
: _buffer(buf), _data(arr) {} : _buffer(buf), _data(arr) {}
explicit JsonArray(Internals::JsonBuffer* buf) FORCE_INLINE explicit JsonArray(Internals::JsonBuffer* buf)
: _buffer(buf), _data(new (buf) Internals::JsonArrayData()) {} : _buffer(buf), _data(new (buf) Internals::JsonArrayData()) {}
// Adds the specified value at the end of the array. // Adds the specified value at the end of the array.
@ -33,29 +34,29 @@ class JsonArray {
// TValue = bool, long, int, short, float, double, serialized, JsonVariant, // TValue = bool, long, int, short, float, double, serialized, JsonVariant,
// std::string, String, JsonArrayData, JsonObject // std::string, String, JsonArrayData, JsonObject
template <typename T> template <typename T>
bool add(const T& value) { FORCE_INLINE bool add(const T& value) {
return add_impl<const T&>(value); return add_impl<const T&>(value);
} }
// //
// bool add(TValue); // bool add(TValue);
// TValue = char*, const char*, const FlashStringHelper* // TValue = char*, const char*, const FlashStringHelper*
template <typename T> template <typename T>
bool add(T* value) { FORCE_INLINE bool add(T* value) {
return add_impl<T*>(value); return add_impl<T*>(value);
} }
iterator begin() const { FORCE_INLINE iterator begin() const {
if (!_data) return iterator(); if (!_data) return iterator();
return iterator(_buffer, _data->begin()); return iterator(_buffer, _data->begin());
} }
iterator end() const { FORCE_INLINE iterator end() const {
return iterator(); return iterator();
} }
// Imports a 1D array // Imports a 1D array
template <typename T, size_t N> template <typename T, size_t N>
bool copyFrom(T (&array)[N]) { FORCE_INLINE bool copyFrom(T (&array)[N]) {
return copyFrom(array, N); return copyFrom(array, N);
} }
@ -84,7 +85,7 @@ class JsonArray {
// Exports a 1D array // Exports a 1D array
template <typename T, size_t N> template <typename T, size_t N>
size_t copyTo(T (&array)[N]) const { FORCE_INLINE size_t copyTo(T (&array)[N]) const {
return copyTo(array, N); return copyTo(array, N);
} }
@ -106,39 +107,41 @@ class JsonArray {
} }
} }
JsonArray createNestedArray(); FORCE_INLINE JsonArray createNestedArray();
JsonObject createNestedObject(); FORCE_INLINE JsonObject createNestedObject();
Internals::JsonArraySubscript operator[](size_t index); FORCE_INLINE Internals::JsonArraySubscript operator[](size_t index);
const Internals::JsonArraySubscript operator[](size_t index) const; FORCE_INLINE const Internals::JsonArraySubscript operator[](
size_t index) const;
bool operator==(const JsonArray& rhs) const { FORCE_INLINE bool operator==(const JsonArray& rhs) const {
return _data == rhs._data; return _data == rhs._data;
} }
// Gets the value at the specified index. // Gets the value at the specified index.
template <typename T> template <typename T>
typename Internals::JsonVariantAs<T>::type get(size_t index) const { FORCE_INLINE typename Internals::JsonVariantAs<T>::type get(
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();
} }
// Check the type of the value at specified index. // Check the type of the value at specified index.
template <typename T> template <typename T>
bool is(size_t index) const { FORCE_INLINE bool is(size_t index) const {
iterator it = begin() += index; iterator it = begin() += index;
return it != end() ? it->is<T>() : false; return it != end() ? it->is<T>() : false;
} }
// Removes element at specified position. // Removes element at specified position.
void remove(iterator it) { FORCE_INLINE void remove(iterator it) {
if (!_data) return; if (!_data) return;
_data->remove(it.internal()); _data->remove(it.internal());
} }
// Removes element at specified index. // Removes element at specified index.
void remove(size_t index) { FORCE_INLINE void remove(size_t index) {
remove(begin() += index); remove(begin() += index);
} }
@ -148,7 +151,7 @@ class JsonArray {
// TValue = bool, long, int, short, float, double, serialized, JsonVariant, // TValue = bool, long, int, short, float, double, serialized, JsonVariant,
// std::string, String, JsonArrayData, JsonObject // std::string, String, JsonArrayData, JsonObject
template <typename T> template <typename T>
bool set(size_t index, const T& value) { FORCE_INLINE bool set(size_t index, const T& value) {
if (!_data) return false; if (!_data) return false;
return set_impl<const T&>(index, value); return set_impl<const T&>(index, value);
} }
@ -156,22 +159,22 @@ class JsonArray {
// bool add(size_t index, TValue); // bool add(size_t index, TValue);
// TValue = char*, const char*, const FlashStringHelper* // TValue = char*, const char*, const FlashStringHelper*
template <typename T> template <typename T>
bool set(size_t index, T* value) { FORCE_INLINE bool set(size_t index, T* value) {
if (!_data) return false; if (!_data) return false;
return set_impl<T*>(index, value); return set_impl<T*>(index, value);
} }
size_t size() const { FORCE_INLINE size_t size() const {
if (!_data) return 0; if (!_data) return 0;
return _data->size(); return _data->size();
} }
bool isNull() const { FORCE_INLINE bool isNull() const {
return _data == 0; return _data == 0;
} }
template <typename Visitor> template <typename Visitor>
void visit(Visitor& visitor) const { FORCE_INLINE void visit(Visitor& visitor) const {
if (_data) if (_data)
visitor.acceptArray(*_data); visitor.acceptArray(*_data);
else else
@ -180,14 +183,14 @@ class JsonArray {
private: private:
template <typename TValueRef> template <typename TValueRef>
bool set_impl(size_t index, TValueRef value) { FORCE_INLINE bool set_impl(size_t index, TValueRef value) {
iterator it = begin() += index; iterator it = begin() += index;
if (it == end()) return false; if (it == end()) return false;
return it->set(value); return it->set(value);
} }
template <typename TValueRef> template <typename TValueRef>
bool add_impl(TValueRef value) { FORCE_INLINE bool add_impl(TValueRef value) {
if (!_data) return false; if (!_data) return false;
iterator it = iterator(_buffer, _data->add(_buffer)); iterator it = iterator(_buffer, _data->add(_buffer));
if (it == end()) return false; if (it == end()) return false;

View File

@ -16,14 +16,14 @@ class JsonObject {
public: public:
typedef JsonObjectIterator iterator; typedef JsonObjectIterator iterator;
JsonObject() : _buffer(0), _data(0) {} FORCE_INLINE JsonObject() : _buffer(0), _data(0) {}
explicit JsonObject(Internals::JsonBuffer* buf, FORCE_INLINE JsonObject(Internals::JsonBuffer* buf,
Internals::JsonObjectData* object) Internals::JsonObjectData* object)
: _buffer(buf), _data(object) {} : _buffer(buf), _data(object) {}
explicit JsonObject(Internals::JsonBuffer* buf) FORCE_INLINE explicit JsonObject(Internals::JsonBuffer* buf)
: _buffer(buf), _data(new (buf) Internals::JsonObjectData()) {} : _buffer(buf), _data(new (buf) Internals::JsonObjectData()) {}
iterator begin() const { FORCE_INLINE iterator begin() const {
if (!_data) return iterator(); if (!_data) return iterator();
return iterator(_buffer, _data->begin()); return iterator(_buffer, _data->begin());
} }
@ -33,18 +33,18 @@ class JsonObject {
// bool containsKey(TKey); // bool containsKey(TKey);
// TKey = const std::string&, const String& // TKey = const std::string&, const String&
template <typename TString> template <typename TString>
bool containsKey(const TString& key) const { FORCE_INLINE bool containsKey(const TString& key) const {
return containsKey_impl<const TString&>(key); return containsKey_impl<const TString&>(key);
} }
// //
// bool containsKey(TKey); // bool containsKey(TKey);
// TKey = char*, const char*, char[], const char[], const FlashStringHelper* // TKey = char*, const char*, char[], const char[], const FlashStringHelper*
template <typename TString> template <typename TString>
bool containsKey(TString* key) const { FORCE_INLINE bool containsKey(TString* key) const {
return containsKey_impl<TString*>(key); return containsKey_impl<TString*>(key);
} }
iterator end() const { FORCE_INLINE iterator end() const {
return iterator(); return iterator();
} }
@ -53,18 +53,18 @@ class JsonObject {
// JsonArray createNestedArray(TKey); // JsonArray createNestedArray(TKey);
// TKey = const std::string&, const String& // TKey = const std::string&, const String&
template <typename TString> template <typename TString>
JsonArray createNestedArray(const TString& key); FORCE_INLINE JsonArray createNestedArray(const TString& key);
// JsonArray createNestedArray(TKey); // JsonArray createNestedArray(TKey);
// TKey = char*, const char*, char[], const char[], const FlashStringHelper* // TKey = char*, const char*, char[], const char[], const FlashStringHelper*
template <typename TString> template <typename TString>
JsonArray createNestedArray(TString* key); FORCE_INLINE JsonArray createNestedArray(TString* key);
// Creates and adds a JsonObject. // Creates and adds a JsonObject.
// //
// JsonObject createNestedObject(TKey); // JsonObject createNestedObject(TKey);
// TKey = const std::string&, const String& // TKey = const std::string&, const String&
template <typename TString> template <typename TString>
JsonObject createNestedObject(const TString& key) { FORCE_INLINE JsonObject createNestedObject(const TString& key) {
if (!_data) return JsonObject(); if (!_data) return JsonObject();
return createNestedObject_impl<const TString&>(key); return createNestedObject_impl<const TString&>(key);
} }
@ -72,7 +72,7 @@ class JsonObject {
// JsonObject createNestedObject(TKey); // JsonObject createNestedObject(TKey);
// TKey = char*, const char*, char[], const char[], const FlashStringHelper* // TKey = char*, const char*, char[], const char[], const FlashStringHelper*
template <typename TString> template <typename TString>
JsonObject createNestedObject(TString* key) { FORCE_INLINE JsonObject createNestedObject(TString* key) {
return createNestedObject_impl<TString*>(key); return createNestedObject_impl<TString*>(key);
} }
@ -83,7 +83,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>
typename Internals::JsonVariantAs<TValue>::type get( FORCE_INLINE typename Internals::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);
} }
@ -93,7 +93,8 @@ 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>
typename Internals::JsonVariantAs<TValue>::type get(TString* key) const { FORCE_INLINE typename Internals::JsonVariantAs<TValue>::type get(
TString* key) const {
return get_impl<TString*, TValue>(key); return get_impl<TString*, TValue>(key);
} }
@ -105,7 +106,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>
bool is(const TString& key) const { FORCE_INLINE bool is(const TString& key) const {
return is_impl<const TString&, TValue>(key); return is_impl<const TString&, TValue>(key);
} }
// //
@ -114,7 +115,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>
bool is(TString* key) const { FORCE_INLINE bool is(TString* key) const {
return is_impl<TString*, TValue>(key); return is_impl<TString*, TValue>(key);
} }
@ -123,7 +124,7 @@ 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>
Internals::JsonObjectSubscript<const TString&> operator[]( FORCE_INLINE Internals::JsonObjectSubscript<const TString&> operator[](
const TString& key) { const TString& key) {
return Internals::JsonObjectSubscript<const TString&>(*this, key); return Internals::JsonObjectSubscript<const TString&>(*this, key);
} }
@ -131,7 +132,8 @@ class JsonObject {
// 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>
Internals::JsonObjectSubscript<TString*> operator[](TString* key) { FORCE_INLINE Internals::JsonObjectSubscript<TString*> operator[](
TString* key) {
return Internals::JsonObjectSubscript<TString*>(*this, key); return Internals::JsonObjectSubscript<TString*>(*this, key);
} }
@ -140,7 +142,7 @@ 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>
const Internals::JsonObjectSubscript<const TString&> operator[]( FORCE_INLINE const Internals::JsonObjectSubscript<const TString&> operator[](
const TString& key) const { const TString& key) const {
return Internals::JsonObjectSubscript<const TString&>(*this, key); return Internals::JsonObjectSubscript<const TString&>(*this, key);
} }
@ -148,16 +150,16 @@ class JsonObject {
// 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>
const Internals::JsonObjectSubscript<TString*> operator[]( FORCE_INLINE const Internals::JsonObjectSubscript<TString*> operator[](
TString* key) const { TString* key) const {
return Internals::JsonObjectSubscript<TString*>(*this, key); return Internals::JsonObjectSubscript<TString*>(*this, key);
} }
bool operator==(const JsonObject& rhs) const { FORCE_INLINE bool operator==(const JsonObject& rhs) const {
return _data == rhs._data; return _data == rhs._data;
} }
void remove(iterator it) { FORCE_INLINE void remove(iterator it) {
if (!_data) return; if (!_data) return;
_data->remove(it.internal()); _data->remove(it.internal());
} }
@ -167,14 +169,14 @@ class JsonObject {
// void remove(TKey); // void remove(TKey);
// TKey = const std::string&, const String& // TKey = const std::string&, const String&
template <typename TString> template <typename TString>
void remove(const TString& key) { FORCE_INLINE void remove(const TString& key) {
remove_impl<const TString&>(key); remove_impl<const TString&>(key);
} }
// //
// void remove(TKey); // void remove(TKey);
// TKey = char*, const char*, char[], const char[], const FlashStringHelper* // TKey = char*, const char*, char[], const char[], const FlashStringHelper*
template <typename TString> template <typename TString>
void remove(TString* key) { FORCE_INLINE void remove(TString* key) {
remove_impl<TString*>(key); remove_impl<TString*>(key);
} }
@ -185,7 +187,7 @@ class JsonObject {
// TValue = bool, long, int, short, float, double, serialized, JsonVariant, // TValue = bool, long, int, short, float, double, serialized, JsonVariant,
// std::string, String, JsonArray, JsonObject // std::string, String, JsonArray, JsonObject
template <typename TValue, typename TString> template <typename TValue, typename TString>
bool set(const TString& key, const TValue& value) { FORCE_INLINE bool set(const TString& key, const TValue& value) {
return set_impl<const TString&, const TValue&>(key, value); return set_impl<const TString&, const TValue&>(key, value);
} }
// //
@ -193,7 +195,7 @@ class JsonObject {
// TKey = const std::string&, const String& // TKey = const std::string&, const String&
// TValue = char*, const char*, const FlashStringHelper* // TValue = char*, const char*, const FlashStringHelper*
template <typename TValue, typename TString> template <typename TValue, typename TString>
bool set(const TString& key, TValue* value) { FORCE_INLINE bool set(const TString& key, TValue* value) {
return set_impl<const TString&, TValue*>(key, value); return set_impl<const TString&, TValue*>(key, value);
} }
// //
@ -202,7 +204,7 @@ class JsonObject {
// TValue = bool, long, int, short, float, double, serialized, JsonVariant, // TValue = bool, long, int, short, float, double, serialized, JsonVariant,
// std::string, String, JsonArray, JsonObject // std::string, String, JsonArray, JsonObject
template <typename TValue, typename TString> template <typename TValue, typename TString>
bool set(TString* key, const TValue& value) { FORCE_INLINE bool set(TString* key, const TValue& value) {
return set_impl<TString*, const TValue&>(key, value); return set_impl<TString*, const TValue&>(key, value);
} }
// //
@ -210,21 +212,21 @@ class JsonObject {
// TKey = char*, const char*, const FlashStringHelper* // TKey = char*, const char*, const FlashStringHelper*
// TValue = char*, const char*, const FlashStringHelper* // TValue = char*, const char*, const FlashStringHelper*
template <typename TValue, typename TString> template <typename TValue, typename TString>
bool set(TString* key, TValue* value) { FORCE_INLINE bool set(TString* key, TValue* value) {
return set_impl<TString*, TValue*>(key, value); return set_impl<TString*, TValue*>(key, value);
} }
size_t size() const { FORCE_INLINE size_t size() const {
if (!_data) return 0; if (!_data) return 0;
return _data->size(); return _data->size();
} }
bool isNull() const { FORCE_INLINE bool isNull() const {
return _data == 0; return _data == 0;
} }
template <typename Visitor> template <typename Visitor>
void visit(Visitor& visitor) const { FORCE_INLINE void visit(Visitor& visitor) const {
if (_data) if (_data)
visitor.acceptObject(*_data); visitor.acceptObject(*_data);
else else
@ -233,15 +235,15 @@ class JsonObject {
private: private:
template <typename TStringRef> template <typename TStringRef>
bool containsKey_impl(TStringRef key) const { FORCE_INLINE bool containsKey_impl(TStringRef key) const {
return findKey<TStringRef>(key) != _data->end(); return findKey<TStringRef>(key) != _data->end();
} }
template <typename TStringRef> template <typename TStringRef>
JsonArray createNestedArray_impl(TStringRef key); FORCE_INLINE JsonArray createNestedArray_impl(TStringRef key);
template <typename TStringRef> template <typename TStringRef>
JsonObject createNestedObject_impl(TStringRef key); FORCE_INLINE JsonObject createNestedObject_impl(TStringRef key);
// Returns the list node that matches the specified key. // Returns the list node that matches the specified key.
template <typename TStringRef> template <typename TStringRef>
@ -254,12 +256,12 @@ class JsonObject {
return it; return it;
} }
template <typename TStringRef> template <typename TStringRef>
internal_iterator findKey(TStringRef key) const { FORCE_INLINE internal_iterator findKey(TStringRef key) const {
return const_cast<JsonObject*>(this)->findKey<TStringRef>(key); return const_cast<JsonObject*>(this)->findKey<TStringRef>(key);
} }
template <typename TStringRef, typename TValue> template <typename TStringRef, typename TValue>
typename Internals::JsonVariantAs<TValue>::type get_impl( FORCE_INLINE typename Internals::JsonVariantAs<TValue>::type get_impl(
TStringRef key) const { TStringRef key) const {
internal_iterator it = findKey<TStringRef>(key); internal_iterator it = findKey<TStringRef>(key);
return it != _data->end() ? JsonVariant(_buffer, &it->value).as<TValue>() return it != _data->end() ? JsonVariant(_buffer, &it->value).as<TValue>()
@ -267,20 +269,20 @@ class JsonObject {
} }
template <typename TStringRef, typename TValue> template <typename TStringRef, typename TValue>
bool is_impl(TStringRef key) const { FORCE_INLINE bool is_impl(TStringRef key) const {
internal_iterator it = findKey<TStringRef>(key); internal_iterator it = findKey<TStringRef>(key);
return it != _data->end() ? JsonVariant(_buffer, &it->value).is<TValue>() return it != _data->end() ? JsonVariant(_buffer, &it->value).is<TValue>()
: false; : false;
} }
template <typename TStringRef> template <typename TStringRef>
void remove_impl(TStringRef key) { FORCE_INLINE void remove_impl(TStringRef key) {
if (!_data) return; if (!_data) return;
_data->remove(findKey<TStringRef>(key)); _data->remove(findKey<TStringRef>(key));
} }
template <typename TStringRef, typename TValueRef> template <typename TStringRef, typename TValueRef>
bool set_impl(TStringRef key, TValueRef value) { FORCE_INLINE bool set_impl(TStringRef key, TValueRef value) {
if (!_data) return false; if (!_data) return false;
// ignore null key // ignore null key
@ -300,13 +302,13 @@ class JsonObject {
return JsonVariant(_buffer, &it->value).set(value); return JsonVariant(_buffer, &it->value).set(value);
} }
bool set_key(internal_iterator& it, const char* key) { FORCE_INLINE bool set_key(internal_iterator& it, const char* key) {
it->key = key; it->key = key;
return true; return true;
} }
template <typename T> template <typename T>
bool set_key(internal_iterator& it, const T& key) { FORCE_INLINE bool set_key(internal_iterator& it, const T& key) {
const char* dup = Internals::makeString(key).save(_buffer); const char* dup = Internals::makeString(key).save(_buffer);
if (!dup) return false; if (!dup) return false;
it->key = dup; it->key = dup;

View File

@ -31,15 +31,15 @@ class JsonObject;
class JsonVariant : public Internals::JsonVariantBase<JsonVariant> { class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
public: public:
// Intenal use only // Intenal use only
explicit JsonVariant(Internals::JsonBuffer *buffer, FORCE_INLINE JsonVariant(Internals::JsonBuffer *buffer,
Internals::JsonVariantData *data) Internals::JsonVariantData *data)
: _buffer(buffer), _data(data) {} : _buffer(buffer), _data(data) {}
// Creates an uninitialized JsonVariant // Creates an uninitialized JsonVariant
JsonVariant() : _buffer(0), _data(0) {} FORCE_INLINE JsonVariant() : _buffer(0), _data(0) {}
// set(bool value) // set(bool value)
bool set(bool value) { FORCE_INLINE bool set(bool value) {
if (!_data) return false; if (!_data) return false;
_data->setBoolean(value); _data->setBoolean(value);
return true; return true;
@ -48,8 +48,9 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
// set(double value); // set(double value);
// set(float value); // set(float value);
template <typename T> template <typename T>
bool set(T value, typename Internals::enable_if< FORCE_INLINE bool set(
Internals::is_floating_point<T>::value>::type * = 0) { T value, typename Internals::enable_if<
Internals::is_floating_point<T>::value>::type * = 0) {
if (!_data) return false; if (!_data) return false;
_data->setFloat(static_cast<Internals::JsonFloat>(value)); _data->setFloat(static_cast<Internals::JsonFloat>(value));
return true; return true;
@ -61,10 +62,11 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
// set(signed long) // set(signed long)
// set(signed char) // set(signed char)
template <typename T> template <typename T>
bool set(T value, FORCE_INLINE bool set(
typename Internals::enable_if<Internals::is_integral<T>::value && T value,
Internals::is_signed<T>::value>::type typename Internals::enable_if<Internals::is_integral<T>::value &&
* = 0) { Internals::is_signed<T>::value>::type * =
0) {
if (!_data) return false; if (!_data) return false;
if (value >= 0) if (value >= 0)
_data->setPostiveInteger(static_cast<Internals::JsonUInt>(value)); _data->setPostiveInteger(static_cast<Internals::JsonUInt>(value));
@ -77,17 +79,18 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
// set(unsigned int) // set(unsigned int)
// set(unsigned long) // set(unsigned long)
template <typename T> template <typename T>
bool set(T value, FORCE_INLINE bool set(
typename Internals::enable_if<Internals::is_integral<T>::value && T value,
Internals::is_unsigned<T>::value>::type typename Internals::enable_if<Internals::is_integral<T>::value &&
* = 0) { Internals::is_unsigned<T>::value>::type * =
0) {
if (!_data) return false; if (!_data) return false;
_data->setPostiveInteger(static_cast<Internals::JsonUInt>(value)); _data->setPostiveInteger(static_cast<Internals::JsonUInt>(value));
return true; return true;
} }
// set(SerializedValue<const char *>) // set(SerializedValue<const char *>)
bool set(Internals::SerializedValue<const char *> value) { FORCE_INLINE bool set(Internals::SerializedValue<const char *> value) {
if (!_data) return false; if (!_data) return false;
_data->setRaw(value.data(), value.size()); _data->setRaw(value.data(), value.size());
return true; return true;
@ -97,9 +100,10 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
// set(SerializedValue<String>) // set(SerializedValue<String>)
// set(SerializedValue<const __FlashStringHelper*>) // set(SerializedValue<const __FlashStringHelper*>)
template <typename T> template <typename T>
bool set(Internals::SerializedValue<T> value, FORCE_INLINE bool set(
typename Internals::enable_if< Internals::SerializedValue<T> value,
!Internals::is_same<const char *, T>::value>::type * = 0) { typename Internals::enable_if<
!Internals::is_same<const char *, T>::value>::type * = 0) {
if (!_data) return false; if (!_data) return false;
const char *dup = const char *dup =
Internals::makeString(value.data(), value.size()).save(_buffer); Internals::makeString(value.data(), value.size()).save(_buffer);
@ -113,9 +117,10 @@ 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>
bool set(const T &value, FORCE_INLINE bool set(
typename Internals::enable_if<Internals::IsString<T>::value>::type const T &value,
* = 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(_buffer); const char *dup = Internals::makeString(value).save(_buffer);
if (dup) { if (dup) {
@ -129,9 +134,10 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
// set(char*) // set(char*)
template <typename T> template <typename T>
bool set(T *value, FORCE_INLINE bool set(
typename Internals::enable_if<Internals::IsString<T *>::value>::type T *value,
* = 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(_buffer); const char *dup = Internals::makeString(value).save(_buffer);
if (dup) { if (dup) {
@ -144,13 +150,13 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
} }
// set(const char*); // set(const char*);
bool set(const char *value) { FORCE_INLINE bool set(const char *value) {
if (!_data) return false; if (!_data) return false;
_data->setString(value); _data->setString(value);
return true; return true;
} }
bool set(const JsonVariant &value) { FORCE_INLINE bool set(const JsonVariant &value) {
if (!_data) return false; if (!_data) return false;
if (value._data) if (value._data)
*_data = *value._data; *_data = *value._data;
@ -159,11 +165,11 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
return true; return true;
} }
bool set(const JsonArray &array); FORCE_INLINE bool set(const JsonArray &array);
bool set(const Internals::JsonArraySubscript &); FORCE_INLINE bool set(const Internals::JsonArraySubscript &);
bool set(const JsonObject &object); FORCE_INLINE bool set(const JsonObject &object);
template <typename TString> template <typename TString>
bool set(const Internals::JsonObjectSubscript<TString> &); FORCE_INLINE bool set(const Internals::JsonObjectSubscript<TString> &);
// Get the variant as the specified type. // Get the variant as the specified type.
// //
@ -177,14 +183,15 @@ 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>
const typename Internals::enable_if<Internals::is_integral<T>::value, T>::type FORCE_INLINE const typename Internals::enable_if<
Internals::is_integral<T>::value, T>::type
as() const { as() const {
return _data ? _data->asInteger<T>() : T(); return _data ? _data->asInteger<T>() : T();
} }
// bool as<bool>() const // bool as<bool>() const
template <typename T> template <typename T>
const typename Internals::enable_if<Internals::is_same<T, bool>::value, FORCE_INLINE const typename Internals::enable_if<
T>::type Internals::is_same<T, bool>::value, T>::type
as() const { as() const {
return _data && _data->asInteger<int>() != 0; return _data && _data->asInteger<int>() != 0;
} }
@ -192,8 +199,8 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
// double as<double>() const; // double as<double>() const;
// float as<float>() const; // float as<float>() const;
template <typename T> template <typename T>
const typename Internals::enable_if<Internals::is_floating_point<T>::value, FORCE_INLINE const typename Internals::enable_if<
T>::type Internals::is_floating_point<T>::value, T>::type
as() const { as() const {
return _data ? _data->asFloat<T>() : 0; return _data ? _data->asFloat<T>() : 0;
} }
@ -201,9 +208,10 @@ 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>
typename Internals::enable_if<Internals::is_same<T, const char *>::value || FORCE_INLINE typename Internals::enable_if<
Internals::is_same<T, char *>::value, Internals::is_same<T, const char *>::value ||
const char *>::type Internals::is_same<T, char *>::value,
const char *>::type
as() const { as() const {
return _data ? _data->asString() : 0; return _data ? _data->asString() : 0;
} }
@ -211,8 +219,10 @@ 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>
typename Internals::enable_if<Internals::IsWriteableString<T>::value, T>::type FORCE_INLINE
as() const { typename Internals::enable_if<Internals::IsWriteableString<T>::value,
T>::type
as() const {
const char *cstr = _data ? _data->asString() : 0; const char *cstr = _data ? _data->asString() : 0;
if (cstr) return T(cstr); if (cstr) return T(cstr);
T s; T s;
@ -223,7 +233,7 @@ 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>
typename Internals::enable_if< FORCE_INLINE typename Internals::enable_if<
Internals::is_same<typename Internals::remove_const<T>::type, Internals::is_same<typename Internals::remove_const<T>::type,
JsonArray>::value, JsonArray>::value,
JsonArray>::type JsonArray>::type
@ -232,7 +242,7 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
// 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>
typename Internals::enable_if< FORCE_INLINE typename Internals::enable_if<
Internals::is_same<typename Internals::remove_const<T>::type, Internals::is_same<typename Internals::remove_const<T>::type,
JsonObject>::value, JsonObject>::value,
T>::type T>::type
@ -240,9 +250,10 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
// //
// JsonVariant as<JsonVariant> const; // JsonVariant as<JsonVariant> const;
template <typename T> template <typename T>
typename Internals::enable_if<Internals::is_same<T, JsonVariant>::value, FORCE_INLINE
T>::type typename Internals::enable_if<Internals::is_same<T, JsonVariant>::value,
as() const { T>::type
as() const {
return *this; return *this;
} }
@ -259,7 +270,8 @@ 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>
typename Internals::enable_if<Internals::is_integral<T>::value, bool>::type FORCE_INLINE typename Internals::enable_if<Internals::is_integral<T>::value,
bool>::type
is() const { is() const {
return _data && _data->isInteger(); return _data && _data->isInteger();
} }
@ -267,15 +279,17 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
// bool is<double>() const; // bool is<double>() const;
// bool is<float>() const; // bool is<float>() const;
template <typename T> template <typename T>
typename Internals::enable_if<Internals::is_floating_point<T>::value, FORCE_INLINE
bool>::type typename Internals::enable_if<Internals::is_floating_point<T>::value,
is() const { bool>::type
is() const {
return _data && _data->isFloat(); return _data && _data->isFloat();
} }
// //
// bool is<bool>() const // bool is<bool>() const
template <typename T> template <typename T>
typename Internals::enable_if<Internals::is_same<T, bool>::value, bool>::type FORCE_INLINE typename Internals::enable_if<Internals::is_same<T, bool>::value,
bool>::type
is() const { is() const {
return _data && _data->isBoolean(); return _data && _data->isBoolean();
} }
@ -283,9 +297,10 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
// bool is<const char*>() const; // bool is<const char*>() const;
// bool is<char*>() const; // bool is<char*>() const;
template <typename T> template <typename T>
typename Internals::enable_if<Internals::is_same<T, const char *>::value || FORCE_INLINE typename Internals::enable_if<
Internals::is_same<T, char *>::value, Internals::is_same<T, const char *>::value ||
bool>::type Internals::is_same<T, char *>::value,
bool>::type
is() const { is() const {
return _data && _data->isString(); return _data && _data->isString();
} }
@ -293,7 +308,7 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
// bool is<JsonArray> const; // bool is<JsonArray> const;
// bool is<const JsonArray> const; // bool is<const JsonArray> const;
template <typename T> template <typename T>
typename Internals::enable_if< FORCE_INLINE typename Internals::enable_if<
Internals::is_same<typename Internals::remove_const<T>::type, Internals::is_same<typename Internals::remove_const<T>::type,
JsonArray>::value, JsonArray>::value,
bool>::type bool>::type
@ -304,7 +319,7 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
// bool is<JsonObject> const; // bool is<JsonObject> const;
// bool is<const JsonObject> const; // bool is<const JsonObject> const;
template <typename T> template <typename T>
typename Internals::enable_if< FORCE_INLINE typename Internals::enable_if<
Internals::is_same<typename Internals::remove_const<T>::type, Internals::is_same<typename Internals::remove_const<T>::type,
JsonObject>::value, JsonObject>::value,
bool>::type bool>::type
@ -313,12 +328,12 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
} }
// Returns true if the variant has a value // Returns true if the variant has a value
bool isNull() const { FORCE_INLINE bool isNull() const {
return _data == 0 || _data->isNull(); return _data == 0 || _data->isNull();
} }
template <typename Visitor> template <typename Visitor>
void visit(Visitor &visitor) const { FORCE_INLINE void visit(Visitor &visitor) const {
if (_data) if (_data)
_data->visit(visitor); _data->visit(visitor);
else else

View File

@ -11,12 +11,12 @@ namespace Internals {
class JsonBufferAllocated { class JsonBufferAllocated {
public: public:
void *operator new(size_t n, JsonBuffer *jsonBuffer) throw() { void *operator new(size_t n, JsonBuffer *jsonBuffer) NOEXCEPT {
if (!jsonBuffer) return NULL; if (!jsonBuffer) return NULL;
return jsonBuffer->alloc(n); return jsonBuffer->alloc(n);
} }
void operator delete(void *, JsonBuffer *)throw() {} void operator delete(void *, JsonBuffer *)NOEXCEPT {}
}; };
} // namespace Internals } // namespace Internals
} // namespace ArduinoJson } // namespace ArduinoJson

View File

@ -27,3 +27,9 @@
#define DEPRECATED(msg) #define DEPRECATED(msg)
#endif #endif
#if __cplusplus >= 201103L
#define NOEXCEPT noexcept
#else
#define NOEXCEPT throw()
#endif