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