Mercurial > foo_out_sdl
diff foosdk/sdk/foobar2000/helpers/cfg_obj.h @ 1:20d02a178406 default tip
*: check in everything else
yay
| author | Paper <paper@tflc.us> |
|---|---|
| date | Mon, 05 Jan 2026 02:15:46 -0500 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/foosdk/sdk/foobar2000/helpers/cfg_obj.h Mon Jan 05 02:15:46 2026 -0500 @@ -0,0 +1,72 @@ +#pragma once + +#include <SDK/cfg_var.h> +#if FOOBAR2020 +#include <SDK/configStore.h> +#include <mutex> + +namespace cfg_var_modern { + template<typename obj_t> + class cfg_obj : public cfg_var_common { + public: + cfg_obj(const GUID& id) : cfg_var_common(id), m_initVal() {} + template<typename arg_t> + cfg_obj(const GUID& id, arg_t&& v) : cfg_var_common(id), m_initVal(std::forward<arg_t>(v)) {} + + obj_t get() { + init(); + PFC_INSYNC_READ(m_sync); + return m_val; + } + template<typename arg_t> + void set(arg_t&& arg) { + init(); + PFC_INSYNC_WRITE(m_sync); + m_val = std::forward<arg_t>(arg); + save(); + } + template<typename arg_t> + void operator=(arg_t&& arg) { + set(std::forward<arg_t>(arg)); + } + private: +#ifdef FOOBAR2000_HAVE_CFG_VAR_LEGACY + void set_data_raw(stream_reader* p_stream, t_size p_sizehint, abort_callback& p_abort) override { + obj_t o; + try { + stream_reader_formatter<> fmt(*p_stream, p_abort); + fmt >> o; + } catch (...) { return; } + set(std::move(o)); + } +#endif + void save() { + // already in write sync + stream_writer_formatter_simple<> out; + out << this->m_val; + fb2k::configStore::get()->setConfigBlob(formatName(), out.m_buffer.get_ptr(), out.m_buffer.get_size()); + } + void init() { + std::call_once(m_init, [this] { + obj_t v = m_initVal; + auto blob = fb2k::configStore::get()->getConfigBlob(formatName(), nullptr); + if (blob.is_valid()) { + try { + stream_reader_formatter_simple<> source(blob->data(), blob->size()); + source >> v; + } catch (...) { + v = m_initVal; // revert + } + } + PFC_INSYNC_WRITE(m_sync); + m_val = std::move(v); + }); + } + + pfc::readWriteLock m_sync; + obj_t m_val; + obj_t m_initVal; + std::once_flag m_init; + }; +} +#endif // FOOBAR2020 \ No newline at end of file
