Vuo 2.4.2
Loading...
Searching...
No Matches
VuoTriggerSet.hh
Go to the documentation of this file.
1
10#pragma once
11
12#include <set>
13#include <dispatch/dispatch.h>
14
20template<typename TriggerDataType, typename TriggerContextType = void *>
22{
23public:
25 typedef void (*TriggerFunctionType)(TriggerDataType);
26
29
31 void addTrigger(TriggerFunctionType trigger, TriggerContextType context);
33 unsigned int size(void);
34
35 void fire(TriggerDataType data);
36 void fire(void (^)(TriggerFunctionType trigger, TriggerContextType context));
37
38private:
39 dispatch_queue_t queue;
40 std::set<TriggerFunctionType> triggers;
41 std::set< std::pair<TriggerFunctionType, TriggerContextType> > triggersWithContext;
42};
43
47template<typename TriggerDataType, typename TriggerContextType>
49{
50 this->queue = dispatch_queue_create("VuoTriggerSet", NULL);
51}
52
56template<typename TriggerDataType, typename TriggerContextType>
58{
59#if !__has_feature(objc_arc)
60 dispatch_release(this->queue);
61#endif
62}
63
69template<typename TriggerDataType, typename TriggerContextType>
71{
72 dispatch_sync(queue, ^{
73 triggers.insert(trigger);
74 });
75}
76
82template<typename TriggerDataType, typename TriggerContextType>
83void VuoTriggerSet<TriggerDataType, TriggerContextType>::addTrigger(TriggerFunctionType trigger, TriggerContextType context)
84{
85 dispatch_sync(queue, ^{
86 triggersWithContext.insert(std::make_pair(trigger, context));
87 });
88}
89
95template<typename TriggerDataType, typename TriggerContextType>
97{
98 dispatch_sync(queue, ^{
99 triggers.erase(trigger);
100
101 for (typename std::set< std::pair<TriggerFunctionType, TriggerContextType> >::iterator it = triggersWithContext.begin(); it != triggersWithContext.end(); )
102 if (it->first == trigger)
103 triggersWithContext.erase(it++);
104 else
105 ++it;
106 });
107}
108
114template<typename TriggerDataType, typename TriggerContextType>
116{
117 __block unsigned int size;
118 dispatch_sync(queue, ^{
119 size = triggers.size() + triggersWithContext.size();
120 });
121 return size;
122}
123
129template<typename TriggerDataType, typename TriggerContextType>
131{
132 dispatch_sync(queue, ^{
133 for (typename std::set<TriggerFunctionType>::iterator it = triggers.begin(); it != triggers.end(); ++it)
134 (*it)(data);
135 });
136}
137
143template<typename TriggerDataType, typename TriggerContextType>
144void VuoTriggerSet<TriggerDataType, TriggerContextType>::fire(void (^block)(TriggerFunctionType trigger, TriggerContextType context))
145{
146 dispatch_sync(queue, ^{
147 for (typename std::set< std::pair<TriggerFunctionType, TriggerContextType> >::iterator it = triggersWithContext.begin(); it != triggersWithContext.end(); ++it)
148 block(it->first, it->second);
149 });
150}