Replaced composition by inheritance

This commit is contained in:
Benoit Blanchon
2014-07-19 12:44:27 +02:00
parent 851d21e08c
commit b278d7711b
12 changed files with 92 additions and 135 deletions

View File

@ -7,7 +7,6 @@
#include "JsonObject.h" #include "JsonObject.h"
using namespace ArduinoJson::Parser; using namespace ArduinoJson::Parser;
using namespace ArduinoJson::Internal;
DEPRECATED JsonObject JsonArray::getHashTable(int index) DEPRECATED JsonObject JsonArray::getHashTable(int index)
{ {
@ -17,14 +16,14 @@ DEPRECATED JsonObject JsonArray::getHashTable(int index)
/* /*
* Returns the token for the value at the specified index * Returns the token for the value at the specified index
*/ */
JsonValue JsonArray::operator[](int index) JsonValue JsonArray::getValue(int index)
{ {
// sanity check // sanity check
if (index < 0 || !token.isArray() || index >= token.size()) if (index < 0 || !isArray() || index >= size())
return JsonValue::null(); return JsonValue::null();
// skip first token, it's the whole object // skip first token, it's the whole object
JsonToken runningToken = token.firstChild(); JsonToken runningToken = firstChild();
// skip all tokens before the specified index // skip all tokens before the specified index
for (int i = 0; i < index; i++) for (int i = 0; i < index; i++)
@ -33,5 +32,5 @@ JsonValue JsonArray::operator[](int index)
runningToken = runningToken.nextSibling(); runningToken = runningToken.nextSibling();
} }
return JsonValue(json, runningToken); return runningToken;
} }

View File

@ -15,42 +15,42 @@ namespace ArduinoJson
{ {
class JsonObject; class JsonObject;
class JsonArray class JsonArray : public JsonToken
{ {
public: public:
JsonArray() JsonArray()
: token(0)
{ {
} }
JsonArray(char* json, Internal::JsonToken token) JsonArray(JsonToken token)
: json(json), token(token) : JsonToken(token)
{ {
} }
bool success() bool success()
{ {
return token.isArray(); return isArray();
} }
int size() int size()
{ {
return success() ? token.size() : 0; return isArray() ? JsonToken::size() : 0;
} }
JsonValue operator[](int index); JsonValue operator[](int index)
{
return getValue(index);
}
JsonArrayIterator begin() JsonArrayIterator begin()
{ {
return JsonArrayIterator(json, token.firstChild()); return firstChild();
} }
JsonArrayIterator end() JsonArrayIterator end()
{ {
return JsonArrayIterator(json, token.nextSibling()); return nextSibling();
} }
DEPRECATED int getLength() DEPRECATED int getLength()
@ -60,40 +60,34 @@ namespace ArduinoJson
DEPRECATED JsonArray getArray(int index) DEPRECATED JsonArray getArray(int index)
{ {
return (JsonArray) (*this)[index]; return getValue(index);
} }
DEPRECATED bool getBool(int index) DEPRECATED bool getBool(int index)
{ {
return (bool) (*this)[index]; return getValue(index);
} }
DEPRECATED double getDouble(int index) DEPRECATED double getDouble(int index)
{ {
return (double) (*this)[index]; return getValue(index);
} }
DEPRECATED JsonObject getHashTable(int index); DEPRECATED JsonObject getHashTable(int index);
DEPRECATED long getLong(int index) DEPRECATED long getLong(int index)
{ {
return (long) (*this)[index]; return getValue(index);
} }
DEPRECATED char* getString(int index) DEPRECATED char* getString(int index)
{ {
return (char*) (*this)[index]; return getValue(index);
}
static JsonArray null()
{
return JsonArray();
} }
private: private:
char* json; JsonValue getValue(int index);
Internal::JsonToken token;
}; };
} }
} }

View File

@ -12,35 +12,25 @@ namespace ArduinoJson
{ {
namespace Parser namespace Parser
{ {
class JsonArrayIterator class JsonArrayIterator : public JsonToken
{ {
public: public:
JsonArrayIterator(char* json, Internal::JsonToken token) JsonArrayIterator(JsonToken token)
: json(json), token(token) : JsonToken(token)
{ {
} }
void operator++() void operator++()
{ {
token = token.nextSibling(); *this = JsonArrayIterator(nextSibling());
} }
JsonValue operator*() const JsonValue operator*() const
{ {
return JsonValue(json, token); return JsonValue(*this);
} }
bool operator !=(const JsonArrayIterator& other)
{
return token != other.token;
}
private:
char* json;
Internal::JsonToken token;
}; };
} }
} }

View File

