Anklang-0.3.0.dev797+g4e3241f3 anklang-0.3.0.dev797+g4e3241f3
ASE — Anklang Sound Engine (C++)

« « « Anklang Documentation
Loading...
Searching...
No Matches
trkn-utils.hh
Go to the documentation of this file.
1 // This Source Code Form is licensed MPL-2.0: http://mozilla.org/MPL/2.0
2
3#pragma once
4#include <ase/trkn.hh>
5#include <unordered_map>
6#include <shared_mutex>
7
8namespace Ase {
9
11class SelectableBaseref final {
12 union { void *const align_; char mem_[sizeof (void*)]; };
13 void set (tracktion::Selectable*) noexcept;
14 void set (const SelectableBaseref&) noexcept;
15public:
16 tracktion::Selectable* get () const noexcept;
17 /*dtor*/ ~SelectableBaseref();
18 explicit SelectableBaseref();
19 SelectableBaseref (tracktion::Selectable *obj) : SelectableBaseref() { set (obj); }
20 SelectableBaseref (const SelectableBaseref &ref) : SelectableBaseref() { set (ref); }
21 SelectableBaseref& operator= (tracktion::Selectable *obj) { set (obj); return *this; }
22 SelectableBaseref& operator= (const SelectableBaseref &ref) { set (ref); return *this; }
23};
24
26template<typename SelectableType>
29public:
30 explicit SelectableWeakref () = default;
31 explicit SelectableWeakref (SelectableType *selectable) : base_ (selectable) {}
32 /*copy*/ SelectableWeakref (const SelectableWeakref &o) noexcept : base_ (o.base_) {}
33 SelectableType* get () const noexcept { return dynamic_cast<SelectableType*> (base_.get()); }
34 SelectableType* operator-> () const noexcept { return get(); }
35 SelectableWeakref& operator= (const SelectableWeakref &ref) { base_ = ref.base_; return *this; }
36 SelectableWeakref& operator= (SelectableType *obj) { base_ = obj; return *this; }
37 bool operator== (SelectableType *obj) const noexcept { return base_.get() == obj; }
38 bool operator!= (SelectableType *obj) const noexcept { return base_.get() != obj; }
39 bool operator== (std::nullptr_t) const noexcept { return base_.get() == nullptr; }
40 bool operator!= (std::nullptr_t) const noexcept { return base_.get() != nullptr; }
41 bool operator== (const SelectableWeakref &ref) const noexcept { return base_.get() == ref.base_.get(); }
42 bool operator!= (const SelectableWeakref &ref) const noexcept { return base_.get() != ref.base_.get(); }
43};
44
46class SelectableHandle : public virtual VirtualBase, private tracktion::SelectableListener {
48 static SelectableHandle* find_base_handle (tracktion::Selectable &selectable_obj);
49 void discard_selectable ();
50 void selectableObjectAboutToBeDeleted (tracktion::Selectable *object) override;
51 void selectableObjectChanged (tracktion::Selectable *object) override;
52public:
53 SelectableHandle (tracktion::Selectable &selectable_obj);
54 virtual ~SelectableHandle();
55 virtual void discarded ();
56 template<typename AseType> static AseType*
57 find_selectable_handle (tracktion::Selectable &selectable_obj)
58 {
59 SelectableHandle *handle = find_base_handle (selectable_obj);
60 return dynamic_cast<AseType*> (handle);
61 }
62};
63
64} // Ase
Wrapper for juce::WeakReference<tracktion::Selectable>
Definition trkn-utils.hh:11
Ase handle object for tracktion engine objects.
Definition trkn-utils.hh:46
Mimick tracktion::engine::SafeSelectable<> for tracktion::Selectable descendants.
Definition trkn-utils.hh:27
The Anklang C++ API namespace.
Definition api.hh:9
Common base type to allow casting between polymorphic classes.
Definition cxxaux.hh:220