forked from bblanchon/ArduinoJson
Reduce number of overloads of deserializeJson()
and deserializeMsgPack()
(#1820)
This commit is contained in:
35
src/ArduinoJson/Deserialization/DeserializationOptions.hpp
Normal file
35
src/ArduinoJson/Deserialization/DeserializationOptions.hpp
Normal file
@ -0,0 +1,35 @@
|
||||
// ArduinoJson - https://arduinojson.org
|
||||
// Copyright © 2014-2022, Benoit BLANCHON
|
||||
// MIT License
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <ArduinoJson/Deserialization/Filter.hpp>
|
||||
#include <ArduinoJson/Deserialization/NestingLimit.hpp>
|
||||
|
||||
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
|
||||
|
||||
template <typename TFilter>
|
||||
struct DeserializationOptions {
|
||||
TFilter filter;
|
||||
DeserializationOption::NestingLimit nestingLimit;
|
||||
};
|
||||
|
||||
template <typename TFilter>
|
||||
inline DeserializationOptions<TFilter> makeDeserializationOptions(
|
||||
TFilter filter, DeserializationOption::NestingLimit nestingLimit = {}) {
|
||||
return {filter, nestingLimit};
|
||||
}
|
||||
|
||||
template <typename TFilter>
|
||||
inline DeserializationOptions<TFilter> makeDeserializationOptions(
|
||||
DeserializationOption::NestingLimit nestingLimit, TFilter filter) {
|
||||
return {filter, nestingLimit};
|
||||
}
|
||||
|
||||
inline DeserializationOptions<AllowAllFilter> makeDeserializationOptions(
|
||||
DeserializationOption::NestingLimit nestingLimit = {}) {
|
||||
return {{}, nestingLimit};
|
||||
}
|
||||
|
||||
ARDUINOJSON_END_PRIVATE_NAMESPACE
|
@ -5,6 +5,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <ArduinoJson/Namespace.hpp>
|
||||
#include <ArduinoJson/Polyfills/utility.hpp>
|
||||
|
||||
#include <stdlib.h> // for size_t
|
||||
|
||||
@ -55,3 +56,18 @@ ARDUINOJSON_END_PRIVATE_NAMESPACE
|
||||
#if ARDUINOJSON_ENABLE_STD_STREAM
|
||||
# include <ArduinoJson/Deserialization/Readers/StdStreamReader.hpp>
|
||||
#endif
|
||||
|
||||
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
|
||||
|
||||
template <typename TInput>
|
||||
Reader<typename remove_reference<TInput>::type> makeReader(TInput&& input) {
|
||||
return Reader<typename remove_reference<TInput>::type>{
|
||||
detail::forward<TInput>(input)};
|
||||
}
|
||||
|
||||
template <typename TChar>
|
||||
BoundedReader<TChar*> makeReader(TChar* input, size_t inputSize) {
|
||||
return BoundedReader<TChar*>{input, inputSize};
|
||||
}
|
||||
|
||||
ARDUINOJSON_END_PRIVATE_NAMESPACE
|
||||
|
@ -5,9 +5,9 @@
|
||||
#pragma once
|
||||
|
||||
#include <ArduinoJson/Deserialization/DeserializationError.hpp>
|
||||
#include <ArduinoJson/Deserialization/Filter.hpp>
|
||||
#include <ArduinoJson/Deserialization/NestingLimit.hpp>
|
||||
#include <ArduinoJson/Deserialization/DeserializationOptions.hpp>
|
||||
#include <ArduinoJson/Deserialization/Reader.hpp>
|
||||
#include <ArduinoJson/Polyfills/utility.hpp>
|
||||
#include <ArduinoJson/StringStorage/StringStorage.hpp>
|
||||
|
||||
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
|
||||
@ -21,57 +21,33 @@ TDeserializer<TReader, TWriter> makeDeserializer(MemoryPool* pool,
|
||||
return TDeserializer<TReader, TWriter>(pool, reader, writer);
|
||||
}
|
||||
|
||||
// deserialize(JsonDocument&, const std::string&, NestingLimit, Filter);
|
||||
// deserialize(JsonDocument&, const String&, NestingLimit, Filter);
|
||||
// deserialize(JsonDocument&, char*, NestingLimit, Filter);
|
||||
// deserialize(JsonDocument&, const char*, NestingLimit, Filter);
|
||||
// deserialize(JsonDocument&, const __FlashStringHelper*, NestingLimit, Filter);
|
||||
template <template <typename, typename> class TDeserializer, typename TString,
|
||||
typename TFilter>
|
||||
typename detail::enable_if<!is_array<TString>::value,
|
||||
DeserializationError>::type
|
||||
deserialize(JsonDocument& doc, const TString& input,
|
||||
DeserializationOption::NestingLimit nestingLimit, TFilter filter) {
|
||||
Reader<TString> reader(input);
|
||||
VariantData* data = VariantAttorney::getData(doc);
|
||||
MemoryPool* pool = VariantAttorney::getPool(doc);
|
||||
doc.clear();
|
||||
return makeDeserializer<TDeserializer>(pool, reader,
|
||||
makeStringStorage(input, pool))
|
||||
.parse(*data, filter, nestingLimit);
|
||||
}
|
||||
//
|
||||
// deserialize(JsonDocument&, char*, size_t, NestingLimit, Filter);
|
||||
// deserialize(JsonDocument&, const char*, size_t, NestingLimit, Filter);
|
||||
// deserialize(JsonDocument&, const __FlashStringHelper*, size_t, NL, Filter);
|
||||
template <template <typename, typename> class TDeserializer, typename TChar,
|
||||
typename TFilter>
|
||||
DeserializationError deserialize(
|
||||
JsonDocument& doc, TChar* input, size_t inputSize,
|
||||
DeserializationOption::NestingLimit nestingLimit, TFilter filter) {
|
||||
BoundedReader<TChar*> reader(input, inputSize);
|
||||
VariantData* data = VariantAttorney::getData(doc);
|
||||
MemoryPool* pool = VariantAttorney::getPool(doc);
|
||||
doc.clear();
|
||||
return makeDeserializer<TDeserializer>(pool, reader,
|
||||
makeStringStorage(input, pool))
|
||||
.parse(*data, filter, nestingLimit);
|
||||
}
|
||||
//
|
||||
// deserialize(JsonDocument&, std::istream&, NestingLimit, Filter);
|
||||
// deserialize(JsonDocument&, Stream&, NestingLimit, Filter);
|
||||
template <template <typename, typename> class TDeserializer, typename TStream,
|
||||
typename TFilter>
|
||||
DeserializationError deserialize(
|
||||
JsonDocument& doc, TStream& input,
|
||||
DeserializationOption::NestingLimit nestingLimit, TFilter filter) {
|
||||
Reader<TStream> reader(input);
|
||||
VariantData* data = VariantAttorney::getData(doc);
|
||||
MemoryPool* pool = VariantAttorney::getPool(doc);
|
||||
typename... Args>
|
||||
DeserializationError deserialize(JsonDocument& doc, TStream&& input,
|
||||
Args... args) {
|
||||
auto reader = makeReader(detail::forward<TStream>(input));
|
||||
auto data = VariantAttorney::getData(doc);
|
||||
auto pool = VariantAttorney::getPool(doc);
|
||||
auto options = makeDeserializationOptions(args...);
|
||||
doc.clear();
|
||||
return makeDeserializer<TDeserializer>(pool, reader,
|
||||
makeStringStorage(input, pool))
|
||||
.parse(*data, filter, nestingLimit);
|
||||
.parse(*data, options.filter, options.nestingLimit);
|
||||
}
|
||||
|
||||
template <template <typename, typename> class TDeserializer, typename TChar,
|
||||
typename Size, typename... Args,
|
||||
typename = typename enable_if<is_integral<Size>::value>::type>
|
||||
DeserializationError deserialize(JsonDocument& doc, TChar* input,
|
||||
Size inputSize, Args... args) {
|
||||
auto reader = makeReader(input, size_t(inputSize));
|
||||
auto data = VariantAttorney::getData(doc);
|
||||
auto pool = VariantAttorney::getPool(doc);
|
||||
auto options = makeDeserializationOptions(args...);
|
||||
doc.clear();
|
||||
return makeDeserializer<TDeserializer>(pool, reader,
|
||||
makeStringStorage(input, pool))
|
||||
.parse(*data, options.filter, options.nestingLimit);
|
||||
}
|
||||
|
||||
ARDUINOJSON_END_PRIVATE_NAMESPACE
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include <ArduinoJson/Numbers/parseNumber.hpp>
|
||||
#include <ArduinoJson/Polyfills/assert.hpp>
|
||||
#include <ArduinoJson/Polyfills/type_traits.hpp>
|
||||
#include <ArduinoJson/Polyfills/utility.hpp>
|
||||
#include <ArduinoJson/Variant/VariantData.hpp>
|
||||
|
||||
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
|
||||
@ -671,137 +672,22 @@ ARDUINOJSON_END_PRIVATE_NAMESPACE
|
||||
|
||||
ARDUINOJSON_BEGIN_PUBLIC_NAMESPACE
|
||||
|
||||
// Parses a JSON input and puts the result in a JsonDocument.
|
||||
// Parses a JSON input, filters, and puts the result in a JsonDocument.
|
||||
// https://arduinojson.org/v6/api/json/deserializejson/
|
||||
template <typename TString>
|
||||
DeserializationError deserializeJson(
|
||||
JsonDocument& doc, const TString& input,
|
||||
DeserializationOption::NestingLimit nestingLimit = {}) {
|
||||
template <typename... Args>
|
||||
DeserializationError deserializeJson(JsonDocument& doc, Args&&... args) {
|
||||
using namespace detail;
|
||||
return deserialize<JsonDeserializer>(doc, input, nestingLimit,
|
||||
AllowAllFilter());
|
||||
return deserialize<JsonDeserializer>(doc, detail::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
// Parses a JSON input, filters, and puts the result in a JsonDocument.
|
||||
// https://arduinojson.org/v6/api/json/deserializejson/
|
||||
template <typename TString>
|
||||
DeserializationError deserializeJson(
|
||||
JsonDocument& doc, const TString& input,
|
||||
DeserializationOption::Filter filter,
|
||||
DeserializationOption::NestingLimit nestingLimit = {}) {
|
||||
template <typename TChar, typename... Args>
|
||||
DeserializationError deserializeJson(JsonDocument& doc, TChar* input,
|
||||
Args&&... args) {
|
||||
using namespace detail;
|
||||
return deserialize<JsonDeserializer>(doc, input, nestingLimit, filter);
|
||||
}
|
||||
|
||||
// Parses a JSON input, filters, and puts the result in a JsonDocument.
|
||||
// https://arduinojson.org/v6/api/json/deserializejson/
|
||||
template <typename TString>
|
||||
DeserializationError deserializeJson(
|
||||
JsonDocument& doc, const TString& input,
|
||||
DeserializationOption::NestingLimit nestingLimit,
|
||||
DeserializationOption::Filter filter) {
|
||||
using namespace detail;
|
||||
return deserialize<JsonDeserializer>(doc, input, nestingLimit, filter);
|
||||
}
|
||||
|
||||
// Parses a JSON input and puts the result in a JsonDocument.
|
||||
// https://arduinojson.org/v6/api/json/deserializejson/
|
||||
template <typename TStream>
|
||||
DeserializationError deserializeJson(
|
||||
JsonDocument& doc, TStream& input,
|
||||
DeserializationOption::NestingLimit nestingLimit = {}) {
|
||||
using namespace detail;
|
||||
return deserialize<JsonDeserializer>(doc, input, nestingLimit,
|
||||
AllowAllFilter());
|
||||
}
|
||||
|
||||
// Parses a JSON input, filters, and puts the result in a JsonDocument.
|
||||
// https://arduinojson.org/v6/api/json/deserializejson/
|
||||
template <typename TStream>
|
||||
DeserializationError deserializeJson(
|
||||
JsonDocument& doc, TStream& input, DeserializationOption::Filter filter,
|
||||
DeserializationOption::NestingLimit nestingLimit = {}) {
|
||||
using namespace detail;
|
||||
return deserialize<JsonDeserializer>(doc, input, nestingLimit, filter);
|
||||
}
|
||||
|
||||
// Parses a JSON input, filters, and puts the result in a JsonDocument.
|
||||
// https://arduinojson.org/v6/api/json/deserializejson/
|
||||
template <typename TStream>
|
||||
DeserializationError deserializeJson(
|
||||
JsonDocument& doc, TStream& input,
|
||||
DeserializationOption::NestingLimit nestingLimit,
|
||||
DeserializationOption::Filter filter) {
|
||||
using namespace detail;
|
||||
return deserialize<JsonDeserializer>(doc, input, nestingLimit, filter);
|
||||
}
|
||||
|
||||
// Parses a JSON input and puts the result in a JsonDocument.
|
||||
// https://arduinojson.org/v6/api/json/deserializejson/
|
||||
template <typename TChar>
|
||||
DeserializationError deserializeJson(
|
||||
JsonDocument& doc, TChar* input,
|
||||
DeserializationOption::NestingLimit nestingLimit = {}) {
|
||||
using namespace detail;
|
||||
return deserialize<JsonDeserializer>(doc, input, nestingLimit,
|
||||
AllowAllFilter());
|
||||
}
|
||||
|
||||
// Parses a JSON input, filters, and puts the result in a JsonDocument.
|
||||
// https://arduinojson.org/v6/api/json/deserializejson/
|
||||
template <typename TChar>
|
||||
DeserializationError deserializeJson(
|
||||
JsonDocument& doc, TChar* input, DeserializationOption::Filter filter,
|
||||
DeserializationOption::NestingLimit nestingLimit = {}) {
|
||||
using namespace detail;
|
||||
return deserialize<JsonDeserializer>(doc, input, nestingLimit, filter);
|
||||
}
|
||||
|
||||
// Parses a JSON input, filters, and puts the result in a JsonDocument.
|
||||
// https://arduinojson.org/v6/api/json/deserializejson/
|
||||
template <typename TChar>
|
||||
DeserializationError deserializeJson(
|
||||
JsonDocument& doc, TChar* input,
|
||||
DeserializationOption::NestingLimit nestingLimit,
|
||||
DeserializationOption::Filter filter) {
|
||||
using namespace detail;
|
||||
return deserialize<JsonDeserializer>(doc, input, nestingLimit, filter);
|
||||
}
|
||||
|
||||
// Parses a JSON input and puts the result in a JsonDocument.
|
||||
// https://arduinojson.org/v6/api/json/deserializejson/
|
||||
template <typename TChar>
|
||||
DeserializationError deserializeJson(
|
||||
JsonDocument& doc, TChar* input, size_t inputSize,
|
||||
DeserializationOption::NestingLimit nestingLimit = {}) {
|
||||
using namespace detail;
|
||||
return deserialize<JsonDeserializer>(doc, input, inputSize, nestingLimit,
|
||||
AllowAllFilter());
|
||||
}
|
||||
|
||||
// Parses a JSON input, filters, and puts the result in a JsonDocument.
|
||||
// https://arduinojson.org/v6/api/json/deserializejson/
|
||||
template <typename TChar>
|
||||
DeserializationError deserializeJson(
|
||||
JsonDocument& doc, TChar* input, size_t inputSize,
|
||||
DeserializationOption::Filter filter,
|
||||
DeserializationOption::NestingLimit nestingLimit =
|
||||
DeserializationOption::NestingLimit()) {
|
||||
using namespace detail;
|
||||
return deserialize<JsonDeserializer>(doc, input, inputSize, nestingLimit,
|
||||
filter);
|
||||
}
|
||||
|
||||
// Parses a JSON input, filters, and puts the result in a JsonDocument.
|
||||
// https://arduinojson.org/v6/api/json/deserializejson/
|
||||
template <typename TChar>
|
||||
DeserializationError deserializeJson(
|
||||
JsonDocument& doc, TChar* input, size_t inputSize,
|
||||
DeserializationOption::NestingLimit nestingLimit,
|
||||
DeserializationOption::Filter filter) {
|
||||
using namespace detail;
|
||||
return deserialize<JsonDeserializer>(doc, input, inputSize, nestingLimit,
|
||||
filter);
|
||||
return deserialize<JsonDeserializer>(doc, input,
|
||||
detail::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
ARDUINOJSON_END_PUBLIC_NAMESPACE
|
||||
|
@ -566,134 +566,20 @@ ARDUINOJSON_BEGIN_PUBLIC_NAMESPACE
|
||||
|
||||
// Parses a MessagePack input and puts the result in a JsonDocument.
|
||||
// https://arduinojson.org/v6/api/msgpack/deserializemsgpack/
|
||||
template <typename TString>
|
||||
DeserializationError deserializeMsgPack(
|
||||
JsonDocument& doc, const TString& input,
|
||||
DeserializationOption::NestingLimit nestingLimit = {}) {
|
||||
template <typename... Args>
|
||||
DeserializationError deserializeMsgPack(JsonDocument& doc, Args&&... args) {
|
||||
using namespace detail;
|
||||
return deserialize<MsgPackDeserializer>(doc, input, nestingLimit,
|
||||
AllowAllFilter());
|
||||
}
|
||||
|
||||
// Parses a MessagePack input, filters, and puts the result in a JsonDocument.
|
||||
// https://arduinojson.org/v6/api/msgpack/deserializemsgpack/
|
||||
template <typename TString>
|
||||
DeserializationError deserializeMsgPack(
|
||||
JsonDocument& doc, const TString& input,
|
||||
DeserializationOption::Filter filter,
|
||||
DeserializationOption::NestingLimit nestingLimit = {}) {
|
||||
using namespace detail;
|
||||
return deserialize<MsgPackDeserializer>(doc, input, nestingLimit, filter);
|
||||
}
|
||||
|
||||
// Parses a MessagePack input, filters, and puts the result in a JsonDocument.
|
||||
// https://arduinojson.org/v6/api/msgpack/deserializemsgpack/
|
||||
template <typename TString>
|
||||
DeserializationError deserializeMsgPack(
|
||||
JsonDocument& doc, const TString& input,
|
||||
DeserializationOption::NestingLimit nestingLimit,
|
||||
DeserializationOption::Filter filter) {
|
||||
using namespace detail;
|
||||
return deserialize<MsgPackDeserializer>(doc, input, nestingLimit, filter);
|
||||
return deserialize<MsgPackDeserializer>(doc, detail::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
// Parses a MessagePack input and puts the result in a JsonDocument.
|
||||
// https://arduinojson.org/v6/api/msgpack/deserializemsgpack/
|
||||
template <typename TStream>
|
||||
DeserializationError deserializeMsgPack(
|
||||
JsonDocument& doc, TStream& input,
|
||||
DeserializationOption::NestingLimit nestingLimit = {}) {
|
||||
template <typename TChar, typename... Args>
|
||||
DeserializationError deserializeMsgPack(JsonDocument& doc, TChar* input,
|
||||
Args&&... args) {
|
||||
using namespace detail;
|
||||
return deserialize<MsgPackDeserializer>(doc, input, nestingLimit,
|
||||
AllowAllFilter());
|
||||
}
|
||||
|
||||
// Parses a MessagePack input, filters, and puts the result in a JsonDocument.
|
||||
// https://arduinojson.org/v6/api/msgpack/deserializemsgpack/
|
||||
template <typename TStream>
|
||||
DeserializationError deserializeMsgPack(
|
||||
JsonDocument& doc, TStream& input, DeserializationOption::Filter filter,
|
||||
DeserializationOption::NestingLimit nestingLimit = {}) {
|
||||
using namespace detail;
|
||||
return deserialize<MsgPackDeserializer>(doc, input, nestingLimit, filter);
|
||||
}
|
||||
|
||||
// Parses a MessagePack input, filters, and puts the result in a JsonDocument.
|
||||
// https://arduinojson.org/v6/api/msgpack/deserializemsgpack/
|
||||
template <typename TStream>
|
||||
DeserializationError deserializeMsgPack(
|
||||
JsonDocument& doc, TStream& input,
|
||||
DeserializationOption::NestingLimit nestingLimit,
|
||||
DeserializationOption::Filter filter) {
|
||||
using namespace detail;
|
||||
return deserialize<MsgPackDeserializer>(doc, input, nestingLimit, filter);
|
||||
}
|
||||
|
||||
// Parses a MessagePack input and puts the result in a JsonDocument.
|
||||
// https://arduinojson.org/v6/api/msgpack/deserializemsgpack/
|
||||
template <typename TChar>
|
||||
DeserializationError deserializeMsgPack(
|
||||
JsonDocument& doc, TChar* input,
|
||||
DeserializationOption::NestingLimit nestingLimit = {}) {
|
||||
using namespace detail;
|
||||
return deserialize<MsgPackDeserializer>(doc, input, nestingLimit,
|
||||
AllowAllFilter());
|
||||
}
|
||||
|
||||
// Parses a MessagePack input, filters, and puts the result in a JsonDocument.
|
||||
// https://arduinojson.org/v6/api/msgpack/deserializemsgpack/
|
||||
template <typename TChar>
|
||||
DeserializationError deserializeMsgPack(
|
||||
JsonDocument& doc, TChar* input, DeserializationOption::Filter filter,
|
||||
DeserializationOption::NestingLimit nestingLimit = {}) {
|
||||
using namespace detail;
|
||||
return deserialize<MsgPackDeserializer>(doc, input, nestingLimit, filter);
|
||||
}
|
||||
|
||||
// Parses a MessagePack input, filters, and puts the result in a JsonDocument.
|
||||
// https://arduinojson.org/v6/api/msgpack/deserializemsgpack/
|
||||
template <typename TChar>
|
||||
DeserializationError deserializeMsgPack(
|
||||
JsonDocument& doc, TChar* input,
|
||||
DeserializationOption::NestingLimit nestingLimit,
|
||||
DeserializationOption::Filter filter) {
|
||||
using namespace detail;
|
||||
return deserialize<MsgPackDeserializer>(doc, input, nestingLimit, filter);
|
||||
}
|
||||
|
||||
// Parses a MessagePack input and puts the result in a JsonDocument.
|
||||
// https://arduinojson.org/v6/api/msgpack/deserializemsgpack/
|
||||
template <typename TChar>
|
||||
DeserializationError deserializeMsgPack(
|
||||
JsonDocument& doc, TChar* input, size_t inputSize,
|
||||
DeserializationOption::NestingLimit nestingLimit = {}) {
|
||||
using namespace detail;
|
||||
return deserialize<MsgPackDeserializer>(doc, input, inputSize, nestingLimit,
|
||||
AllowAllFilter());
|
||||
}
|
||||
|
||||
// Parses a MessagePack input, filters, and puts the result in a JsonDocument.
|
||||
// https://arduinojson.org/v6/api/msgpack/deserializemsgpack/
|
||||
template <typename TChar>
|
||||
DeserializationError deserializeMsgPack(
|
||||
JsonDocument& doc, TChar* input, size_t inputSize,
|
||||
DeserializationOption::Filter filter,
|
||||
DeserializationOption::NestingLimit nestingLimit = {}) {
|
||||
using namespace detail;
|
||||
return deserialize<MsgPackDeserializer>(doc, input, inputSize, nestingLimit,
|
||||
filter);
|
||||
}
|
||||
|
||||
// Parses a MessagePack input, filters, and puts the result in a JsonDocument.
|
||||
// https://arduinojson.org/v6/api/msgpack/deserializemsgpack/
|
||||
template <typename TChar>
|
||||
DeserializationError deserializeMsgPack(
|
||||
JsonDocument& doc, TChar* input, size_t inputSize,
|
||||
DeserializationOption::NestingLimit nestingLimit,
|
||||
DeserializationOption::Filter filter) {
|
||||
using namespace detail;
|
||||
return deserialize<MsgPackDeserializer>(doc, input, inputSize, nestingLimit,
|
||||
filter);
|
||||
return deserialize<MsgPackDeserializer>(doc, input,
|
||||
detail::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
ARDUINOJSON_END_PUBLIC_NAMESPACE
|
||||
|
@ -6,6 +6,8 @@
|
||||
|
||||
#include <ArduinoJson/Namespace.hpp>
|
||||
|
||||
#include "remove_reference.hpp"
|
||||
|
||||
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
|
||||
|
||||
// A meta-function that returns true if Derived inherits from TBase is an
|
||||
@ -18,7 +20,8 @@ class is_base_of {
|
||||
|
||||
public:
|
||||
static const bool value =
|
||||
sizeof(probe(reinterpret_cast<TDerived*>(0))) == sizeof(int);
|
||||
sizeof(probe(reinterpret_cast<typename remove_reference<TDerived>::type*>(
|
||||
0))) == sizeof(int);
|
||||
};
|
||||
|
||||
ARDUINOJSON_END_PRIVATE_NAMESPACE
|
||||
|
16
src/ArduinoJson/Polyfills/utility.hpp
Normal file
16
src/ArduinoJson/Polyfills/utility.hpp
Normal file
@ -0,0 +1,16 @@
|
||||
// ArduinoJson - https://arduinojson.org
|
||||
// Copyright © 2014-2022, Benoit BLANCHON
|
||||
// MIT License
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "type_traits.hpp"
|
||||
|
||||
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
|
||||
|
||||
template <class T>
|
||||
T&& forward(typename remove_reference<T>::type& t) noexcept {
|
||||
return static_cast<T&&>(t);
|
||||
}
|
||||
|
||||
ARDUINOJSON_END_PRIVATE_NAMESPACE
|
Reference in New Issue
Block a user