@ -9,7 +9,6 @@
#include "JsonValue.h" #include "JsonValue.h"
using namespace ArduinoJson::Parser; using namespace ArduinoJson::Parser;
using namespace ArduinoJson::Internal;
DEPRECATED JsonArray JsonObject::getArray(const char* key) DEPRECATED JsonArray JsonObject::getArray(const char* key)
{ {
@ -22,17 +21,17 @@ DEPRECATED JsonArray JsonObject::getArray(const char* key)
JsonValue JsonObject::getValue(const char* desiredKey) JsonValue JsonObject::getValue(const char* desiredKey)
{ {
// sanity check // sanity check
if (desiredKey == 0 || !token.isObject()) if (desiredKey == 0 || !isObject())
return JsonValue::null(); return JsonValue::null();
// skip first token, it's the whole object // skip first token, it's the whole object
JsonToken runningToken = token.firstChild(); JsonToken runningToken = firstChild();
// scan each keys // scan each keys
for (int i = 0; i < token.size() / 2; i++) for (int i = 0; i < size() / 2; i++)
{ {
// get 'key' token string // get 'key' token string
char* key = runningToken.getText(json); char* key = runningToken.getText();
// move to the 'value' token // move to the 'value' token
runningToken = runningToken.nextSibling(); runningToken = runningToken.nextSibling();
@ -41,7 +40,7 @@ JsonValue JsonObject::getValue(const char* desiredKey)
if (strcmp(desiredKey, key) == 0) if (strcmp(desiredKey, key) == 0)
{ {
// return the value token that follows the key token // return the value token that follows the key token
return JsonValue(json, runningToken); return runningToken;
} }
// skip nested tokens // skip nested tokens
@ -49,5 +48,5 @@ JsonValue JsonObject::getValue(const char* desiredKey)
} }
// nothing found, return NULL // nothing found, return NULL
return JsonValue::null(); return null();
} }

View File

@ -14,24 +14,23 @@ namespace ArduinoJson
{ {
class JsonArray; class JsonArray;
class JsonObject class JsonObject : public JsonToken
{ {
public: public:
JsonObject()
JsonObject(char* json, Internal::JsonToken token)
: json(json), token(token)
{ {
} }
JsonObject() JsonObject(JsonToken token)
: token(Internal::JsonToken::null()) : JsonToken(token)
{ {
} }
bool success() bool success()
{ {
return token.isObject(); return isObject();
} }
JsonValue operator[](const char* key) JsonValue operator[](const char* key)
@ -46,12 +45,12 @@ namespace ArduinoJson
JsonObjectIterator begin() JsonObjectIterator begin()
{ {
return JsonObjectIterator(json, token.firstChild()); return firstChild();
} }
JsonObjectIterator end() JsonObjectIterator end()
{ {
return JsonObjectIterator(json, token.nextSibling()); return nextSibling();
} }
DEPRECATED JsonArray getArray(const char* key); DEPRECATED JsonArray getArray(const char* key);
@ -83,14 +82,11 @@ namespace ArduinoJson
static JsonObject null() static JsonObject null()
{ {
return JsonObject(); return JsonObject(JsonToken::null());
} }
private: private:
char* json;
Internal::JsonToken token;
JsonValue getValue(const char* key); JsonValue getValue(const char* key);
}; };

View File

@ -13,35 +13,24 @@ namespace ArduinoJson
{ {
namespace Parser namespace Parser
{ {
class JsonObjectIterator class JsonObjectIterator : public JsonToken
{ {
public: public:
JsonObjectIterator(char* json, Internal::JsonToken token) JsonObjectIterator(JsonToken token)
: json(json), token(token) : JsonToken(token)
{ {
} }
void operator++() void operator++()
{ {
token = token.nextSibling().nextSibling(); *this = JsonObjectIterator(nextSibling().nextSibling());
} }
JsonPair operator*() const JsonPair operator*() const
{ {
return JsonPair(json, token); return JsonPair(*this);
} }
bool operator !=(const JsonObjectIterator& other)
{
return token != other.token;
}
private:
char* json;
Internal::JsonToken token;
}; };
} }
} }

View File

@ -11,29 +11,24 @@ namespace ArduinoJson
{ {
namespace Parser namespace Parser
{ {
class JsonPair class JsonPair : public JsonToken
{ {
public: public:
JsonPair(JsonToken token)
JsonPair(char* json, Internal::JsonToken token) : JsonToken(token)
: json(json), token(token)
{ {
} }
const char* key() const char* key()
{ {
return token.getText(json); return getText();
} }
JsonValue value() JsonValue value()
{ {
return JsonValue(json, token.nextSibling()); return JsonValue(nextSibling());
} }
private:
char* json;
Internal::JsonToken token;
}; };
} }
} }

View File

@ -7,7 +7,6 @@
#include "JsonToken.h" #include "JsonToken.h"
using namespace ArduinoJson::Parser; using namespace ArduinoJson::Parser;
using namespace ArduinoJson::Internal;
JsonValue JsonParserBase::parse(char* json) JsonValue JsonParserBase::parse(char* json)
{ {
@ -17,5 +16,5 @@ JsonValue JsonParserBase::parse(char* json)
if (JSMN_SUCCESS != jsmn_parse(&parser, json, tokens, maxTokens)) if (JSMN_SUCCESS != jsmn_parse(&parser, json, tokens, maxTokens))
return JsonValue::null(); return JsonValue::null();
return JsonValue(json, JsonToken(tokens)); return JsonToken(json, tokens);
} }

View File

@ -1,7 +1,7 @@
#include "JsonToken.h" #include "JsonToken.h"
using namespace ArduinoJson::Internal; using namespace ArduinoJson::Parser;
JsonToken JsonToken::nextSibling() const JsonToken JsonToken::nextSibling() const
{ {
@ -14,5 +14,5 @@ JsonToken JsonToken::nextSibling() const
t++; t++;
} }
return t; return JsonToken(json, t);
} }

View File

@ -9,29 +9,37 @@
namespace ArduinoJson namespace ArduinoJson
{ {
namespace Internal namespace Parser
{ {
class JsonToken class JsonToken
{ {
public: public:
JsonToken(jsmntok_t* token) JsonToken()
:token(token) : token(0)
{ {
} }
char* getText(char* json) JsonToken(char* json, jsmntok_t* token)
: json(json), token(token)
{
}
char* getText()
{ {
json[token->end] = 0; json[token->end] = 0;
return json + token->start; return json + token->start;
} }
// TODO: should be protected
JsonToken firstChild() const JsonToken firstChild() const
{ {
return token + 1; return JsonToken(json, token + 1);
} }
// TODO: should be protected
JsonToken nextSibling() const; JsonToken nextSibling() const;
bool operator!= (const JsonToken& other) bool operator!= (const JsonToken& other)
@ -39,11 +47,13 @@ namespace ArduinoJson
return token != other.token; return token != other.token;
} }
int size() static JsonToken null()
{ {
return token->size; return JsonToken(0, 0);
} }
protected:
bool isValid() bool isValid()
{ {
return token != 0; return token != 0;
@ -69,12 +79,13 @@ namespace ArduinoJson
return token != 0 && token->type == JSMN_STRING; return token != 0 && token->type == JSMN_STRING;
} }
static JsonToken null() int size()
{ {
return 0; return token->size;
} }
private: private:
char* json;
jsmntok_t* token; jsmntok_t* token;
}; };
} }

View File

@ -9,23 +9,22 @@
#include "JsonValue.h" #include "JsonValue.h"
using namespace ArduinoJson::Parser; using namespace ArduinoJson::Parser;
using namespace ArduinoJson::Internal;
JsonValue JsonValue::operator[](int index) JsonValue JsonValue::operator[](int index)
{ {
return JsonArray(json, token)[index]; return JsonArray(*this)[index];
} }
JsonValue JsonValue::operator[](const char* key) JsonValue JsonValue::operator[](const char* key)
{ {
return JsonObject(json, token)[key]; return JsonObject(*this)[key];
} }
JsonValue::operator bool() JsonValue::operator bool()
{ {
if (!token.isPrimitive()) return 0; if (!isPrimitive()) return 0;
char *text = token.getText(json); char *text = getText();
// "true" // "true"
if (text[0] == 't') return true; if (text[0] == 't') return true;
@ -42,29 +41,25 @@ JsonValue::operator bool()
JsonValue::operator double() JsonValue::operator double()
{ {
return token.isPrimitive() ? strtod(token.getText(json), 0) : 0; return isPrimitive() ? strtod(getText(), 0) : 0;
} }
JsonValue::operator long() JsonValue::operator long()
{ {
return token.isPrimitive() ? strtol(token.getText(json), 0, 0) : 0; return isPrimitive() ? strtol(getText(), 0, 0) : 0;
} }
JsonValue::operator char*() JsonValue::operator char*()
{ {
return token.isString() || token.isPrimitive() ? token.getText(json) : 0; return isString() || isPrimitive() ? getText() : 0;
} }
JsonValue::operator JsonArray() JsonValue::operator JsonArray()
{ {
return token.isArray() return *this;
? JsonArray(json, token)
: JsonArray::null();
} }
JsonValue::operator JsonObject() JsonValue::operator JsonObject()
{ {
return token.isObject() return *this;
? JsonObject(json, token)
: JsonObject::null();
} }

View File

@ -24,19 +24,19 @@ namespace ArduinoJson
class JsonArray; class JsonArray;
class JsonObject; class JsonObject;
class JsonValue class JsonValue : public JsonToken
{ {
public: public:
JsonValue(char* json, Internal::JsonToken token) JsonValue(JsonToken token)
: json(json), token(token) : JsonToken(token)
{ {
} }
bool success() bool success()
{ {
return token.isValid(); return isValid();
} }
operator bool(); operator bool();
@ -47,16 +47,6 @@ namespace ArduinoJson
operator JsonObject(); operator JsonObject();
JsonValue operator[](int index); JsonValue operator[](int index);
JsonValue operator[](const char*key); JsonValue operator[](const char*key);
static JsonValue null()
{
return JsonValue(0, Internal::JsonToken(0));
}
private:
char* json;
Internal::JsonToken token;
}; };
} }
} }