Add VariantAttorney

This commit is contained in:
Benoit Blanchon
2022-07-07 11:10:48 +02:00
parent c5838a876b
commit 84b7037b3e
12 changed files with 113 additions and 43 deletions

View File

@@ -0,0 +1,51 @@
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2022, Benoit BLANCHON
// MIT License
#pragma once
#include <ArduinoJson/Polyfills/attributes.hpp>
#include <ArduinoJson/Polyfills/type_traits.hpp>
#include <ArduinoJson/Variant/VariantTo.hpp>
#include "VariantRef.hpp"
namespace ARDUINOJSON_NAMESPACE {
// Grants access to the internal variant API
class VariantAttorney {
// Tells whether getData() returns a const pointer
template <typename TClient>
struct ResultOfGetData {
protected: // <- to avoid GCC's "all member functions in class are private"
typedef char Yes[1];
typedef char No[2];
static Yes &probe(const VariantData *);
static No &probe(VariantData *);
static TClient &client;
public:
typedef typename conditional<sizeof(probe(client.getData())) == sizeof(Yes),
const VariantData *, VariantData *>::type type;
};
public:
template <typename TClient>
FORCE_INLINE static MemoryPool *getPool(TClient &client) {
return client.getPool();
}
template <typename TClient>
FORCE_INLINE static typename ResultOfGetData<TClient>::type getData(
TClient &client) {
return client.getData();
}
template <typename TClient>
FORCE_INLINE static VariantData *getOrCreateData(TClient &client) {
return client.getOrCreateData();
}
};
} // namespace ARDUINOJSON_NAMESPACE