Skip to content

Commit

Permalink
Implemented array copy
Browse files Browse the repository at this point in the history
  • Loading branch information
bblanchon committed Jul 16, 2017
1 parent 5bc17b2 commit ae2a966
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 8 deletions.
4 changes: 4 additions & 0 deletions src/ArduinoJson/Data/List.hpp
Expand Up @@ -90,6 +90,10 @@ class List {
protected:
JsonBuffer *_buffer;

void clear() {
_firstNode = NULL;
}

private:
node_type *_firstNode;
};
Expand Down
2 changes: 2 additions & 0 deletions src/ArduinoJson/DynamicJsonArray.hpp
Expand Up @@ -18,6 +18,8 @@ class DynamicJsonArray : public JsonArray {
public:
DynamicJsonArray() : JsonArray(&_buffer) {}

using JsonArray::operator=;

Internals::DynamicJsonBuffer& buffer() {
return _buffer;
}
Expand Down
9 changes: 9 additions & 0 deletions src/ArduinoJson/JsonArray.hpp
Expand Up @@ -44,6 +44,15 @@ class JsonArray : public Internals::JsonPrintable<JsonArray>,
explicit JsonArray(Internals::JsonBuffer *buffer) throw()
: Internals::List<JsonVariant>(buffer) {}

JsonArray &operator=(const JsonArray &other) {
clear();
for (JsonArray::const_iterator it = other.begin(); it != other.end();
++it) {
add(*it);
}
return *this;
}

// Gets the value at the specified index
const JsonArraySubscript operator[](size_t index) const;

Expand Down
6 changes: 2 additions & 4 deletions src/ArduinoJson/JsonVariantImpl.hpp
Expand Up @@ -26,9 +26,7 @@ inline JsonVariant &JsonVariant::operator=(const JsonArray &array) {
_content.asArray = new (_buffer) JsonArray(_buffer);
if (!_content.asArray) goto fail;

for (JsonArray::const_iterator it = array.begin(); it != array.end(); ++it) {
_content.asArray->add(*it);
}
_content.asArray->operator=(array);

_type = Internals::JSON_ARRAY;
return *this;
Expand Down Expand Up @@ -59,7 +57,7 @@ inline JsonVariant &JsonVariant::operator=(const JsonObject &object) {

template <typename T>
inline JsonVariant &JsonVariant::operator=(const JsonVariantBase<T> &variant) {
return operator=(variant.as<JsonVariant>());
return operator=(variant.template as<JsonVariant>());
}

inline JsonVariant &JsonVariant::operator=(const JsonVariant &variant) {
Expand Down
25 changes: 21 additions & 4 deletions test/JsonArray/basics.cpp
Expand Up @@ -11,21 +11,38 @@
TEST_CASE("JsonArray basics") {
DynamicJsonArray array;

SECTION("SuccessIsTrue") {
SECTION("success() returns true") {
REQUIRE(array.success());
}

SECTION("InitialSizeIsZero") {
SECTION("size() starts at zero") {
REQUIRE(0U == array.size());
}

SECTION("CreateNestedArray") {
SECTION("createNestedArray()") {
JsonArray& arr = array.createNestedArray();
REQUIRE(&arr == &array[0].as<JsonArray&>());
}

SECTION("CreateNestedObject") {
SECTION("createNestedObject()") {
JsonObject& obj = array.createNestedObject();
REQUIRE(&obj == &array[0].as<JsonObject&>());
}

SECTION("operator=(const JsonArray&)") {
array.add(666);

{
StaticJsonArray<JSON_ARRAY_SIZE(2)+JSON_OBJECT_SIZE(1)> prototype;
prototype.add(42);
prototype.createNestedObject()["hello"] = "world";

array = prototype;
}

CHECK(array.size() == 2);
REQUIRE(array[0] == 42);
REQUIRE(array[1].is<JsonObject>());
REQUIRE(array[1]["hello"] == std::string("world"));
}
}

0 comments on commit ae2a966

Please sign in to comment.