diff options
Diffstat (limited to 'options/group.hpp')
-rw-r--r-- | options/group.hpp | 102 |
1 files changed, 24 insertions, 78 deletions
diff --git a/options/group.hpp b/options/group.hpp index c933b134..11bab965 100644 --- a/options/group.hpp +++ b/options/group.hpp @@ -1,93 +1,39 @@ #pragma once +#include "options/defs.hpp" + +#include "compat/base-path.hpp" +#include "compat/library-path.hpp" +#include "compat/macros.h" +#include "compat/qhash.hpp" #include "export.hpp" -// included here to propagate into callers of options::group -#include "metatype.hpp" +#include <optional> +#include <unordered_map> -#include <map> -#include <memory> #include <QString> -#include <QList> #include <QVariant> -#include <QSettings> -#include <QMutex> - -namespace options { - -// snapshot of qsettings group at given time -class OTR_OPTIONS_EXPORT group final -{ - QString name; - - static QString cur_ini_pathname; - - static std::shared_ptr<QSettings> cur_ini; - static int ini_refcount; - static bool ini_modifiedp; - static QMutex cur_ini_mtx; - - static std::shared_ptr<QSettings> cur_global_ini; - static int global_ini_refcount; - static bool global_ini_modifiedp; - static QMutex global_ini_mtx; - - struct OTR_OPTIONS_EXPORT saver_ final - { - QSettings& s; - int& refcount; - bool& modifiedp; - - never_inline ~saver_(); - never_inline saver_(QSettings& s, int& refcount, bool& modifiedp); - }; - static std::shared_ptr<QSettings> cur_settings_object(); - static std::shared_ptr<QSettings> cur_global_settings_object(); -public: - std::map<QString, QVariant> kvs; - group(const QString& name); - void save() const; - void put(const QString& s, const QVariant& d); - bool contains(const QString& s) const; - static QString ini_directory(); - static QString ini_filename(); - static QString ini_pathname(); - static QString ini_combine(const QString& filename); - static QStringList ini_list(); - static bool is_portable_installation(); +#include <QDebug> - static void mark_ini_modified(); +// XXX TODO remove qsettings usage -sh 20180624 - template<typename t> - never_inline - t get(const QString& k) const +namespace options::detail { + // snapshot of qsettings group at given time + class OTR_OPTIONS_EXPORT group final { - auto value = kvs.find(k); - if (value != kvs.cend()) - return value->second.value<t>(); - return t(); - } + QString name; - template<typename F> - never_inline - static auto with_settings_object(F&& fun) - { - QMutexLocker l(&cur_ini_mtx); - saver_ saver { *cur_settings_object(), ini_refcount, ini_modifiedp }; + public: + std::unordered_map<QString, QVariant> kvs; + explicit group(const QString& name); + void save() const; + void put(const QString& s, const QVariant& d); + void put(const QString& s, QVariant&& d); + bool contains(const QString& s) const; - return fun(saver.s); - } - - template<typename F> - static auto with_global_settings_object(F&& fun) - { - QMutexLocker l(&global_ini_mtx); - saver_ saver { *cur_global_settings_object(), global_ini_refcount, global_ini_modifiedp }; - global_ini_modifiedp = true; + never_inline QVariant get_variant(const QString& name) const; + }; +} // ns options::detail - return fun(saver.s); - } -}; -} |