8000 Added Visitable to reduce the number of definitions of operator<< · java64/ArduinoJson@02d809f · GitHub
[go: up one dir, main page]

Skip to content

Commit 02d809f

Browse files
committed
Added Visitable to reduce the number of definitions of operator<<
1 parent b0560cb commit 02d809f

File tree

13 files changed

+117
-101
lines changed

13 files changed

+117
-101
lines changed

src/ArduinoJson/Json/JsonSerializer.hpp

Lines changed: 5 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66

77
#include "../Serialization/measure.hpp"
88
#include "../Serialization/serialize.hpp"
9-
#include "./JsonWriter.hpp"
9+
#include "../Visitable.hpp"
10+
#include "JsonWriter.hpp"
1011

1112
namespace ARDUINOJSON_NAMESPACE {
1213

@@ -103,32 +104,9 @@ size_t measureJson(const TSource &source) {
103104
}
104105

105106
#if ARDUINOJSON_ENABLE_STD_STREAM
106-
inline std::ostream &operator<<(std::ostream &os, const JsonArray &source) {
107-
serializeJson(source, os);
108-
return os;
109-
}
110-
inline std::ostream &operator<<(std::ostream &os, const JsonObject &source) {
111-
serializeJson(source, os);
112-
return os;
113-
}
114-
inline std::ostream &operator<<(std::ostream &os, const JsonVariant &source) {
115-
serializeJson(source, os);
116-
return os;
117-
}
118-
inline std::ostream &operator<<(std::ostream &os, JsonVariantConst source) {
119-
os << serializeJson(source, os);
120-
return os;
121-
}
122-
123-
inline std::ostream &operator<<(std::ostream &os,
124-
const JsonArraySubscript &source) {
125-
serializeJson(source, os);
126-
return os;
127-
}
128-
129-
template <typename TKey>
130-
inline std::ostream &operator<<(std::ostream &os,
131-
const JsonObjectSubscript<TKey> &source) {
107+
template <typename T>
108+
inline typename enable_if<IsVisitable<T>::value, std::ostream &>::type
109+
operator<<(std::ostream &os, const T &source) {
132110
serializeJson(source, os);
133111
return os;
134112
}

src/ArduinoJson/JsonArray.hpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,22 @@ class JsonArrayProxy {
3838
TData* _data;
3939
};
4040

41-
class JsonArrayConst : public JsonArrayProxy<const JsonArrayData> {
41+
class JsonArrayConst : public JsonArrayProxy<const JsonArrayData>,
42+
public Visitable {
4243
friend class JsonArray;
4344
typedef JsonArrayProxy<const JsonArrayData> proxy_type;
4445

4546
public:
4647
typedef JsonArrayConstIterator iterator;
4748

49+
template <typename Visitor>
50+
FORCE_INLINE void accept(Visitor& visitor) const {
51+
if (_data)
52+
visitor.visitArray(*this);
53+
else
54+
visitor.visitNull();
55+
}
56+
4857
FORCE_INLINE iterator begin() const {
4958
if (!_data) return iterator();
5059
return iterator(_data->head);
@@ -62,7 +71,7 @@ class JsonArrayConst : public JsonArrayProxy<const JsonArrayData> {
6271
}
6372
};
6473

65-
class JsonArray : public JsonArrayProxy<JsonArrayData> {
74+
class JsonArray : public JsonArrayProxy<JsonArrayData>, public Visitable {
6675
typedef JsonArrayProxy<JsonArrayData> proxy_type;
6776

6877
public:
@@ -224,10 +233,7 @@ class JsonArray : public JsonArrayProxy<JsonArrayData> {
224233

225234
template <typename Visitor>
226235
FORCE_INLINE void accept(Visitor& visitor) const {
227-
if (_data)
228-
visitor.visitArray(*this);
229-
else
230-
visitor.visitNull();
236+
JsonArrayConst(_data).accept(visitor);
231237
}
232238

233239
private:

src/ArduinoJson/JsonArraySubscript.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
#endif
1414

1515
namespace ARDUINOJSON_NAMESPACE {
16-
class JsonArraySubscript : public JsonVariantBase<JsonArraySubscript> {
16+
class JsonArraySubscript : public JsonVariantBase<JsonArraySubscript>,
17+
public Visitable {
1718
public:
1819
FORCE_INLINE JsonArraySubscript(JsonArray array, size_t index)
1920
: _array(array), _index(index) {}

src/ArduinoJson/JsonDocument.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
namespace ARDUINOJSON_NAMESPACE {
1313

1414
template <typename TMemoryPool>
15-
class JsonDocument {
15+
class JsonDocument : public Visitable {
1616
public:
1717
uint8_t nestingLimit;
1818

src/ArduinoJson/JsonObject.hpp

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ class JsonObjectProxy {
3333
return objectContainsKey(_data, makeString(key));
3434
}
3535

36+
FORCE_INLINE bool isNull() const {
37+
return _data == 0;
38+
}
39+
3640
FORCE_INLINE size_t size() const {
3741
return objectSize(_data);
3842
}
@@ -42,7 +46,8 @@ class JsonObjectProxy {
4246
TData* _data;
4347
};
4448

45-
class JsonObjectConst : public JsonObjectProxy<const JsonObjectData> {
49+
class JsonObjectConst : public JsonObjectProxy<const JsonObjectData>,
50+
public Visitable {
4651
friend class JsonObject;
4752
typedef JsonObjectProxy<const JsonObjectData> proxy_type;
4853

@@ -52,6 +57,14 @@ class JsonObjectConst : public JsonObjectProxy<const JsonObjectData> {
5257
JsonObjectConst() : proxy_type(0) {}
5358
JsonObjectConst(const JsonObjectData* data) : proxy_type(data) {}
5459

60+
template <typename Visitor>
61+
FORCE_INLINE void accept(Visitor& visitor) const {
62+
if (_data)
63+
visitor.visitObject(*this);
64+
else
65+
visitor.visitNull();
66+
}
67+
5568
FORCE_INLINE iterator begin() const {
5669
if (!_data) return iterator();
5770
return iterator(_data->head);
@@ -110,7 +123,7 @@ class JsonObjectConst : public JsonObjectProxy<const JsonObjectData> {
110123
}
111124
};
112125

113-
class JsonObject : public JsonObjectProxy<JsonObjectData> {
126+
class JsonObject : public JsonObjectProxy<JsonObjectData>, public Visitable {
114127
typedef JsonObjectProxy<JsonObjectData> proxy_type;
115128

116129
public:
@@ -304,16 +317,9 @@ class JsonObject : public JsonObjectProxy<JsonObjectData> {
304317
return set_impl(key);
305318
}
306319

307-
FORCE_INLINE bool isNull() const {
308-
return _data == 0;
309-
}
310-
311320
template <typename Visitor>
312321
FORCE_INLINE void accept(Visitor& visitor) const {
313-
if (_data)
314-
visitor.visitObject(JsonObjectConst(_data));
315-
else
316-
visitor.visitNull();
322+
JsonObjectConst(_data).accept(visitor);
317323
}
318324

319325
private:

src/ArduinoJson/JsonObjectSubscript.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ namespace ARDUINOJSON_NAMESPACE {
1717

1818
template <typename TStringRef>
1919
class JsonObjectSubscript
20-
: public JsonVariantBase<JsonObjectSubscript<TStringRef> > {
20+
: public JsonVariantBase<JsonObjectSubscript<TStringRef> >,
21+
public Visitable {
2122
typedef JsonObjectSubscript<TStringRef> this_type;
2223

2324
public:

src/ArduinoJson/JsonVariant.hpp

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "Numbers/parseFloat.hpp"
1717
#include "Numbers/parseInteger.hpp"
1818
#include "Polyfills/type_traits.hpp"
19+
#include "Visitable.hpp"
1920

2021
namespace ARDUINOJSON_NAMESPACE {
2122

@@ -117,7 +118,8 @@ class JsonVariantProxy {
117118
// - a string (const char*)
118119
// - a reference to a JsonArray or JsonObject
119120
class JsonVariant : public JsonVariantProxy<JsonVariantData>,
120-
public JsonVariantBase<JsonVariant> {
121+
public JsonVariantBase<JsonVariant>,
122+
public Visitable {
121123
typedef JsonVariantProxy<JsonVariantData> proxy_type;
122124
friend class JsonVariantConst;
123125

@@ -279,7 +281,8 @@ class JsonVariant : public JsonVariantProxy<JsonVariantData>,
279281
};
280282

281283
class JsonVariantConst : public JsonVariantProxy<const JsonVariantData>,
282-
public JsonVariantBase<JsonVariantConst> {
284+
public JsonVariantBase<JsonVariantConst>,
285+
public Visitable {
283286
typedef JsonVariantProxy<const JsonVariantData> proxy_type;
284287

285288
public:
@@ -318,15 +321,4 @@ class JsonVariantConst : public JsonVariantProxy<const JsonVariantData>,
318321
return JsonVariantConst(objectGet(variantAsObject(_data), makeString(key)));
319322
}
320323
};
321-
322-
class JsonVariantLocal : public JsonVariant {
323-
public:
324-
explicit JsonVariantLocal(MemoryPool *memoryPool)
325-
: JsonVariant(memoryPool, &_localData) {
326-
_localData.type = JSON_NULL;
327-
}
328-
329-
private:
330-
JsonVariantData _localData;
331-
};
332324
} // namespace ARDUINOJSON_NAMESPACE

src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,8 @@ class MsgPackDeserializer {
278278
if (_nestingLimit == 0) return DeserializationError::TooDeep;
279279
--_nestingLimit;
280280
for (; n; --n) {
281-
JsonVariantLocal key(_memoryPool);
281+
JsonVariantData keyData;
282+
JsonVariant key(_memoryPool, &keyData);
282283
DeserializationError err = parse(key);
283284
if (err) return err;
284285
if (!key.is<char *>()) return DeserializationError::NotSupported;

src/ArduinoJson/Polyfills/type_traits/is_base_of.hpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ class is_base_of {
1818
static No &probe(...);
1919

2020
public:
21-
enum {
22-
value = sizeof(probe(reinterpret_cast<TDerived *>(0))) == sizeof(Yes)
23-
};
21+
static const bool value =
22+
sizeof(probe(reinterpret_cast<TDerived *>(0))) == sizeof(Yes);
2423
};
2524
} // namespace ARDUINOJSON_NAMESPACE

src/ArduinoJson/Visitable.hpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// ArduinoJson - arduinojson.org
2+
// Copyright Benoit Blanchon 2014-2018
3+
// MIT License
4+
5+
#pragma once
6+
7+
#include "Polyfills/type_traits.hpp"
8+
9+
namespace ARDUINOJSON_NAMESPACE {
10+
11+
struct Visitable {
12+
// template<Visitor>
13+
// void accept(Visitor&) const;
14+
};
15+
16+
template <typename T>
17+
struct IsVisitable : is_base_of<Visitable, T> {};
18+
} // namespace ARDUINOJSON_NAMESPACE

test/JsonArray/isNull.cpp

Lines changed: 16 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,39 +6,29 @@
66
#include <catch.hpp>
77

88
TEST_CASE("JsonArray::isNull()") {
9-
SECTION("returns true for undefined JsonArray") {
10-
JsonArray array;
11-
REQUIRE(array.isNull() == true);
12-
}
9+
DynamicJsonDocument doc;
1310

14-
SECTION("returns false when allocation succeeds") {
15-
StaticJsonDocument<JSON_ARRAY_SIZE(0)> doc;
16-
JsonArray array = doc.to<JsonArray>();
17-
REQUIRE(array.isNull() == false);
11+
SECTION("returns true") {
12+
JsonArray arr;
13+
REQUIRE(arr.isNull() == true);
1814
}
1915

20-
/* SECTION("returns true when allocation fails") {
21-
StaticJsonDocument<1> doc;
22-
JsonArray array = doc.to<JsonArray>();
23-
REQUIRE(array.isNull() == true);
24-
}*/
16+
SECTION("returns false") {
17+
JsonArray arr = doc.to<JsonArray>();
18+
REQUIRE(arr.isNull() == false);
19+
}
2520
}
2621

2722
TEST_CASE("JsonArrayConst::isNull()") {
28-
SECTION("returns true for undefined JsonArray") {
29-
JsonArrayConst array;
30-
REQUIRE(array.isNull() == true);
31-
}
23+
DynamicJsonDocument doc;
3224

33-
SECTION("returns false when allocation succeeds") {
34-
StaticJsonDocument<JSON_ARRAY_SIZE(0)> doc;
35-
JsonArrayConst array = doc.to<JsonArray>();
36-
REQUIRE(array.isNull() == false);
25+
SECTION("returns true") {
26+
JsonArrayConst arr;
27+
REQUIRE(arr.isNull() == true);
3728
}
3829

39-
/* SECTION("returns true when allocation fails") {
40-
StaticJsonDocument<1> doc;
41-
JsonArray array = doc.to<JsonArray>();
42-
REQUIRE(array.isNull() == true);
43-
}*/
30+
SECTION("returns false") {
31+
JsonArrayConst arr = doc.to<JsonArray>();
32+
REQUIRE(arr.isNull() == false);
33+
}
4434
}

test/JsonObject/isNull.cpp

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,29 @@
66
#include <catch.hpp>
77

88
TEST_CASE("JsonObject::isNull()") {
9-
SECTION("returns true for undefined JsonObject") {
10-
JsonObject array;
11-
REQUIRE(array.isNull() == true);
9+
DynamicJsonDocument doc;
10+
11+
SECTION("returns true") {
12+
JsonObject obj;
13+
REQUIRE(obj.isNull() == true);
14+
}
15+
16+
SECTION("returns false") {
17+
JsonObject obj = doc.to<JsonObject>();
18+
REQUIRE(obj.isNull() == false);
1219
}
20+
}
21+
22+
TEST_CASE("JsonObjectConst::isNull()") {
23+
DynamicJsonDocument doc;
1324

14-
SECTION("returns false when allocation succeeds") {
15-
StaticJsonDocument<JSON_OBJECT_SIZE(0)> doc;
16-
JsonObject array = doc.to<JsonObject>();
17-
REQUIRE(array.isNull() == false);
25+
SECTION("returns true") {
26+
JsonObjectConst obj;
27+
REQUIRE(obj.isNull() == true);
1828
}
1929

20-
/* SECTION("returns true when allocation fails") {
21-
StaticJsonDocument<1> doc;
22-
JsonObject array = doc.to<JsonObject>();
23-
REQUIRE(array.isNull() == true);
24-
}*/
30+
SECTION("returns false") {
31+
JsonObjectConst obj = doc.to<JsonObject>();
32+
REQUIRE(obj.isNull() == false);
33+
}
2534
}

test/Misc/TypeTraits.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,19 @@ TEST_CASE("Polyfills/type_traits") {
5050
CHECK(is_unsigned<float>::value == false);
5151
CHECK(is_unsigned<double>::value == false);
5252
}
53+
54+
SECTION("IsVisitable") {
55+
CHECK(IsVisitable<DeserializationError>::value == false);
56+
CHECK(IsVisitable<JsonPair>::value == false);
57+
CHECK(IsVisitable<JsonVariant>::value == true);
58+
CHECK(IsVisitable<JsonVariantConst>::value == true);
59+
CHECK(IsVisitable<JsonArray>::value == true);
60+
CHECK(IsVisitable<JsonArraySubscript>::value == true);
61+
CHECK(IsVisitable<JsonArrayConst>::value == true);
62+
CHECK(IsVisitable<JsonObject>::value == true);
63+
CHECK(IsVisitable<JsonObjectSubscript<const char*> >::value == true);
64+
CHECK(IsVisitable<JsonObjectConst>::value == true);
65+
CHECK(IsVisitable<DynamicJsonDocument>::value == true);
66+
CHECK(IsVisitable<StaticJsonDocument<10> >::value == true);
67+
}
5368
}

0 commit comments

Comments
 (0)
0