annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "callInMainThreadHelper.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 namespace CF {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 template<typename obj_t, typename arg_t> class _inMainThread : public main_thread_callback {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 _inMainThread(obj_t const & obj, const arg_t & arg) : m_obj(obj), m_arg(arg) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 void callback_run() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 if (m_obj.IsValid()) callInMainThread::callThis(&*m_obj, m_arg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 obj_t m_obj;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 arg_t m_arg;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 template<typename TWhat> class CallForwarder {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 CallForwarder() = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 CallForwarder(TWhat * ptr) : m_ptr(pfc::rcnew_t<TWhat*>(ptr)) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 void Orphan() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 *m_ptr = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 bool IsValid() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 PFC_ASSERT( m_ptr.is_valid() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 return m_ptr.is_valid() && *m_ptr != NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 bool IsEmpty() const { return !IsValid(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 TWhat * operator->() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 PFC_ASSERT( IsValid() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 return *m_ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 TWhat & operator*() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 PFC_ASSERT( IsValid() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 return **m_ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 template<typename arg_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 void callInMainThread(const arg_t & arg) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 main_thread_callback_add( new service_impl_t<_inMainThread< CallForwarder<TWhat>, arg_t> >(*this, arg) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 const pfc::rcptr_t<TWhat*> m_ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 template<typename TWhat> class CallForwarderMaster : public CallForwarder<TWhat> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 CallForwarderMaster(TWhat * ptr) : CallForwarder<TWhat>(ptr) {PFC_ASSERT(ptr!=NULL);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 ~CallForwarderMaster() { this->Orphan(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 using CallForwarder<TWhat>::Orphan;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 CallForwarderMaster() = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 CallForwarderMaster( const CallForwarderMaster<TWhat> & ) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 void operator=( const CallForwarderMaster & ) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 }