29#include "Identified.h"
38# pragma warning(disable: 4250)
56 struct Plug : Identified<Plug>
59 virtual const char*
TypeName() const noexcept = 0;
114 virtual
void Remove() noexcept = 0;
116 friend class Jack_Imp;
118 virtual
void Pulse(
bool ) noexcept{}
120 virtual void Release() noexcept{}
122 virtual void ConnectTo( Jack& )
noexcept{}
125 dclspc
const Plug* GetFirstNonZeroIDPlugInChain(
const Plug& plug );
133 struct PlugEnumerator{
137 typedef PlugEnumerator collection_type;
138 typedef Plug value_type;
147 Plug& GetPlug(
int idx ){
151 const Plug& GetPlug(
int idx )
const{
160 virtual ~PlugEnumerator() =
default;
162 PlugEnumerator(
const PlugEnumerator& ) =
default;
163 PlugEnumerator( PlugEnumerator&& ) =
default;
164 PlugEnumerator& operator=(
const PlugEnumerator& ) =
default;
165 PlugEnumerator& operator=( PlugEnumerator&& ) =
default;
166 PlugEnumerator() =
default;
179 template<
class EnumeratorType,
180 class PointerType =
Plug*,
181 class ReferenceType =
Plug&>
184 using iterator_category = std::random_access_iterator_tag;
185 using value_type =
Plug;
186 using difference_type = ptrdiff_t;
187 using pointer = PointerType;
188 using reference = ReferenceType;
192 : m_Container( Container ),
193 m_IndexCurrent( bEnd ? Container.CountPlugs() : 0 )
209 ReferenceType operator*()
const{
210 return m_Container.GetPlug( m_IndexCurrent );
224 ReferenceType operator[](
int n )
const{
225 return m_Container.GetPlug( m_IndexCurrent + n );
228 ReferenceType operator->()
const{
229 return m_Container.GetPlug( m_IndexCurrent );
232 bool operator==(
const PlugIterator& iter )
const noexcept{
233 assert( &m_Container == &iter.m_Container );
234 return m_IndexCurrent == iter.m_IndexCurrent;
237 bool operator!=(
const PlugIterator& iter )
const noexcept{
238 assert( &m_Container == &iter.m_Container );
239 return m_IndexCurrent != iter.m_IndexCurrent;
242 bool operator<(
const PlugIterator& iter )
const noexcept{
243 assert( &m_Container == &iter.m_Container );
244 return m_IndexCurrent < iter.m_IndexCurrent;
247 bool operator<=(
const PlugIterator& iter )
const noexcept{
248 assert( &m_Container == &iter.m_Container );
249 return m_IndexCurrent <= iter.m_IndexCurrent;
252 bool operator>(
const PlugIterator& iter )
const noexcept{
253 assert( &m_Container == &iter.m_Container );
254 return m_IndexCurrent > iter.m_IndexCurrent;
257 bool operator>=(
const PlugIterator& iter )
const noexcept{
258 assert( &m_Container == &iter.m_Container );
259 return m_IndexCurrent >= iter.m_IndexCurrent;
262 void operator+=(
int n )
noexcept{
266 void operator-=(
int n )
noexcept{
272 iter.m_IndexCurrent += n;
277 iter.m_IndexCurrent -= n;
281 EnumeratorType& m_Container;
337 public JackEnumerator {
340 Plug_Imp(
const Plug_Imp& plug) =
delete;
341 dclspc Plug_Imp(Plug_Imp&& plug)
noexcept;
345 dclspc ~Plug_Imp()
noexcept;
357 Plug_Imp& operator=(Plug_Imp&) =
delete;
358 Plug_Imp& operator=(Plug_Imp&& plug) =
delete;
366 const std::string&
Reference(
const std::string& name)
const override {
367 return ObjectID_Imp<Plug>::Reference(name);
373 return ObjectID_Imp<Plug>::ID();
390 dclspc
void Remove() noexcept;
398 dclspc
void Pulse(
bool bForewardToJack) noexcept override;
400 dclspc const
Jack& _GetJack(
int idx) const override;
402 friend class Jack_Imp;
404 dclspc
void Release() noexcept override;
406 dclspc
void ConnectTo(
Jack& jack) noexcept override;
409 Jack_Imp m_JackOnPulse{
"JackOnPulse" };
414 template<
class ParentType>
415 class Plug_Imp_Parent :
public Plug_Imp {
417 ParentType& m_Parent;
419 Plug_Imp_Parent() =
delete;
420 Plug_Imp_Parent(
const Plug_Imp_Parent& plug) =
delete;
421 Plug_Imp_Parent(Plug_Imp_Parent&& plug) =
default;
422 Plug_Imp_Parent(ParentType& parent)
423 : Plug_Imp{ parent },
426 Plug_Imp_Parent(ParentType& parent, Plug_Imp_Parent&& plug)
427 : Plug_Imp{ parent,std::move(plug) },
436 template<
class ParentType>
437 class Plug_Imp_ParentPointer :
public Plug_Imp_Parent<ParentType> {
438#if defined(_MSC_VER) && !defined(_WIN64)
439# pragma pack(push, 4)
441 void (ParentType::* m_pPulseFunction)() =
nullptr;
442#if defined(_MSC_VER) && !defined(_WIN64)
446 using TargetType = ParentType;
448 Plug_Imp_ParentPointer() =
delete;
449 Plug_Imp_ParentPointer(
const Plug_Imp_ParentPointer& plug) =
delete;
450 Plug_Imp_ParentPointer(Plug_Imp_ParentPointer&& plug) =
default;
452 Plug_Imp_ParentPointer(ParentType& parent,
void (ParentType::* pPulseFunction)()
noexcept )
453 : Plug_Imp_Parent<ParentType>{ parent },
454 m_pPulseFunction{ pPulseFunction }
457 assert(m_pPulseFunction);
459 Plug_Imp_ParentPointer(ParentType& parent,
void (ParentType::* pPulseFunction)()
noexcept, Plug_Imp_ParentPointer&& plug)
460 : Plug_Imp_Parent<ParentType>{ parent, std::move(plug) },
461 m_pPulseFunction{ pPulseFunction }
464 assert(m_pPulseFunction);
467 Plug_Imp_ParentPointer& operator=(
const Plug_Imp_ParentPointer&) =
delete;
468 Plug_Imp_ParentPointer& operator=(Plug_Imp_ParentPointer&&) =
delete;
470 void Pulse(
bool bForewardToJack)
noexcept override {
471 (Plug_Imp_Parent<ParentType>::m_Parent.*m_pPulseFunction)();
472 Plug_Imp_Parent<ParentType>::Pulse(bForewardToJack);
void Pulse(bool bForewardToJack) noexcept override
Triggers a pulse for the plug.
Definition Plug.h:470
dclspc void Pulse(bool bForewardToJack) noexcept override
Triggers a pulse for the plug.
dclspc bool IsCyclic() const noexcept override
dclspc Jack * Plugged() const noexcept override
Is this Plug already plugged into a jack?
dclspc PlugEnumerator & Parent() const noexcept override
dclspc const Plug & Tail() const override
receives the tail (last element) of a Plug chain.
dclspc int CountJacks() const noexcept override
IDType ID() const noexcept override
Definition Plug.h:372
const std::string & Reference(const std::string &name) const override
Gets a reference that was set for this object by name.
Definition Plug.h:366
dclspc Jack & JackOnPulse() noexcept override
Get a Jack that triggers a pulse if the Plug receives a pulse.
const char * TypeName() const noexcept override
Definition Plug.h:360
PlugIterator(EnumeratorType &Container, bool bEnd=false)
Construction.
Definition Plug.h:191
Namespace of all the trax track libraries classes and methods.
Definition Collection.h:17
Type used for IDs in the trax library.
Definition IDType.h:43
virtual IDType ID() const noexcept=0
virtual const std::string & Reference(const std::string &name) const=0
A jack a plug can get connected with.
Definition Jack.h:83
A MultiPlug provides a variable number of actual Plugs to one input slot.
Definition Plug.h:307
virtual Plug & Make(SocketRegistry *pRegistry=nullptr)=0
Creates a clone for the plug.
virtual void Release(Plug &plug)=0
Tells the MultiPlug that the plug clone is no longer needed.
virtual Plug & Unplugged(SocketRegistry *pRegistry=nullptr)=0
virtual void Clear()=0
Releases all the clone plugs.
Interface for enumerating the Plugs an object provides.
Definition Plug.h:133
virtual const Plug & _GetPlug(int idx) const =0
to be implemented for an object that provides plugs.
virtual int CountPlugs() const =0
A Plug of some object can get plugged into a jack of some object, specific to a certain event.
Definition Plug.h:57
virtual Jack & JackOnPulse() noexcept=0
Get a Jack that triggers a pulse if the Plug receives a pulse.
virtual bool IsCyclic() const noexcept=0
virtual const char * TypeName() const noexcept=0
virtual const Plug & Tail() const =0
receives the tail (last element) of a Plug chain.
virtual Jack * Plugged() const noexcept=0
Is this Plug already plugged into a jack?
virtual PlugEnumerator & Parent() const noexcept=0
Interface for a registry that reconnects Plugs and Jacks according to their IDs.
Definition SocketRegistry.h:40