|
1
|
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 } |