8000 Copy JsonArray and JsonObject, instead of storing pointers (fixes #780) · java64/ArduinoJson@b106b1e · GitHub
[go: up one dir, main page]

Skip to content

Commit b106b1e

Browse files
committed
Copy JsonArray and JsonObject, instead of storing pointers (fixes bblanchon#780)
1 parent 2998a55 commit b106b1e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+955
-962
lines changed

CHANGELOG.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
ArduinoJson: change log
22
=======================
33

4+
HEAD
5+
----
6+
7+
* Copy `JsonArray` and `JsonObject`, instead of storing pointers (issue #780)
8+
49
v6.3.0-beta (2018-08-31)
510
-----------
611

712
* Implemented reference semantics for `JsonVariant`
8-
* Replace `JsonPair`'s `key` and `value` with `key()` and `value()`
13+
* Replaced `JsonPair`'s `key` and `value` with `key()` and `value()`
914
* Fixed `serializeJson(obj[key], dst)` (issue #794)
1015

1116
> ### BREAKING CHANGES

src/ArduinoJson/Data/JsonVariantContent.hpp

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,34 @@
1111

1212
namespace ArduinoJson {
1313
namespace Internals {
14-
// Forward declarations
15-
struct JsonArrayData;
16-
struct JsonObjectData;
14+
struct JsonObjectData {
15+
struct Slot* head;
16+
struct Slot* tail;
17+
};
18+
19+
struct JsonArrayData {
20+
struct Slot* head;
21+
struct Slot* tail;
22+
};
1723

18-
// A union that defines the actual content of a JsonVariant.
24+
struct RawData {
25+
const char* data;
26+
size_t size;
27+
};
28+
29+
// A union that defines the actual content of a JsonVariantData.
1930
// The enum JsonVariantType determines which member is in use.
2031
union JsonVariantContent {
21-
JsonFloat asFloat; // used for double and float
22-
JsonUInt asInteger; // used for bool, char, short, int and longs
23-
JsonArrayData* asArray; // asArray cannot be null
24-
JsonObjectData* asObject; // asObject cannot be null
25-
const char* asString; // asString can be null
32+
JsonFloat asFloat;
33+
JsonUInt asInteger;
34+
JsonArrayData asArray;
35+
JsonObjectData asObject;
36+
const char* asString;
2637
struct {
2738
const char* data;
2839
size_t size;
2940
} asRaw;
3041
};
42+
3143
} // namespace Internals
3244
} // namespace ArduinoJson

src/ArduinoJson/Data/JsonVariantData.hpp

Lines changed: 45 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ struct JsonVariantData {
1616
JsonVariantType type;
1717
JsonVariantContent content;
1818

19+
JsonVariantData() {
20+
type = JSON_NULL;
21+
}
22+
1923
void setBoolean(bool value) {
2024
type = JSON_BOOLEAN;
2125
content.asInteger = static_cast<JsonUInt>(value);
@@ -43,13 +47,24 @@ struct JsonVariantData {
4347
content.asInteger = value;
4448
}
4549

46-
void setString(const char *value) {
47-
type = JSON_STRING;
50+
void setOwnedString(const char *value) {
51+
type = JSON_OWNED_STRING;
52+
content.asString = value;
53+
}
54+
55+
void setLinkedString(const char *value) {
56+
type = JSON_LINKED_STRING;
4857
content.asString = value;
4958
}
5059

51-
void setRaw(const char *data, size_t size) {
52-
type = JSON_RAW;
60+
void setOwnedRaw(const char *data, size_t size) {
61+
type = JSON_OWNED_RAW;
62+
content.asRaw.data = data;
63+
content.asRaw.size = size;
64+
}
65+
66+
void setLinkedRaw(const char *data, size_t size) {
67+
type = JSON_LINKED_RAW;
5368
content.asRaw.data = data;
5469
content.asRaw.size = size;
5570
}
@@ -58,66 +73,70 @@ struct JsonVariantData {
5873
type = JSON_NULL;
5974
}
6075

61-
void setArray(JsonArrayData &array) {
76+
JsonArrayData *toArray() {
6277
type = JSON_ARRAY;
63-
content.asArray = &array;
78+
content.asArray.head = 0;
79+
content.asArray.tail = 0;
80+
return &content.asArray;
6481
}
6582

66-
void setObject(JsonObjectData &object) {
83+
JsonObjectData *toObject() {
6784
type = JSON_OBJECT;
68-
content.asObject = &object;
85+
content.asObject.head = 0;
86+
content.asObject.t F987 ail = 0;
87+
return &content.asObject;
6988
}
7089

71-
JsonArrayData *asArray() const {
72-
return type == JSON_ARRAY ? content.asArray : 0;
90+
JsonArrayData *asArray() {
91+
return type == JSON_ARRAY ? &content.asArray : 0;
7392
}
7493

75-
JsonObjectData *asObject() const {
76-
return type == JSON_OBJECT ? content.asObject : 0;
94+
JsonObjectData *asObject() {
95+
return type == JSON_OBJECT ? &content.asObject : 0;
7796
}
7897

7998
template <typename T>
8099
T asInteger() const {
81100
switch (type) {
82-
case JSON_NULL:
83-
case JSON_RAW:
84-
return 0;
85101
case JSON_POSITIVE_INTEGER:
86102
case JSON_BOOLEAN:
87103
return T(content.asInteger);
88104
case JSON_NEGATIVE_INTEGER:
89105
return T(~content.asInteger + 1);
90-
case JSON_STRING:
106+
case JSON_LINKED_STRING:
107+
case JSON_OWNED_STRING:
91108
return parseInteger<T>(content.asString);
92-
default:
109+
case JSON_FLOAT:
93110
return T(content.asFloat);
111+
default:
112+
return 0;
94113
}
95114
}
96115

97116
template <typename T>
98117
T asFloat() const {
99118
switch (type) {
100-
case JSON_NULL:
101-
case JSON_RAW:
102-
return 0;
103119
case JSON_POSITIVE_INTEGER:
104120
case JSON_BOOLEAN:
105121
return static_cast<T>(content.asInteger);
106122
case JSON_NEGATIVE_INTEGER:
107123
return -static_cast<T>(content.asInteger);
108-
case JSON_STRING:
124+
case JSON_LINKED_STRING:
125+
case JSON_OWNED_STRING:
109126
return parseFloat<T>(content.asString);
110-
default:
127+
case JSON_FLOAT:
111128
return static_cast<T>(content.asFloat);
129+
default:
130+
return 0;
112131
}
113132
}
114133

115134
const char *asString() const {
116-
return type == JSON_STRING ? content.asString : NULL;
135+
return isString() ? content.asString : NULL;
117136
}
118137

119138
bool isArray() const {
120-
return type == Internals::JSON_ARRAY;
139+
return type == JSON_ARRAY;
121140
}
122141

123142
bool isBoolean() const {
@@ -138,43 +157,11 @@ struct JsonVariantData {
138157
}
139158

140159
bool isObject() const {
141-
return type == Internals::JSON_OBJECT;
160+
return type == JSON_OBJECT;
142161
}
143162

144163
bool isString() const {
145-
return type == Internals::JSON_STRING;
146-
}
147-
148-
template <typename Visitor>
149-
void visit(Visitor &visitor) const {
150-
switch (type) {
151-
case JSON_FLOAT:
152-
return visitor.acceptFloat(content.asFloat);
153-
154-
case JSON_ARRAY:
155-
return visitor.acceptArray(*content.asArray);
156-
157-
case JSON_OBJECT:
158-
return visitor.acceptObject(*content.asObject);
159-
160-
case JSON_STRING:
161-
return visitor.acceptString(content.asString);
162-
163-
case JSON_RAW:
164-
return visitor.acceptRawJson(content.asRaw.data, content.asRaw.size);
165-
166-
case JSON_NEGATIVE_INTEGER:
167-
return visitor.acceptNegativeInteger(content.asInteger);
168-
169-
case JSON_POSITIVE_INTEGER:
170-
return visitor.acceptPositiveInteger(content.asInteger);
171-
172-
case JSON_BOOLEAN:
173-
return visitor.acceptBoolean(content.asInteger != 0);
174-
175-
default:
176-
return visitor.acceptNull();
177-
}
164+
return type == JSON_LINKED_STRING || type == JSON_OWNED_STRING;
178165
}
179166
};
180167
} // namespace Internals
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// ArduinoJson - arduinojson.org
2+
// Copyright Benoit Blanchon 2014-2018
3+
// MIT License
4+
5+
#pragma once
6+
7+
namespace ArduinoJson {
8+
class JsonArray;
9+
class JsonObject;
10+
class JsonVariant;
11+
12+
namespace Internals {
13+
14+
// A metafunction that returns the type of the value returned by
15+
// JsonVariant::to<T>()
16+
template <typename T>
17+
struct JsonVariantTo {};
18+
19+
template <>
20+
struct JsonVariantTo<JsonArray> {
21+
typedef JsonArray type;
22+
};
23+
template <>
24+
struct JsonVariantTo<JsonObject> {
25+
typedef JsonObject type;
26+
};
27+
template <>
28+
struct JsonVariantTo<JsonVariant> {
29+
typedef JsonVariant type;
30+
};
31+
32+
} // namespace Internals
33+
} // namespace ArduinoJson

src/ArduinoJson/Data/JsonVariantType.hpp

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,17 @@ namespace Internals {
1111
// Enumerated type to know the current type of a JsonVariant.
1212
// The value determines which member of JsonVariantContent is used.
1313
enum JsonVariantType {
14-
JSON_NULL, // JsonVariant has not been initialized
15-
JSON_RAW, // JsonVariant contains a raw string that should not be escaped
16-
JSON_STRING, // JsonVariant stores a const char*
17-
JSON_BOOLEAN, // JsonVariant stores a bool
18-
JSON_POSITIVE_INTEGER, // JsonVariant stores an JsonUInt
19-
JSON_NEGATIVE_INTEGER, // JsonVariant stores an JsonUInt that must be negated
20-
JSON_ARRAY, // JsonVariant stores a pointer to a JsonArrayData
21-
JSON_OBJECT, // JsonVariant stores a pointer to a JsonObjectData
22-
JSON_FLOAT // JsonVariant stores a JsonFloat
14+
JSON_NULL,
15+
JSON_LINKED_RAW,
16+
JSON_OWNED_RAW,
17+
JSON_LINKED_STRING,
18+
JSON_OWNED_STRING,
19+
JSON_BOOLEAN,
20+
JSON_POSITIVE_INTEGER,
21+
JSON_NEGATIVE_INTEGER,
22+
JSON_ARRAY,
23+
JSON_OBJECT,
24+
JSON_FLOAT
2325
};
2426
} // namespace Internals
2527
} // namespace ArduinoJson

src/ArduinoJson/Data/List.hpp

Lines changed: 0 additions & 83 deletions
This file was deleted.

0 commit comments

Comments
 (0)
0