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