Mercurial > foo_out_sdl
comparison 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 |
comparison
equal
deleted
inserted
replaced
| 0:e9bb126753e7 | 1:20d02a178406 |
|---|---|
| 1 #pragma once | |
| 2 | |
| 3 #include <SDK/cfg_var.h> | |
| 4 #if FOOBAR2020 | |
| 5 #include <SDK/configStore.h> | |
| 6 #include <mutex> | |
| 7 | |
| 8 namespace cfg_var_modern { | |
| 9 template<typename obj_t> | |
| 10 class cfg_obj : public cfg_var_common { | |
| 11 public: | |
| 12 cfg_obj(const GUID& id) : cfg_var_common(id), m_initVal() {} | |
| 13 template<typename arg_t> | |
| 14 cfg_obj(const GUID& id, arg_t&& v) : cfg_var_common(id), m_initVal(std::forward<arg_t>(v)) {} | |
| 15 | |
| 16 obj_t get() { | |
| 17 init(); | |
| 18 PFC_INSYNC_READ(m_sync); | |
| 19 return m_val; | |
| 20 } | |
| 21 template<typename arg_t> | |
| 22 void set(arg_t&& arg) { | |
| 23 init(); | |
| 24 PFC_INSYNC_WRITE(m_sync); | |
| 25 m_val = std::forward<arg_t>(arg); | |
| 26 save(); | |
| 27 } | |
| 28 template<typename arg_t> | |
| 29 void operator=(arg_t&& arg) { | |
| 30 set(std::forward<arg_t>(arg)); | |
| 31 } | |
| 32 private: | |
| 33 #ifdef FOOBAR2000_HAVE_CFG_VAR_LEGACY | |
| 34 void set_data_raw(stream_reader* p_stream, t_size p_sizehint, abort_callback& p_abort) override { | |
| 35 obj_t o; | |
| 36 try { | |
| 37 stream_reader_formatter<> fmt(*p_stream, p_abort); | |
| 38 fmt >> o; | |
| 39 } catch (...) { return; } | |
| 40 set(std::move(o)); | |
| 41 } | |
| 42 #endif | |
| 43 void save() { | |
| 44 // already in write sync | |
| 45 stream_writer_formatter_simple<> out; | |
| 46 out << this->m_val; | |
| 47 fb2k::configStore::get()->setConfigBlob(formatName(), out.m_buffer.get_ptr(), out.m_buffer.get_size()); | |
| 48 } | |
| 49 void init() { | |
| 50 std::call_once(m_init, [this] { | |
| 51 obj_t v = m_initVal; | |
| 52 auto blob = fb2k::configStore::get()->getConfigBlob(formatName(), nullptr); | |
| 53 if (blob.is_valid()) { | |
| 54 try { | |
| 55 stream_reader_formatter_simple<> source(blob->data(), blob->size()); | |
| 56 source >> v; | |
| 57 } catch (...) { | |
| 58 v = m_initVal; // revert | |
| 59 } | |
| 60 } | |
| 61 PFC_INSYNC_WRITE(m_sync); | |
| 62 m_val = std::move(v); | |
| 63 }); | |
| 64 } | |
| 65 | |
| 66 pfc::readWriteLock m_sync; | |
| 67 obj_t m_val; | |
| 68 obj_t m_initVal; | |
| 69 std::once_flag m_init; | |
| 70 }; | |
| 71 } | |
| 72 #endif // FOOBAR2020 |
