53 lines
1.5 KiB
C++
53 lines
1.5 KiB
C++
// ArduinoJson - arduinojson.org
|
|
// Copyright Benoit Blanchon 2014-2018
|
|
// MIT License
|
|
|
|
#pragma once
|
|
|
|
#include "Data/JsonVariantAs.hpp"
|
|
#include "Polyfills/attributes.hpp"
|
|
#include "TypeTraits/EnableIf.hpp"
|
|
#include "TypeTraits/IsIntegral.hpp"
|
|
|
|
namespace ArduinoJson {
|
|
namespace Internals {
|
|
|
|
template <typename TImpl>
|
|
class JsonVariantOr {
|
|
public:
|
|
// Returns the default value if the JsonVariant is undefined of incompatible
|
|
template <typename T>
|
|
typename EnableIf<!IsIntegral<T>::value, T>::type operator|(
|
|
const T &defaultValue) const {
|
|
if (impl()->template is<T>())
|
|
return impl()->template as<T>();
|
|
else
|
|
return defaultValue;
|
|
}
|
|
|
|
// Returns the default value if the JsonVariant is undefined of incompatible
|
|
// Special case for string: null is treated as undefined
|
|
const char *operator|(const char *defaultValue) const {
|
|
const char *value = impl()->template as<const char *>();
|
|
return value ? value : defaultValue;
|
|
}
|
|
|
|
// Returns the default value if the JsonVariant is undefined of incompatible
|
|
// Special case for integers: we also accept double
|
|
template <typename Integer>
|
|
typename EnableIf<IsIntegral<Integer>::value, Integer>::type operator|(
|
|
const Integer &defaultValue) const {
|
|
if (impl()->template is<double>())
|
|
return impl()->template as<Integer>();
|
|
else
|
|
return defaultValue;
|
|
}
|
|
|
|
private:
|
|
const TImpl *impl() const {
|
|
return static_cast<const TImpl *>(this);
|
|
}
|
|
};
|
|
} // namespace Internals
|
|
} // namespace ArduinoJson
|