Vuo  2.0.0
VuoTriggerSet.hh
Go to the documentation of this file.
1 
10 #pragma once
11 
12 #include <set>
13 #include <dispatch/dispatch.h>
14 
20 template<typename TriggerDataType, typename TriggerContextType = void *>
22 {
23 public:
25  typedef void (*TriggerFunctionType)(TriggerDataType);
26 
27  VuoTriggerSet();
29 
30  void addTrigger(TriggerFunctionType trigger);
31  void addTrigger(TriggerFunctionType trigger, TriggerContextType context);
32  void removeTrigger(TriggerFunctionType trigger);
33  unsigned int size(void);
34 
35  void fire(TriggerDataType data);
36  void fire(void (^)(TriggerFunctionType trigger, TriggerContextType context));
37 
38 private:
39  dispatch_queue_t queue;
40  std::set<TriggerFunctionType> triggers;
41  std::set< std::pair<TriggerFunctionType, TriggerContextType> > triggersWithContext;
42 };
43 
47 template<typename TriggerDataType, typename TriggerContextType>
49 {
50  this->queue = dispatch_queue_create("VuoTriggerSet", NULL);
51 }
52 
56 template<typename TriggerDataType, typename TriggerContextType>
58 {
59 #if !__has_feature(objc_arc)
60  dispatch_release(this->queue);
61 #endif
62 }
63 
69 template<typename TriggerDataType, typename TriggerContextType>
71 {
72  dispatch_sync(queue, ^{
73  triggers.insert(trigger);
74  });
75 }
76 
82 template<typename TriggerDataType, typename TriggerContextType>
83 void VuoTriggerSet<TriggerDataType, TriggerContextType>::addTrigger(TriggerFunctionType trigger, TriggerContextType context)
84 {
85  dispatch_sync(queue, ^{
86  triggersWithContext.insert(std::make_pair(trigger, context));
87  });
88 }
89 
95 template<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 
114 template<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 
129 template<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 
143 template<typename TriggerDataType, typename TriggerContextType>
144 void 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 }