Mercurial > foo_out_sdl
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
