diff foosdk/sdk/foobar2000/helpers/CallForwarder.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/CallForwarder.h	Mon Jan 05 02:15:46 2026 -0500
@@ -0,0 +1,60 @@
+#pragma once
+#include "callInMainThreadHelper.h"
+namespace CF {
+	template<typename obj_t, typename arg_t> class _inMainThread : public main_thread_callback {
+	public:
+		_inMainThread(obj_t const & obj, const arg_t & arg) : m_obj(obj), m_arg(arg) {}
+		
+		void callback_run() {
+			if (m_obj.IsValid()) callInMainThread::callThis(&*m_obj, m_arg);
+		}
+	private:
+		obj_t m_obj;
+		arg_t m_arg;
+	};
+
+	template<typename TWhat> class CallForwarder {
+	private:
+		CallForwarder() = delete;
+	protected:
+		CallForwarder(TWhat * ptr) : m_ptr(pfc::rcnew_t<TWhat*>(ptr)) {}
+		void Orphan() { 
+			*m_ptr = NULL; 
+		}
+	public:
+		bool IsValid() const { 
+			PFC_ASSERT( m_ptr.is_valid() );
+			return m_ptr.is_valid() && *m_ptr != NULL; 
+		}
+		bool IsEmpty() const { return !IsValid(); }
+
+		TWhat * operator->() const {
+			PFC_ASSERT( IsValid() );
+			return *m_ptr;
+		}
+
+		TWhat & operator*() const {
+			PFC_ASSERT( IsValid() );
+			return **m_ptr;
+		}
+
+		template<typename arg_t>
+		void callInMainThread(const arg_t & arg) {
+			main_thread_callback_add( new service_impl_t<_inMainThread< CallForwarder<TWhat>, arg_t> >(*this, arg) );
+		}
+	private:
+		const pfc::rcptr_t<TWhat*> m_ptr;
+	};
+
+	template<typename TWhat> class CallForwarderMaster : public CallForwarder<TWhat> {
+	public:
+		CallForwarderMaster(TWhat * ptr) : CallForwarder<TWhat>(ptr) {PFC_ASSERT(ptr!=NULL);}
+		~CallForwarderMaster() { this->Orphan(); }
+		using CallForwarder<TWhat>::Orphan;
+	private:
+		CallForwarderMaster() = delete;
+		CallForwarderMaster( const CallForwarderMaster<TWhat> & ) = delete;
+		void operator=( const CallForwarderMaster & ) = delete;
+	};
+
+}
\ No newline at end of file