2#include "trkn/tracktion.hh"
17template<
size_t N>
static JuceWeakReference_Selectable&
18juce_weak_reference_selectable (
const char (&mem)[N])
20 static_assert (N ==
sizeof (JuceWeakReference_Selectable));
21 return *
reinterpret_cast<JuceWeakReference_Selectable*
> (
const_cast<char*
> (mem));
24SelectableBaseref::SelectableBaseref()
26 static_assert (
sizeof (mem_) ==
sizeof (JuceWeakReference_Selectable));
27 JuceWeakReference_Selectable *
const weakref =
new (mem_) JuceWeakReference_Selectable (
nullptr);
31SelectableBaseref::~SelectableBaseref()
33 JuceWeakReference_Selectable &weakref = juce_weak_reference_selectable (mem_);
34 weakref.~JuceWeakReference_Selectable();
38SelectableBaseref::get () const noexcept
40 JuceWeakReference_Selectable &weakref = juce_weak_reference_selectable (mem_);
45SelectableBaseref::set (tracktion::Selectable *selectable)
noexcept
47 JuceWeakReference_Selectable &weakref = juce_weak_reference_selectable (mem_);
52SelectableBaseref::set (
const SelectableBaseref &other)
noexcept
54 JuceWeakReference_Selectable &weakref = juce_weak_reference_selectable (mem_);
55 const JuceWeakReference_Selectable &otherref = juce_weak_reference_selectable (other.mem_);
62static SelectableHandleMap&
63selectable_handle_map()
65 static SelectableHandleMap *map = [] {
return new SelectableHandleMap(); } ();
70SelectableHandle::find_base_handle (tracktion::Selectable &selectable_obj)
72 SelectableHandleMap &map = selectable_handle_map();
73 auto it = map.find (&selectable_obj);
74 return it != map.end() ? it->second :
nullptr;
77SelectableHandle::SelectableHandle (tracktion::Selectable &selectable_obj)
79 SelectableHandleMap &map = selectable_handle_map();
80 if (tracktion::Selectable::isSelectableValid (&selectable_obj)) {
81 selectable_ = &selectable_obj;
82 selectable_obj.addListener (
this);
83 map[&selectable_obj] =
this;
87SelectableHandle::~SelectableHandle()
93SelectableHandle::discard_selectable()
95 tracktion::Selectable *selectable = selectable_.get();
97 SelectableHandleMap &map = selectable_handle_map();
98 auto it = map.find (selectable);
99 if (it != map.end()) {
101 if (tracktion::Selectable::isSelectableValid (selectable))
102 selectable->removeListener (
this);
104 selectable_ =
nullptr;
108SelectableHandle::selectableObjectAboutToBeDeleted (tracktion::Selectable *selectable)
110 if (this_thread_is_main()) {
111 warning (
"TODO: verify this branch is reached");
112 discard_selectable();
115 const SelectableHandle *handle =
this;
117 warning (
"TODO: verify this lambda is reached");
119 SelectableHandleMap &map = selectable_handle_map();
120 auto it = map.find (selectable);
121 if (it != map.end() &&
122 it->second == handle)
123 const_cast<SelectableHandle*
> (handle)->discard_selectable();
129SelectableHandle::selectableObjectChanged (tracktion::Selectable *
object)
133SelectableHandle::discarded ()
#define assert_return(expr,...)
Return from the current function if expr is unmet and issue an assertion warning.
#define return_unless(cond,...)
Return silently if cond does not evaluate to true with return value ...
The Anklang C++ API namespace.
JobQueue main_jobs(call_main_loop)
Execute a job callback in the event loop.