Mercurial > foo_out_sdl
comparison 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 |
comparison
equal
deleted
inserted
replaced
| 0:e9bb126753e7 | 1:20d02a178406 |
|---|---|
| 1 #pragma once | |
| 2 #include "callInMainThreadHelper.h" | |
| 3 namespace CF { | |
| 4 template<typename obj_t, typename arg_t> class _inMainThread : public main_thread_callback { | |
| 5 public: | |
| 6 _inMainThread(obj_t const & obj, const arg_t & arg) : m_obj(obj), m_arg(arg) {} | |
| 7 | |
| 8 void callback_run() { | |
| 9 if (m_obj.IsValid()) callInMainThread::callThis(&*m_obj, m_arg); | |
| 10 } | |
| 11 private: | |
| 12 obj_t m_obj; | |
| 13 arg_t m_arg; | |
| 14 }; | |
| 15 | |
| 16 template<typename TWhat> class CallForwarder { | |
| 17 private: | |
| 18 CallForwarder() = delete; | |
| 19 protected: | |
| 20 CallForwarder(TWhat * ptr) : m_ptr(pfc::rcnew_t<TWhat*>(ptr)) {} | |
| 21 void Orphan() { | |
| 22 *m_ptr = NULL; | |
| 23 } | |
| 24 public: | |
| 25 bool IsValid() const { | |
| 26 PFC_ASSERT( m_ptr.is_valid() ); | |
| 27 return m_ptr.is_valid() && *m_ptr != NULL; | |
| 28 } | |
| 29 bool IsEmpty() const { return !IsValid(); } | |
| 30 | |
| 31 TWhat * operator->() const { | |
| 32 PFC_ASSERT( IsValid() ); | |
| 33 return *m_ptr; | |
| 34 } | |
| 35 | |
| 36 TWhat & operator*() const { | |
| 37 PFC_ASSERT( IsValid() ); | |
| 38 return **m_ptr; | |
| 39 } | |
| 40 | |
| 41 template<typename arg_t> | |
| 42 void callInMainThread(const arg_t & arg) { | |
| 43 main_thread_callback_add( new service_impl_t<_inMainThread< CallForwarder<TWhat>, arg_t> >(*this, arg) ); | |
| 44 } | |
| 45 private: | |
| 46 const pfc::rcptr_t<TWhat*> m_ptr; | |
| 47 }; | |
| 48 | |
| 49 template<typename TWhat> class CallForwarderMaster : public CallForwarder<TWhat> { | |
| 50 public: | |
| 51 CallForwarderMaster(TWhat * ptr) : CallForwarder<TWhat>(ptr) {PFC_ASSERT(ptr!=NULL);} | |
| 52 ~CallForwarderMaster() { this->Orphan(); } | |
| 53 using CallForwarder<TWhat>::Orphan; | |
| 54 private: | |
| 55 CallForwarderMaster() = delete; | |
| 56 CallForwarderMaster( const CallForwarderMaster<TWhat> & ) = delete; | |
| 57 void operator=( const CallForwarderMaster & ) = delete; | |
| 58 }; | |
| 59 | |
| 60 } |
