settings: hide kv_store from the public header

More concise foreach, generic template code also no longer expands down to ::_read_kv
Also helps with needless inlining happening with recent gcc versions
This commit is contained in:
Maxim Prokhorov
2021-06-18 17:19:05 +03:00
parent c51b6e99f1
commit 1600fcc133
8 changed files with 76 additions and 33 deletions

View File

@@ -537,7 +537,7 @@ unsigned long _buttonGetDelay(const char* key, size_t index, unsigned long defau
auto indexed = SettingsKey(key, index);
auto global = String(key);
settings::kv_store.foreach([&](settings::kvs_type::KeyValueResult&& kv) {
settings::internal::foreach([&](settings::kvs_type::KeyValueResult&& kv) {
if (found) {
return;
}
@@ -701,7 +701,7 @@ std::vector<AnalogPin*> AnalogPin::pins;
BasePinPtr _buttonGpioPin(size_t index, ButtonProvider provider) {
BasePinPtr result;
auto pin = getSetting({"btnGpio", index}, button::build::pin(index));
auto pin [[gnu::unused]] = getSetting({"btnGpio", index}, button::build::pin(index));
switch (provider) {
case ButtonProvider::Gpio: {

View File

@@ -15,8 +15,7 @@ Copyright (C) 2016-2019 by Xose Pérez <xose dot perez at gmail dot com>
void delSettingPrefix(const std::initializer_list<const char*>& prefixes) {
std::vector<String> to_purge;
using namespace settings;
kv_store.foreach([&](kvs_type::KeyValueResult&& kv) {
settings::internal::foreach([&](settings::kvs_type::KeyValueResult&& kv) {
auto key = kv.key.read();
for (const auto* prefix : prefixes) {
if (key.startsWith(prefix)) {

View File

@@ -378,7 +378,7 @@ void _ntpConvertLegacyOffsets() {
bool dst { true };
int offset { 60 };
settings::kv_store.foreach([&](settings::kvs_type::KeyValueResult&& kv) {
settings::internal::foreach([&](settings::kvs_type::KeyValueResult&& kv) {
const auto key = kv.key.read();
if (key == F("ntpTZ")) {
save = false;

View File

@@ -1522,7 +1522,7 @@ void _relayMqttSubscribeCustomTopics() {
topics.emplace_back(relay::build::mqttTopicSub(id), relay::build::mqttTopicMode(id));
}
settings::kv_store.foreach([&](settings::kvs_type::KeyValueResult&& kv) {
settings::internal::foreach([&](settings::kvs_type::KeyValueResult&& kv) {
const char* const SubPrefix = "relayTopicSub";
const char* const ModePrefix = "relayTopicMode";
@@ -1648,7 +1648,7 @@ void _relayMqttHandleCustomTopic(const String& topic, const char* payload) {
}
void _relayMqttHandleDisconnect() {
settings::kv_store.foreach([](settings::kvs_type::KeyValueResult&& kv) {
settings::internal::foreach([](settings::kvs_type::KeyValueResult&& kv) {
const char* const prefix = "relayMqttDisc";
if (kv.key.length <= strlen(prefix)) {
return;

View File

@@ -430,8 +430,7 @@ RfbRelayMatch _rfbMatch(const char* code) {
// scan kvs only once, since we want both ON and OFF options and don't want to depend on the relayCount()
RfbRelayMatch matched;
using namespace settings;
kv_store.foreach([code, len, &matched](kvs_type::KeyValueResult&& kv) {
settings::internal::foreach([code, len, &matched](settings::kvs_type::KeyValueResult&& kv) {
const auto key = kv.key.read();
PayloadStatus status = key.startsWith(F("rfbON"))
? PayloadStatus::On : key.startsWith(F("rfbOFF"))

View File

@@ -37,15 +37,45 @@ kvs_type kv_store(
} // namespace settings
size_t settingsSize() {
return settings::kv_store.size() - settings::kv_store.available();
}
// --------------------------------------------------------------------------
namespace settings {
namespace internal {
ValueResult get(const String& key) {
return kv_store.get(key);
}
bool set(const String& key, const String& value) {
return kv_store.set(key, value);
}
bool del(const String& key) {
return kv_store.del(key);
}
bool has(const String& key) {
return kv_store.has(key);
}
Keys keys() {
return kv_store.keys();
}
size_t available() {
return kv_store.available();
}
size_t size() {
return kv_store.size();
}
void foreach(KeyValueResultCallback&& callback) {
kv_store.foreach(callback);
}
// --------------------------------------------------------------------------
uint32_t u32fromString(const String& string, int base) {
const char *ptr = string.c_str();
@@ -182,9 +212,13 @@ unsigned char convert(const String& value) {
// Key-value API
// -----------------------------------------------------------------------------
size_t settingsSize() {
return settings::internal::size() - settings::internal::available();
}
// TODO: UI needs this to avoid showing keys in storage order
std::vector<String> settingsKeys() {
auto keys = settings::kv_store.keys();
auto keys = settings::internal::keys();
std::sort(keys.begin(), keys.end(), [](const String& rhs, const String& lhs) -> bool {
return lhs.compareTo(rhs) > 0;
});
@@ -192,7 +226,6 @@ std::vector<String> settingsKeys() {
return keys;
}
static std::vector<settings_key_match_t> _settings_matchers;
void settingsRegisterDefaults(const settings_key_match_t& matcher) {
@@ -213,7 +246,7 @@ settings_move_key_t _moveKeys(const String& from, const String& to, size_t index
}
void moveSetting(const String& from, const String& to) {
auto result = settings::kv_store.get(from);
auto result = settings::internal::get(from);
if (result) {
setSetting(to, result.ref());
}
@@ -223,7 +256,7 @@ void moveSetting(const String& from, const String& to) {
void moveSetting(const String& from, const String& to, size_t index) {
const auto keys = _moveKeys(from, to, index);
auto result = settings::kv_store.get(keys.first.value());
auto result = settings::internal::get(keys.first.value());
if (result) {
setSetting(keys.second, result.ref());
}
@@ -234,7 +267,7 @@ void moveSetting(const String& from, const String& to, size_t index) {
void moveSettings(const String& from, const String& to) {
for (size_t index = 0; index < 100; ++index) {
const auto keys = _moveKeys(from, to, index);
auto result = settings::kv_store.get(keys.first.value());
auto result = settings::internal::get(keys.first.value());
if (!result) {
break;
}
@@ -272,7 +305,7 @@ template
double getSetting(const SettingsKey& key, double defaultValue);
String getSetting(const String& key) {
return std::move(settings::kv_store.get(key)).get();
return std::move(settings::internal::get(key)).get();
}
String getSetting(const __FlashStringHelper* key) {
@@ -297,7 +330,7 @@ String getSetting(const SettingsKey& key, const __FlashStringHelper* defaultValu
}
String getSetting(const SettingsKey& key, const String& defaultValue) {
auto result = settings::kv_store.get(key.value());
auto result = settings::internal::get(key.value());
if (result) {
return std::move(result).get();
}
@@ -306,7 +339,7 @@ String getSetting(const SettingsKey& key, const String& defaultValue) {
}
String getSetting(const SettingsKey& key, String&& defaultValue) {
auto result = settings::kv_store.get(key.value());
auto result = settings::internal::get(key.value());
if (result) {
return std::move(result).get();
}
@@ -315,7 +348,7 @@ String getSetting(const SettingsKey& key, String&& defaultValue) {
}
bool delSetting(const String& key) {
return settings::kv_store.del(key);
return settings::internal::del(key);
}
bool delSetting(const SettingsKey& key) {
@@ -331,7 +364,7 @@ bool delSetting(const __FlashStringHelper* key) {
}
bool hasSetting(const String& key) {
return settings::kv_store.has(key);
return settings::internal::has(key);
}
bool hasSetting(const SettingsKey& key) {
@@ -463,10 +496,10 @@ void _settingsInitCommands() {
ctx.output.printf_P(PSTR("> %s => \"%s\"\n"), (keys[i]).c_str(), value.c_str());
}
auto available [[gnu::unused]] = settings::kv_store.available();
auto available [[gnu::unused]] = settings::internal::available();
ctx.output.printf_P(PSTR("Number of keys: %u\n"), keys.size());
ctx.output.printf_P(PSTR("Available: %u bytes (%u%%)\n"),
available, (100 * available) / settings::kv_store.size());
available, (100 * available) / settings::internal::size());
terminalOK(ctx);
});
@@ -479,7 +512,7 @@ void _settingsInitCommands() {
int result = 0;
for (auto it = (ctx.argv.begin() + 1); it != ctx.argv.end(); ++it) {
result += settings::kv_store.del(*it);
result += settings::internal::del(*it);
}
if (result) {
@@ -495,7 +528,7 @@ void _settingsInitCommands() {
return;
}
if (settings::kv_store.set(ctx.argv[1], ctx.argv[2])) {
if (settings::internal::set(ctx.argv[1], ctx.argv[2])) {
terminalOK(ctx);
return;
}
@@ -511,7 +544,7 @@ void _settingsInitCommands() {
for (auto it = (ctx.argv.begin() + 1); it != ctx.argv.end(); ++it) {
const String& key = *it;
auto result = settings::kv_store.get(key);
auto result = settings::internal::get(key);
if (!result) {
const auto maybeDefault = settingsQueryDefaults(key);
if (maybeDefault.length()) {

View File

@@ -51,8 +51,6 @@ void commit() {
using kvs_type = embedis::KeyValueStore<EepromStorage>;
extern kvs_type kv_store;
} // namespace settings
// --------------------------------------------------------------------------
@@ -82,6 +80,20 @@ using enable_if_arduino_string = std::enable_if<is_arduino_string<T>::value>;
template <typename T>
using enable_if_not_arduino_string = std::enable_if<!is_arduino_string<T>::value>;
ValueResult get(const String& key);
bool set(const String& key, const String& value);
bool del(const String& key);
bool has(const String& key);
using Keys = std::vector<String>;
Keys keys();
size_t available();
size_t size();
using KeyValueResultCallback = std::function<void(settings::kvs_type::KeyValueResult&&)>;
void foreach(KeyValueResultCallback&& callback);
// --------------------------------------------------------------------------
template <typename T>
@@ -193,7 +205,7 @@ T getSetting(const SettingsKey& key, T defaultValue) __attribute__((noinline));
template <typename T, typename = typename settings::internal::enable_if_not_arduino_string<T>::type>
T getSetting(const SettingsKey& key, T defaultValue) {
auto result = settings::kv_store.get(key.value());
auto result = settings::internal::get(key.value());
if (result) {
return settings::internal::convert<T>(result.ref());
}
@@ -213,7 +225,7 @@ String getSetting(const SettingsKey& key, String&& defaultValue);
template<typename T, typename = typename settings::internal::enable_if_arduino_string<T>::type>
bool setSetting(const SettingsKey& key, T&& value) {
return settings::kv_store.set(key.value(), value);
return settings::internal::set(key.value(), value);
}
template<typename T, typename = typename settings::internal::enable_if_not_arduino_string<T>::type>

View File

@@ -276,7 +276,7 @@ void _onGetConfig(AsyncWebServerRequest *request) {
}
out->concat(buffer, prefix_len);
settings::kv_store.foreach([&](settings::kvs_type::KeyValueResult&& kv) {
settings::internal::foreach([&](settings::kvs_type::KeyValueResult&& kv) {
auto key = kv.key.read();
auto value = kv.value.read();