Optimized JsonVariant::is<float>()

This commit is contained in:
Benoit Blanchon
2021-04-21 13:21:40 +02:00
parent d8a1d1a120
commit 892c37db08
3 changed files with 13 additions and 11 deletions

View File

@ -16,15 +16,18 @@ namespace ARDUINOJSON_NAMESPACE {
enum { enum {
VALUE_MASK = 0x7F, VALUE_MASK = 0x7F,
VALUE_IS_OWNED = 0x01, OWNED_VALUE_BIT = 0x01,
VALUE_IS_NULL = 0, VALUE_IS_NULL = 0,
VALUE_IS_LINKED_RAW = 0x02, VALUE_IS_LINKED_RAW = 0x02,
VALUE_IS_OWNED_RAW = 0x03, VALUE_IS_OWNED_RAW = 0x03,
VALUE_IS_LINKED_STRING = 0x04, VALUE_IS_LINKED_STRING = 0x04,
VALUE_IS_OWNED_STRING = 0x05, VALUE_IS_OWNED_STRING = 0x05,
// CAUTION: no VALUE_IS_OWNED below // CAUTION: no OWNED_VALUE_BIT below
VALUE_IS_BOOLEAN = 0x06, VALUE_IS_BOOLEAN = 0x06,
NUMBER_BIT = 0x08,
VALUE_IS_UNSIGNED_INTEGER = 0x08, VALUE_IS_UNSIGNED_INTEGER = 0x08,
VALUE_IS_SIGNED_INTEGER = 0x0A, VALUE_IS_SIGNED_INTEGER = 0x0A,
VALUE_IS_FLOAT = 0x0C, VALUE_IS_FLOAT = 0x0C,
@ -33,7 +36,7 @@ enum {
VALUE_IS_OBJECT = 0x20, VALUE_IS_OBJECT = 0x20,
VALUE_IS_ARRAY = 0x40, VALUE_IS_ARRAY = 0x40,
KEY_IS_OWNED = 0x80 OWNED_KEY_BIT = 0x80
}; };
struct RawData { struct RawData {

View File

@ -141,8 +141,7 @@ class VariantData {
} }
bool isFloat() const { bool isFloat() const {
return type() == VALUE_IS_FLOAT || type() == VALUE_IS_UNSIGNED_INTEGER || return (_flags & NUMBER_BIT) != 0;
type() == VALUE_IS_SIGNED_INTEGER;
} }
bool isString() const { bool isString() const {
@ -308,7 +307,7 @@ class VariantData {
} }
void movePointers(ptrdiff_t stringDistance, ptrdiff_t variantDistance) { void movePointers(ptrdiff_t stringDistance, ptrdiff_t variantDistance) {
if (_flags & VALUE_IS_OWNED) if (_flags & OWNED_VALUE_BIT)
_content.asString += stringDistance; _content.asString += stringDistance;
if (_flags & COLLECTION_MASK) if (_flags & COLLECTION_MASK)
_content.asCollection.movePointers(stringDistance, variantDistance); _content.asCollection.movePointers(stringDistance, variantDistance);
@ -320,7 +319,7 @@ class VariantData {
private: private:
void setType(uint8_t t) { void setType(uint8_t t) {
_flags &= KEY_IS_OWNED; _flags &= OWNED_KEY_BIT;
_flags |= t; _flags |= t;
} }

View File

@ -79,7 +79,7 @@ class VariantSlot {
void setKey(const char* k, storage_policies::store_by_copy) { void setKey(const char* k, storage_policies::store_by_copy) {
ARDUINOJSON_ASSERT(k != NULL); ARDUINOJSON_ASSERT(k != NULL);
_flags |= KEY_IS_OWNED; _flags |= OWNED_KEY_BIT;
_key = k; _key = k;
} }
@ -94,7 +94,7 @@ class VariantSlot {
} }
bool ownsKey() const { bool ownsKey() const {
return (_flags & KEY_IS_OWNED) != 0; return (_flags & OWNED_KEY_BIT) != 0;
} }
void clear() { void clear() {
@ -104,9 +104,9 @@ class VariantSlot {
} }
void movePointers(ptrdiff_t stringDistance, ptrdiff_t variantDistance) { void movePointers(ptrdiff_t stringDistance, ptrdiff_t variantDistance) {
if (_flags & KEY_IS_OWNED) if (_flags & OWNED_KEY_BIT)
_key += stringDistance; _key += stringDistance;
if (_flags & VALUE_IS_OWNED) if (_flags & OWNED_VALUE_BIT)
_content.asString += stringDistance; _content.asString += stringDistance;
if (_flags & COLLECTION_MASK) if (_flags & COLLECTION_MASK)
_content.asCollection.movePointers(stringDistance, variantDistance); _content.asCollection.movePointers(stringDistance, variantDistance);