More virtual
This commit is contained in:
@@ -27,11 +27,7 @@ public:
|
|||||||
using value_t = typename std::conditional<std::is_same<T, std::string>::value, const T &, T>::type;
|
using value_t = typename std::conditional<std::is_same<T, std::string>::value, const T &, T>::type;
|
||||||
using ConstraintCallback = ConfigConstraintReturnType(*)(value_t);
|
using ConstraintCallback = ConfigConstraintReturnType(*)(value_t);
|
||||||
|
|
||||||
ConfigWrapper(const T &defaultValue, ConstraintCallback constraintCallback);
|
ConfigWrapper() = default;
|
||||||
ConfigWrapper(T &&defaultValue, ConstraintCallback constraintCallback);
|
|
||||||
ConfigWrapper(const ConfigWrapper<T> &factoryConfig, ConstraintCallback constraintCallback);
|
|
||||||
ConfigWrapper(const DefaultValueCallbackRef &defaultCallback, ConstraintCallback constraintCallback);
|
|
||||||
~ConfigWrapper() override;
|
|
||||||
|
|
||||||
ConfigStatusReturnType write(nvs_handle_t nvsHandle, value_t value);
|
ConfigStatusReturnType write(nvs_handle_t nvsHandle, value_t value);
|
||||||
|
|
||||||
@@ -40,13 +36,13 @@ public:
|
|||||||
std::string valueAsString() const override final;
|
std::string valueAsString() const override final;
|
||||||
std::string defaultAsString() const override final;
|
std::string defaultAsString() const override final;
|
||||||
|
|
||||||
T defaultValue() const;
|
virtual T defaultValue() const = 0;
|
||||||
|
|
||||||
ConfigStatusReturnType loadFromFlash(nvs_handle_t nvsHandle) override final;
|
ConfigStatusReturnType loadFromFlash(nvs_handle_t nvsHandle) override final;
|
||||||
ConfigStatusReturnType reset(nvs_handle_t nvsHandle) override final;
|
ConfigStatusReturnType reset(nvs_handle_t nvsHandle) override final;
|
||||||
ConfigStatusReturnType forceReset(nvs_handle_t nvsHandle) override final;
|
ConfigStatusReturnType forceReset(nvs_handle_t nvsHandle) override final;
|
||||||
|
|
||||||
ConfigConstraintReturnType checkValue(value_t value) const;
|
virtual ConfigConstraintReturnType checkValue(value_t value) const = 0;
|
||||||
|
|
||||||
const T &value() const { return m_value; }
|
const T &value() const { return m_value; }
|
||||||
|
|
||||||
@@ -54,17 +50,6 @@ private:
|
|||||||
ConfigStatusReturnType writeToFlash(nvs_handle_t nvsHandle, value_t value);
|
ConfigStatusReturnType writeToFlash(nvs_handle_t nvsHandle, value_t value);
|
||||||
|
|
||||||
T m_value;
|
T m_value;
|
||||||
|
|
||||||
const enum : uint8_t { DefaultByValue, DefaultByFactoryConfig, DefaultByCallback } m_defaultType;
|
|
||||||
|
|
||||||
union
|
|
||||||
{
|
|
||||||
const T m_defaultValue;
|
|
||||||
const ConfigWrapper<T> * const m_factoryConfig;
|
|
||||||
const DefaultValueCallbackPtr m_defaultCallback;
|
|
||||||
};
|
|
||||||
|
|
||||||
const ConstraintCallback m_constraintCallback;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace espconfig
|
} // namespace espconfig
|
||||||
|
@@ -19,20 +19,15 @@
|
|||||||
|
|
||||||
#define INSTANTIATE_CONFIGWRAPPER_TEMPLATES(TYPE) \
|
#define INSTANTIATE_CONFIGWRAPPER_TEMPLATES(TYPE) \
|
||||||
namespace espconfig { \
|
namespace espconfig { \
|
||||||
template ConfigWrapper<TYPE>::ConfigWrapper(const TYPE &defaultValue, ConstraintCallback constraintCallback); \
|
|
||||||
template ConfigWrapper<TYPE>::ConfigWrapper(TYPE &&defaultValue, ConstraintCallback constraintCallback); \
|
|
||||||
template ConfigWrapper<TYPE>::ConfigWrapper(const ConfigWrapper<TYPE> &factoryConfig, ConstraintCallback constraintCallback); \
|
|
||||||
template ConfigWrapper<TYPE>::ConfigWrapper(DefaultValueCallbackRef &defaultCallback, ConstraintCallback constraintCallback); \
|
|
||||||
template ConfigWrapper<TYPE>::~ConfigWrapper(); \
|
|
||||||
template ConfigStatusReturnType ConfigWrapper<TYPE>::write(nvs_handle_t nvsHandle, value_t value); \
|
template ConfigStatusReturnType ConfigWrapper<TYPE>::write(nvs_handle_t nvsHandle, value_t value); \
|
||||||
template<> const char *ConfigWrapper<TYPE>::type() const { return #TYPE; } \
|
template<> const char *ConfigWrapper<TYPE>::type() const { return #TYPE; } \
|
||||||
template std::string ConfigWrapper<TYPE>::valueAsString() const; \
|
template std::string ConfigWrapper<TYPE>::valueAsString() const; \
|
||||||
template std::string ConfigWrapper<TYPE>::defaultAsString() const; \
|
template std::string ConfigWrapper<TYPE>::defaultAsString() const; \
|
||||||
template TYPE ConfigWrapper<TYPE>::defaultValue() const; \
|
/* template TYPE ConfigWrapper<TYPE>::defaultValue() const; */ \
|
||||||
template ConfigStatusReturnType ConfigWrapper<TYPE>::loadFromFlash(nvs_handle_t nvsHandle); \
|
template ConfigStatusReturnType ConfigWrapper<TYPE>::loadFromFlash(nvs_handle_t nvsHandle); \
|
||||||
template ConfigStatusReturnType ConfigWrapper<TYPE>::reset(nvs_handle_t nvsHandle); \
|
template ConfigStatusReturnType ConfigWrapper<TYPE>::reset(nvs_handle_t nvsHandle); \
|
||||||
template ConfigStatusReturnType ConfigWrapper<TYPE>::forceReset(nvs_handle_t nvsHandle); \
|
template ConfigStatusReturnType ConfigWrapper<TYPE>::forceReset(nvs_handle_t nvsHandle); \
|
||||||
template ConfigConstraintReturnType ConfigWrapper<TYPE>::checkValue(value_t value) const; \
|
/* template ConfigConstraintReturnType ConfigWrapper<TYPE>::checkValue(value_t value) const; */ \
|
||||||
template ConfigStatusReturnType ConfigWrapper<TYPE>::writeToFlash(nvs_handle_t nvsHandle, value_t value); \
|
template ConfigStatusReturnType ConfigWrapper<TYPE>::writeToFlash(nvs_handle_t nvsHandle, value_t value); \
|
||||||
} // namespace espconfig
|
} // namespace espconfig
|
||||||
|
|
||||||
@@ -41,49 +36,6 @@ namespace {
|
|||||||
constexpr const char * const TAG = "CONFIG";
|
constexpr const char * const TAG = "CONFIG";
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
ConfigWrapper<T>::ConfigWrapper(const T &defaultValue, ConstraintCallback constraintCallback) :
|
|
||||||
m_defaultType{DefaultByValue},
|
|
||||||
m_defaultValue{defaultValue},
|
|
||||||
m_constraintCallback{constraintCallback}
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
ConfigWrapper<T>::ConfigWrapper(T &&defaultValue, ConstraintCallback constraintCallback) :
|
|
||||||
m_defaultType{DefaultByValue},
|
|
||||||
m_defaultValue{std::move(defaultValue)},
|
|
||||||
m_constraintCallback{constraintCallback}
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
ConfigWrapper<T>::ConfigWrapper(const ConfigWrapper<T> &factoryConfig, ConstraintCallback constraintCallback) :
|
|
||||||
m_defaultType{DefaultByFactoryConfig},
|
|
||||||
m_factoryConfig{&factoryConfig},
|
|
||||||
m_constraintCallback{constraintCallback}
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
ConfigWrapper<T>::ConfigWrapper(const DefaultValueCallbackRef &defaultCallback, ConstraintCallback constraintCallback) :
|
|
||||||
m_defaultType{DefaultByCallback},
|
|
||||||
m_defaultCallback{&defaultCallback},
|
|
||||||
m_constraintCallback{constraintCallback}
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
ConfigWrapper<T>::~ConfigWrapper()
|
|
||||||
{
|
|
||||||
switch (m_defaultType)
|
|
||||||
{
|
|
||||||
case DefaultByValue: m_defaultValue.~T(); break;
|
|
||||||
case DefaultByFactoryConfig: /*m_factoryConfig.~typeof(m_factoryConfig)();*/ break;
|
|
||||||
case DefaultByCallback: /*m_defaultCallback.~typeof(m_defaultCallback)();*/ break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
ConfigStatusReturnType ConfigWrapper<T>::write(nvs_handle_t nvsHandle, value_t value)
|
ConfigStatusReturnType ConfigWrapper<T>::write(nvs_handle_t nvsHandle, value_t value)
|
||||||
{
|
{
|
||||||
@@ -125,19 +77,6 @@ std::string ConfigWrapper<T>::defaultAsString() const
|
|||||||
return toString(defaultValue());
|
return toString(defaultValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
T ConfigWrapper<T>::defaultValue() const
|
|
||||||
{
|
|
||||||
switch (m_defaultType)
|
|
||||||
{
|
|
||||||
case DefaultByValue: return m_defaultValue;
|
|
||||||
case DefaultByFactoryConfig: assert(m_factoryConfig->m_loaded); return m_factoryConfig->value();
|
|
||||||
case DefaultByCallback: return m_defaultCallback();
|
|
||||||
}
|
|
||||||
|
|
||||||
__builtin_unreachable();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
ConfigStatusReturnType ConfigWrapper<T>::loadFromFlash(nvs_handle_t nvsHandle)
|
ConfigStatusReturnType ConfigWrapper<T>::loadFromFlash(nvs_handle_t nvsHandle)
|
||||||
{
|
{
|
||||||
@@ -216,15 +155,6 @@ ConfigStatusReturnType ConfigWrapper<T>::forceReset(nvs_handle_t nvsHandle)
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
ConfigConstraintReturnType ConfigWrapper<T>::checkValue(value_t value) const
|
|
||||||
{
|
|
||||||
if (!m_constraintCallback)
|
|
||||||
return {};
|
|
||||||
|
|
||||||
return m_constraintCallback(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
ConfigStatusReturnType ConfigWrapper<T>::writeToFlash(nvs_handle_t nvsHandle, value_t value)
|
ConfigStatusReturnType ConfigWrapper<T>::writeToFlash(nvs_handle_t nvsHandle, value_t value)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user