Anklang-0.3.0.dev886+g785567a1 anklang-0.3.0.dev886+g785567a1
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
46void register_ase_obj (VirtualBase *ase_impl, tracktion::Selectable &selectable);
48void unregister_ase_obj (VirtualBase *ase_impl, tracktion::Selectable *selectable);
50VirtualBase* find_ase_obj_virtual_base (tracktion::Selectable *selectable);
52template<typename AseType> inline AseType*
53find_ase_obj (tracktion::Selectable &selectable)
54{
55 return dynamic_cast<AseType*> (find_ase_obj_virtual_base (&selectable));
56}
58template<typename AseType> inline AseType*
59find_ase_obj (tracktion::Selectable *selectable)
60{
61 return selectable ? find_ase_obj<AseType> (*selectable) : nullptr;
62}
63
64} // Ase
Wrapper for juce::WeakReference<tracktion::Selectable>
Definition trkn-utils.hh:11
Mimick tracktion::engine::SafeSelectable<> for tracktion::Selectable descendants.
Definition trkn-utils.hh:27
The Anklang C++ API namespace.
Definition api.hh:8
void register_ase_obj(VirtualBase *ase_impl, tracktion::Selectable &selectable)
Helper: register AseImpl with a tracktion Selectable via ase_obj_.
Definition trkn-utils.cc:62
AseType * find_ase_obj(tracktion::Selectable &selectable)
Helper: lookup AseType from tracktion Selectable via ase_obj_.
Definition trkn-utils.hh:53
VirtualBase * find_ase_obj_virtual_base(tracktion::Selectable *selectable)
Helper: lookup Ase::VirtualBase from tracktion Selectable via ase_obj_.
Definition trkn-utils.cc:77
void unregister_ase_obj(VirtualBase *ase_impl, tracktion::Selectable *selectable)
Helper: unregister AseImpl from a tracktion Selectable (selectable may be nullptr)
Definition trkn-utils.cc:70
Common base type to allow casting between polymorphic classes.
Definition cxxaux.hh:221