#pragma once namespace CF { template 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 class CallForwarder { private: CallForwarder() = delete; protected: CallForwarder(TWhat * ptr) : m_ptr(pfc::rcnew_t(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 void callInMainThread(const arg_t & arg) { main_thread_callback_add( new service_impl_t<_inMainThread< CallForwarder, arg_t> >(*this, arg) ); } private: const pfc::rcptr_t m_ptr; }; template class CallForwarderMaster : public CallForwarder { public: CallForwarderMaster(TWhat * ptr) : CallForwarder(ptr) {PFC_ASSERT(ptr!=NULL);} ~CallForwarderMaster() { this->Orphan(); } using CallForwarder::Orphan; private: CallForwarderMaster() = delete; CallForwarderMaster( const CallForwarderMaster & ) = delete; void operator=( const CallForwarderMaster & ) = delete; }; }