More virtual

This commit is contained in:
2022-04-26 15:22:09 +02:00
parent 2ec9d89594
commit 086eaa9be4
2 changed files with 5 additions and 90 deletions

View File

@@ -27,11 +27,7 @@ public:
using value_t = typename std::conditional<std::is_same<T, std::string>::value, const T &, T>::type;
using ConstraintCallback = ConfigConstraintReturnType(*)(value_t);
ConfigWrapper(const T &defaultValue, ConstraintCallback constraintCallback);
ConfigWrapper(T &&defaultValue, ConstraintCallback constraintCallback);
ConfigWrapper(const ConfigWrapper<T> &factoryConfig, ConstraintCallback constraintCallback);
ConfigWrapper(const DefaultValueCallbackRef &defaultCallback, ConstraintCallback constraintCallback);
~ConfigWrapper() override;
ConfigWrapper() = default;
ConfigStatusReturnType write(nvs_handle_t nvsHandle, value_t value);
@@ -40,13 +36,13 @@ public:
std::string valueAsString() 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 reset(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; }
@@ -54,17 +50,6 @@ private:
ConfigStatusReturnType writeToFlash(nvs_handle_t nvsHandle, value_t 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

View File

@@ -19,20 +19,15 @@
#define INSTANTIATE_CONFIGWRAPPER_TEMPLATES(TYPE) \
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<> const char *ConfigWrapper<TYPE>::type() const { return #TYPE; } \
template std::string ConfigWrapper<TYPE>::valueAsString() 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>::reset(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); \
} // namespace espconfig
@@ -41,49 +36,6 @@ namespace {
constexpr const char * const TAG = "CONFIG";
} // 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>
ConfigStatusReturnType ConfigWrapper<T>::write(nvs_handle_t nvsHandle, value_t value)
{
@@ -125,19 +77,6 @@ std::string ConfigWrapper<T>::defaultAsString() const
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>
ConfigStatusReturnType ConfigWrapper<T>::loadFromFlash(nvs_handle_t nvsHandle)
{
@@ -216,15 +155,6 @@ ConfigStatusReturnType ConfigWrapper<T>::forceReset(nvs_handle_t nvsHandle)
return {};
}
template<typename T>
ConfigConstraintReturnType ConfigWrapper<T>::checkValue(value_t value) const
{
if (!m_constraintCallback)
return {};
return m_constraintCallback(value);
}
template<typename T>
ConfigStatusReturnType ConfigWrapper<T>::writeToFlash(nvs_handle_t nvsHandle, value_t value)
{