13 #include <dispatch/dispatch.h>
20 template<
typename TriggerDataType,
typename TriggerContextType =
void *>
35 void fire(TriggerDataType data);
39 dispatch_queue_t queue;
40 std::set<TriggerFunctionType> triggers;
41 std::set< std::pair<TriggerFunctionType, TriggerContextType> > triggersWithContext;
47 template<
typename TriggerDataType,
typename TriggerContextType>
50 this->queue = dispatch_queue_create(
"VuoTriggerSet", NULL);
56 template<
typename TriggerDataType,
typename TriggerContextType>
59 #if !__has_feature(objc_arc)
60 dispatch_release(this->queue);
69 template<
typename TriggerDataType,
typename TriggerContextType>
72 dispatch_sync(queue, ^{
73 triggers.insert(trigger);
82 template<
typename TriggerDataType,
typename TriggerContextType>
85 dispatch_sync(queue, ^{
86 triggersWithContext.insert(std::make_pair(trigger, context));
95 template<
typename TriggerDataType,
typename TriggerContextType>
98 dispatch_sync(queue, ^{
99 triggers.erase(trigger);
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++);
114 template<
typename TriggerDataType,
typename TriggerContextType>
117 __block
unsigned int size;
118 dispatch_sync(queue, ^{
119 size = triggers.size() + triggersWithContext.size();
129 template<
typename TriggerDataType,
typename TriggerContextType>
132 dispatch_sync(queue, ^{
133 for (
typename std::set<TriggerFunctionType>::iterator it = triggers.begin(); it != triggers.end(); ++it)
143 template<
typename TriggerDataType,
typename TriggerContextType>
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);