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

View File

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

View File

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

View File

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

View File

@ -13,35 +13,24 @@ namespace ArduinoJson
{
namespace Parser
{
class JsonObjectIterator
class JsonObjectIterator : public JsonToken
{
public:
JsonObjectIterator(char* json, Internal::JsonToken token)
: json(json), token(token)
JsonObjectIterator(JsonToken token)
: JsonToken(token)
{
}
void operator++()
{
token = token.nextSibling().nextSibling();
*this = JsonObjectIterator(nextSibling().nextSibling());
}
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
{
class JsonPair
class JsonPair : public JsonToken
{
public:
JsonPair(char* json, Internal::JsonToken token)
: json(json), token(token)
JsonPair(JsonToken token)
: JsonToken(token)
{
}
const char* key()
{
return token.getText(json);
return getText();
}
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"
using namespace ArduinoJson::Parser;
using namespace ArduinoJson::Internal;
JsonValue JsonParserBase::parse(char* json)
{
@ -17,5 +16,5 @@ JsonValue JsonParserBase::parse(char* json)
if (JSMN_SUCCESS != jsmn_parse(&parser, json, tokens, maxTokens))
return JsonValue::null();
return JsonValue(json, JsonToken(tokens));
return JsonToken(json, tokens);
}

View File

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

View File

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

View File

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

View File

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