Skip to content

Commit 5abf512

Browse files
committed
Reduce number of overloads of deserializeJson() and deserializeMsgPack() (#1820)
1 parent 0dd4a68 commit 5abf512

File tree

7 files changed

+109
-291
lines changed

7 files changed

+109
-291
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// ArduinoJson - https://arduinojson.org
2+
// Copyright © 2014-2022, Benoit BLANCHON
3+
// MIT License
4+
5+
#pragma once
6+
7+
#include <ArduinoJson/Deserialization/Filter.hpp>
8+
#include <ArduinoJson/Deserialization/NestingLimit.hpp>
9+
10+
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
11+
12+
template <typename TFilter>
13+
struct DeserializationOptions {
14+
TFilter filter;
15+
DeserializationOption::NestingLimit nestingLimit;
16+
};
17+
18+
template <typename TFilter>
19+
inline DeserializationOptions<TFilter> makeDeserializationOptions(
20+
TFilter filter, DeserializationOption::NestingLimit nestingLimit = {}) {
21+
return {filter, nestingLimit};
22+
}
23+
24+
template <typename TFilter>
25+
inline DeserializationOptions<TFilter> makeDeserializationOptions(
26+
DeserializationOption::NestingLimit nestingLimit, TFilter filter) {
27+
return {filter, nestingLimit};
28+
}
29+
30+
inline DeserializationOptions<AllowAllFilter> makeDeserializationOptions(
31+
DeserializationOption::NestingLimit nestingLimit = {}) {
32+
return {{}, nestingLimit};
33+
}
34+
35+
ARDUINOJSON_END_PRIVATE_NAMESPACE

src/ArduinoJson/Deserialization/Reader.hpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#pragma once
66

77
#include <ArduinoJson/Namespace.hpp>
8+
#include <ArduinoJson/Polyfills/utility.hpp>
89

910
#include <stdlib.h> // for size_t
1011

@@ -55,3 +56,18 @@ ARDUINOJSON_END_PRIVATE_NAMESPACE
5556
#if ARDUINOJSON_ENABLE_STD_STREAM
5657
# include <ArduinoJson/Deserialization/Readers/StdStreamReader.hpp>
5758
#endif
59+
60+
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
61+
62+
template <typename TInput>
63+
Reader<typename remove_reference<TInput>::type> makeReader(TInput&& input) {
64+
return Reader<typename remove_reference<TInput>::type>{
65+
detail::forward<TInput>(input)};
66+
}
67+
68+
template <typename TChar>
69+
BoundedReader<TChar*> makeReader(TChar* input, size_t inputSize) {
70+
return BoundedReader<TChar*>{input, inputSize};
71+
}
72+
73+
ARDUINOJSON_END_PRIVATE_NAMESPACE

src/ArduinoJson/Deserialization/deserialize.hpp

Lines changed: 21 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
#pragma once
66

77
#include <ArduinoJson/Deserialization/DeserializationError.hpp>
8-
#include <ArduinoJson/Deserialization/Filter.hpp>
9-
#include <ArduinoJson/Deserialization/NestingLimit.hpp>
8+
#include <ArduinoJson/Deserialization/DeserializationOptions.hpp>
109
#include <ArduinoJson/Deserialization/Reader.hpp>
10+
#include <ArduinoJson/Polyfills/utility.hpp>
1111
#include <ArduinoJson/StringStorage/StringStorage.hpp>
1212

1313
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
@@ -21,57 +21,33 @@ TDeserializer<TReader, TWriter> makeDeserializer(MemoryPool* pool,
2121
return TDeserializer<TReader, TWriter>(pool, reader, writer);
2222
}
2323

24-
// deserialize(JsonDocument&, const std::string&, NestingLimit, Filter);
25-
// deserialize(JsonDocument&, const String&, NestingLimit, Filter);
26-
// deserialize(JsonDocument&, char*, NestingLimit, Filter);
27-
// deserialize(JsonDocument&, const char*, NestingLimit, Filter);
28-
// deserialize(JsonDocument&, const __FlashStringHelper*, NestingLimit, Filter);
29-
template <template <typename, typename> class TDeserializer, typename TString,
30-
typename TFilter>
31-
typename detail::enable_if<!is_array<TString>::value,
32-
DeserializationError>::type
33-
deserialize(JsonDocument& doc, const TString& input,
34-
DeserializationOption::NestingLimit nestingLimit, TFilter filter) {
35-
Reader<TString> reader(input);
36-
VariantData* data = VariantAttorney::getData(doc);
37-
MemoryPool* pool = VariantAttorney::getPool(doc);
24+
template <template <typename, typename> class TDeserializer, typename TStream,
25+
typename... Args>
26+
DeserializationError deserialize(JsonDocument& doc, TStream&& input,
27+
Args... args) {
28+
auto reader = makeReader(detail::forward<TStream>(input));
29+
auto data = VariantAttorney::getData(doc);
30+
auto pool = VariantAttorney::getPool(doc);
31+
auto options = makeDeserializationOptions(args...);
3832
doc.clear();
3933
return makeDeserializer<TDeserializer>(pool, reader,
4034
makeStringStorage(input, pool))
41-
.parse(*data, filter, nestingLimit);
35+
.parse(*data, options.filter, options.nestingLimit);
4236
}
43-
//
44-
// deserialize(JsonDocument&, char*, size_t, NestingLimit, Filter);
45-
// deserialize(JsonDocument&, const char*, size_t, NestingLimit, Filter);
46-
// deserialize(JsonDocument&, const __FlashStringHelper*, size_t, NL, Filter);
37+
4738
template <template <typename, typename> class TDeserializer, typename TChar,
48-
typename TFilter>
49-
DeserializationError deserialize(
50-
JsonDocument& doc, TChar* input, size_t inputSize,
51-
DeserializationOption::NestingLimit nestingLimit, TFilter filter) {
52-
BoundedReader<TChar*> reader(input, inputSize);
53-
VariantData* data = VariantAttorney::getData(doc);
54-
MemoryPool* pool = VariantAttorney::getPool(doc);
55-
doc.clear();
56-
return makeDeserializer<TDeserializer>(pool, reader,
57-
makeStringStorage(input, pool))
58-
.parse(*data, filter, nestingLimit);
59-
}
60-
//
61-
// deserialize(JsonDocument&, std::istream&, NestingLimit, Filter);
62-
// deserialize(JsonDocument&, Stream&, NestingLimit, Filter);
63-
template <template <typename, typename> class TDeserializer, typename TStream,
64-
typename TFilter>
65-
DeserializationError deserialize(
66-
JsonDocument& doc, TStream& input,
67-
DeserializationOption::NestingLimit nestingLimit, TFilter filter) {
68-
Reader<TStream> reader(input);
69-
VariantData* data = VariantAttorney::getData(doc);
70-
MemoryPool* pool = VariantAttorney::getPool(doc);
39+
typename Size, typename... Args,
40+
typename = typename enable_if<is_integral<Size>::value>::type>
41+
DeserializationError deserialize(JsonDocument& doc, TChar* input,
42+
Size inputSize, Args... args) {
43+
auto reader = makeReader(input, size_t(inputSize));
44+
auto data = VariantAttorney::getData(doc);
45+
auto pool = VariantAttorney::getPool(doc);
46+
auto options = makeDeserializationOptions(args...);
7147
doc.clear();
7248
return makeDeserializer<TDeserializer>(pool, reader,
7349
makeStringStorage(input, pool))
74-
.parse(*data, filter, nestingLimit);
50+
.parse(*data, options.filter, options.nestingLimit);
7551
}
7652

7753
ARDUINOJSON_END_PRIVATE_NAMESPACE

src/ArduinoJson/Json/JsonDeserializer.hpp

Lines changed: 9 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <ArduinoJson/Numbers/parseNumber.hpp>
1414
#include <ArduinoJson/Polyfills/assert.hpp>
1515
#include <ArduinoJson/Polyfills/type_traits.hpp>
16+
#include <ArduinoJson/Polyfills/utility.hpp>
1617
#include <ArduinoJson/Variant/VariantData.hpp>
1718

1819
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
@@ -671,137 +672,22 @@ ARDUINOJSON_END_PRIVATE_NAMESPACE
671672

672673
ARDUINOJSON_BEGIN_PUBLIC_NAMESPACE
673674

674-
// Parses a JSON input and puts the result in a JsonDocument.
675-
// https://arduinojson.org/v6/api/json/deserializejson/
676-
template <typename TString>
677-
DeserializationError deserializeJson(
678-
JsonDocument& doc, const TString& input,
679-
DeserializationOption::NestingLimit nestingLimit = {}) {
680-
using namespace detail;
681-
return deserialize<JsonDeserializer>(doc, input, nestingLimit,
682-
AllowAllFilter());
683-
}
684-
685-
// Parses a JSON input, filters, and puts the result in a JsonDocument.
686-
// https://arduinojson.org/v6/api/json/deserializejson/
687-
template <typename TString>
688-
DeserializationError deserializeJson(
689-
JsonDocument& doc, const TString& input,
690-
DeserializationOption::Filter filter,
691-
DeserializationOption::NestingLimit nestingLimit = {}) {
692-
using namespace detail;
693-
return deserialize<JsonDeserializer>(doc, input, nestingLimit, filter);
694-
}
695-
696-
// Parses a JSON input, filters, and puts the result in a JsonDocument.
697-
// https://arduinojson.org/v6/api/json/deserializejson/
698-
template <typename TString>
699-
DeserializationError deserializeJson(
700-
JsonDocument& doc, const TString& input,
701-
DeserializationOption::NestingLimit nestingLimit,
702-
DeserializationOption::Filter filter) {
703-
using namespace detail;
704-
return deserialize<JsonDeserializer>(doc, input, nestingLimit, filter);
705-
}
706-
707-
// Parses a JSON input and puts the result in a JsonDocument.
708-
// https://arduinojson.org/v6/api/json/deserializejson/
709-
template <typename TStream>
710-
DeserializationError deserializeJson(
711-
JsonDocument& doc, TStream& input,
712-
DeserializationOption::NestingLimit nestingLimit = {}) {
713-
using namespace detail;
714-
return deserialize<JsonDeserializer>(doc, input, nestingLimit,
715-
AllowAllFilter());
716-
}
717-
718-
// Parses a JSON input, filters, and puts the result in a JsonDocument.
719-
// https://arduinojson.org/v6/api/json/deserializejson/
720-
template <typename TStream>
721-
DeserializationError deserializeJson(
722-
JsonDocument& doc, TStream& input, DeserializationOption::Filter filter,
723-
DeserializationOption::NestingLimit nestingLimit = {}) {
724-
using namespace detail;
725-
return deserialize<JsonDeserializer>(doc, input, nestingLimit, filter);
726-
}
727-
728-
// Parses a JSON input, filters, and puts the result in a JsonDocument.
729-
// https://arduinojson.org/v6/api/json/deserializejson/
730-
template <typename TStream>
731-
DeserializationError deserializeJson(
732-
JsonDocument& doc, TStream& input,
733-
DeserializationOption::NestingLimit nestingLimit,
734-
DeserializationOption::Filter filter) {
735-
using namespace detail;
736-
return deserialize<JsonDeserializer>(doc, input, nestingLimit, filter);
737-
}
738-
739-
// Parses a JSON input and puts the result in a JsonDocument.
740-
// https://arduinojson.org/v6/api/json/deserializejson/
741-
template <typename TChar>
742-
DeserializationError deserializeJson(
743-
JsonDocument& doc, TChar* input,
744-
DeserializationOption::NestingLimit nestingLimit = {}) {
745-
using namespace detail;
746-
return deserialize<JsonDeserializer>(doc, input, nestingLimit,
747-
AllowAllFilter());
748-
}
749-
750-
// Parses a JSON input, filters, and puts the result in a JsonDocument.
751-
// https://arduinojson.org/v6/api/json/deserializejson/
752-
template <typename TChar>
753-
DeserializationError deserializeJson(
754-
JsonDocument& doc, TChar* input, DeserializationOption::Filter filter,
755-
DeserializationOption::NestingLimit nestingLimit = {}) {
756-
using namespace detail;
757-
return deserialize<JsonDeserializer>(doc, input, nestingLimit, filter);
758-
}
759-
760-
// Parses a JSON input, filters, and puts the result in a JsonDocument.
761-
// https://arduinojson.org/v6/api/json/deserializejson/
762-
template <typename TChar>
763-
DeserializationError deserializeJson(
764-
JsonDocument& doc, TChar* input,
765-
DeserializationOption::NestingLimit nestingLimit,
766-
DeserializationOption::Filter filter) {
767-
using namespace detail;
768-
return deserialize<JsonDeserializer>(doc, input, nestingLimit, filter);
769-
}
770-
771-
// Parses a JSON input and puts the result in a JsonDocument.
772-
// https://arduinojson.org/v6/api/json/deserializejson/
773-
template <typename TChar>
774-
DeserializationError deserializeJson(
775-
JsonDocument& doc, TChar* input, size_t inputSize,
776-
DeserializationOption::NestingLimit nestingLimit = {}) {
777-
using namespace detail;
778-
return deserialize<JsonDeserializer>(doc, input, inputSize, nestingLimit,
779-
AllowAllFilter());
780-
}
781-
782675
// Parses a JSON input, filters, and puts the result in a JsonDocument.
783676
// https://arduinojson.org/v6/api/json/deserializejson/
784-
template <typename TChar>
785-
DeserializationError deserializeJson(
786-
JsonDocument& doc, TChar* input, size_t inputSize,
787-
DeserializationOption::Filter filter,
788-
DeserializationOption::NestingLimit nestingLimit =
789-
DeserializationOption::NestingLimit()) {
677+
template <typename... Args>
678+
DeserializationError deserializeJson(JsonDocument& doc, Args&&... args) {
790679
using namespace detail;
791-
return deserialize<JsonDeserializer>(doc, input, inputSize, nestingLimit,
792-
filter);
680+
return deserialize<JsonDeserializer>(doc, detail::forward<Args>(args)...);
793681
}
794682

795683
// Parses a JSON input, filters, and puts the result in a JsonDocument.
796684
// https://arduinojson.org/v6/api/json/deserializejson/
797-
template <typename TChar>
798-
DeserializationError deserializeJson(
799-
JsonDocument& doc, TChar* input, size_t inputSize,
800-
DeserializationOption::NestingLimit nestingLimit,
801-
DeserializationOption::Filter filter) {
685+
template <typename TChar, typename... Args>
686+
DeserializationError deserializeJson(JsonDocument& doc, TChar* input,
687+
Args&&... args) {
802688
using namespace detail;
803-
return deserialize<JsonDeserializer>(doc, input, inputSize, nestingLimit,
804-
filter);
689+
return deserialize<JsonDeserializer>(doc, input,
690+
detail::forward<Args>(args)...);
805691
}
806692

807693
ARDUINOJSON_END_PUBLIC_NAMESPACE

0 commit comments

Comments
 (0)