|
|
- /*
-
- Part of the SETTINGS module
-
- Copyright (C) 2016-2019 by Xose Pérez <xose dot perez at gmail dot com>
- Copyright (C) 2020-2021 by Maxim Prokhorov <prokhorov dot max at outlook dot com>
-
- */
-
- #pragma once
-
- #include <Arduino.h>
-
- #include <utility>
-
- // --------------------------------------------------------------------------
-
- class SettingsKey {
- public:
- SettingsKey(const char* key) :
- _key(key)
- {}
-
- SettingsKey(const String& key) :
- _key(key)
- {}
-
- SettingsKey(String&& key) :
- _key(std::move(key))
- {}
-
- SettingsKey(const String& prefix, size_t index) {
- _key.reserve(prefix.length() + 4);
- _key += prefix;
- _key += index;
- }
-
- SettingsKey(String&& prefix, size_t index) :
- _key(std::move(prefix))
- {
- _key += index;
- }
-
- SettingsKey(const char* prefix, size_t index) :
- _key(prefix)
- {
- _key += index;
- }
-
- const char* c_str() const {
- return _key.c_str();
- }
-
- size_t length() const {
- return _key.length();
- }
-
- bool operator==(const char* other) const {
- return _key == other;
- }
-
- bool operator==(const String& other) const {
- return _key == other;
- }
-
- const String& value() const {
- return _key;
- }
-
- explicit operator String() const & {
- return _key;
- }
-
- explicit operator String() && {
- return std::move(_key);
- }
-
- private:
- String _key;
- };
-
- // --------------------------------------------------------------------------
-
- namespace settings {
- namespace internal {
-
- struct BasicSetting {
- using Get = String(*)();
-
- BasicSetting() = delete;
- constexpr BasicSetting(const char* const key, Get get) :
- _key(key),
- _get(get)
- {}
-
- constexpr const char* const key() const {
- return _key;
- }
-
- String get() const {
- return _get();
- }
-
- private:
- const char* const _key;
- Get _get;
- };
-
- struct IndexedSetting {
- using Get = String(*)(size_t);
-
- IndexedSetting() = delete;
- constexpr IndexedSetting(const char* const prefix, Get get) :
- _prefix(prefix),
- _get(get)
- {}
-
- constexpr const char* const prefix() const {
- return _prefix;
- }
-
- String get(size_t index) const {
- return _get(index);
- }
-
- private:
- const char* const _prefix;
- Get _get;
- };
-
- } // namespace internal
-
- // 'optional' type for byte range
- struct ValueResult {
- ValueResult() = default;
- ValueResult(const ValueResult&) = default;
- ValueResult(ValueResult&&) = default;
-
- explicit ValueResult(const String& value) :
- _result(true),
- _value(value)
- {}
-
- explicit ValueResult(String&& value) :
- _result(true),
- _value(std::move(value))
- {}
-
- template <typename T>
- ValueResult& operator=(T&& value) {
- if (!_result) {
- _result = true;
- _value = std::forward<T>(value);
- }
-
- return *this;
- }
-
- explicit operator bool() const {
- return _result;
- }
-
- String get() && {
- auto moved = std::move(_value);
- _result = false;
- return moved;
- }
-
- const String& ref() const {
- return _value;
- }
-
- const char* c_str() const {
- return _value.c_str();
- }
-
- size_t length() const {
- return _value.length();
- }
-
- private:
- bool _result { false };
- String _value;
- };
-
- } // namespace settings
|