|
1
|
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 |