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