openshot-audio  0.1.2
juce_ListenerList.h
Go to the documentation of this file.
1 /*
2  ==============================================================================
3 
4  This file is part of the JUCE library.
5  Copyright (c) 2015 - ROLI Ltd.
6 
7  Permission is granted to use this software under the terms of either:
8  a) the GPL v2 (or any later version)
9  b) the Affero GPL v3
10 
11  Details of these licenses can be found at: www.gnu.org/licenses
12 
13  JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
14  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
15  A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16 
17  ------------------------------------------------------------------------------
18 
19  To release a closed-source product which uses JUCE, commercial licenses are
20  available: visit www.juce.com for more information.
21 
22  ==============================================================================
23 */
24 
25 #ifndef JUCE_LISTENERLIST_H_INCLUDED
26 #define JUCE_LISTENERLIST_H_INCLUDED
27 
28 
29 //==============================================================================
67 template <class ListenerClass,
68  class ArrayType = Array<ListenerClass*> >
70 {
71  // Horrible macros required to support VC7..
72  #ifndef DOXYGEN
73  #if JUCE_VC8_OR_EARLIER
74  #define LL_TEMPLATE(a) typename P##a, typename Q##a
75  #define LL_PARAM(a) Q##a& param##a
76  #else
77  #define LL_TEMPLATE(a) typename P##a
78  #define LL_PARAM(a) PARAMETER_TYPE(P##a) param##a
79  #endif
80  #endif
81 
82 public:
83  //==============================================================================
86  {
87  }
88 
91  {
92  }
93 
94  //==============================================================================
100  void add (ListenerClass* const listenerToAdd)
101  {
102  // Listeners can't be null pointers!
103  jassert (listenerToAdd != nullptr);
104 
105  if (listenerToAdd != nullptr)
106  listeners.addIfNotAlreadyThere (listenerToAdd);
107  }
108 
112  void remove (ListenerClass* const listenerToRemove)
113  {
114  // Listeners can't be null pointers!
115  jassert (listenerToRemove != nullptr);
116 
117  listeners.removeFirstMatchingValue (listenerToRemove);
118  }
119 
121  int size() const noexcept
122  {
123  return listeners.size();
124  }
125 
127  bool isEmpty() const noexcept
128  {
129  return listeners.size() == 0;
130  }
131 
133  void clear()
134  {
135  listeners.clear();
136  }
137 
139  bool contains (ListenerClass* const listener) const noexcept
140  {
141  return listeners.contains (listener);
142  }
143 
144  //==============================================================================
146  void call (void (ListenerClass::*callbackFunction) ())
147  {
148  callChecked (static_cast <const DummyBailOutChecker&> (DummyBailOutChecker()), callbackFunction);
149  }
150 
153  template <class BailOutCheckerType>
154  void callChecked (const BailOutCheckerType& bailOutChecker,
155  void (ListenerClass::*callbackFunction) ())
156  {
157  for (Iterator<BailOutCheckerType, ThisType> iter (*this); iter.next (bailOutChecker);)
158  (iter.getListener()->*callbackFunction) ();
159  }
160 
161  //==============================================================================
163  template <LL_TEMPLATE(1)>
164  void call (void (ListenerClass::*callbackFunction) (P1), LL_PARAM(1))
165  {
166  for (Iterator<DummyBailOutChecker, ThisType> iter (*this); iter.next();)
167  (iter.getListener()->*callbackFunction) (param1);
168  }
169 
172  template <class BailOutCheckerType, LL_TEMPLATE(1)>
173  void callChecked (const BailOutCheckerType& bailOutChecker,
174  void (ListenerClass::*callbackFunction) (P1),
175  LL_PARAM(1))
176  {
177  for (Iterator<BailOutCheckerType, ThisType> iter (*this); iter.next (bailOutChecker);)
178  (iter.getListener()->*callbackFunction) (param1);
179  }
180 
181  //==============================================================================
183  template <LL_TEMPLATE(1), LL_TEMPLATE(2)>
184  void call (void (ListenerClass::*callbackFunction) (P1, P2),
185  LL_PARAM(1), LL_PARAM(2))
186  {
187  for (Iterator<DummyBailOutChecker, ThisType> iter (*this); iter.next();)
188  (iter.getListener()->*callbackFunction) (param1, param2);
189  }
190 
193  template <class BailOutCheckerType, LL_TEMPLATE(1), LL_TEMPLATE(2)>
194  void callChecked (const BailOutCheckerType& bailOutChecker,
195  void (ListenerClass::*callbackFunction) (P1, P2),
196  LL_PARAM(1), LL_PARAM(2))
197  {
198  for (Iterator<BailOutCheckerType, ThisType> iter (*this); iter.next (bailOutChecker);)
199  (iter.getListener()->*callbackFunction) (param1, param2);
200  }
201 
202  //==============================================================================
204  template <LL_TEMPLATE(1), LL_TEMPLATE(2), LL_TEMPLATE(3)>
205  void call (void (ListenerClass::*callbackFunction) (P1, P2, P3),
206  LL_PARAM(1), LL_PARAM(2), LL_PARAM(3))
207  {
208  for (Iterator<DummyBailOutChecker, ThisType> iter (*this); iter.next();)
209  (iter.getListener()->*callbackFunction) (param1, param2, param3);
210  }
211 
214  template <class BailOutCheckerType, LL_TEMPLATE(1), LL_TEMPLATE(2), LL_TEMPLATE(3)>
215  void callChecked (const BailOutCheckerType& bailOutChecker,
216  void (ListenerClass::*callbackFunction) (P1, P2, P3),
217  LL_PARAM(1), LL_PARAM(2), LL_PARAM(3))
218  {
219  for (Iterator<BailOutCheckerType, ThisType> iter (*this); iter.next (bailOutChecker);)
220  (iter.getListener()->*callbackFunction) (param1, param2, param3);
221  }
222 
223  //==============================================================================
225  template <LL_TEMPLATE(1), LL_TEMPLATE(2), LL_TEMPLATE(3), LL_TEMPLATE(4)>
226  void call (void (ListenerClass::*callbackFunction) (P1, P2, P3, P4),
227  LL_PARAM(1), LL_PARAM(2), LL_PARAM(3), LL_PARAM(4))
228  {
229  for (Iterator<DummyBailOutChecker, ThisType> iter (*this); iter.next();)
230  (iter.getListener()->*callbackFunction) (param1, param2, param3, param4);
231  }
232 
235  template <class BailOutCheckerType, LL_TEMPLATE(1), LL_TEMPLATE(2), LL_TEMPLATE(3), LL_TEMPLATE(4)>
236  void callChecked (const BailOutCheckerType& bailOutChecker,
237  void (ListenerClass::*callbackFunction) (P1, P2, P3, P4),
238  LL_PARAM(1), LL_PARAM(2), LL_PARAM(3), LL_PARAM(4))
239  {
240  for (Iterator<BailOutCheckerType, ThisType> iter (*this); iter.next (bailOutChecker);)
241  (iter.getListener()->*callbackFunction) (param1, param2, param3, param4);
242  }
243 
244  //==============================================================================
246  template <LL_TEMPLATE(1), LL_TEMPLATE(2), LL_TEMPLATE(3), LL_TEMPLATE(4), LL_TEMPLATE(5)>
247  void call (void (ListenerClass::*callbackFunction) (P1, P2, P3, P4, P5),
248  LL_PARAM(1), LL_PARAM(2), LL_PARAM(3), LL_PARAM(4), LL_PARAM(5))
249  {
250  for (Iterator<DummyBailOutChecker, ThisType> iter (*this); iter.next();)
251  (iter.getListener()->*callbackFunction) (param1, param2, param3, param4, param5);
252  }
253 
256  template <class BailOutCheckerType, LL_TEMPLATE(1), LL_TEMPLATE(2), LL_TEMPLATE(3), LL_TEMPLATE(4), LL_TEMPLATE(5)>
257  void callChecked (const BailOutCheckerType& bailOutChecker,
258  void (ListenerClass::*callbackFunction) (P1, P2, P3, P4, P5),
259  LL_PARAM(1), LL_PARAM(2), LL_PARAM(3), LL_PARAM(4), LL_PARAM(5))
260  {
261  for (Iterator<BailOutCheckerType, ThisType> iter (*this); iter.next (bailOutChecker);)
262  (iter.getListener()->*callbackFunction) (param1, param2, param3, param4, param5);
263  }
264 
265  //==============================================================================
267  template <LL_TEMPLATE(1), LL_TEMPLATE(2), LL_TEMPLATE(3), LL_TEMPLATE(4), LL_TEMPLATE(5), LL_TEMPLATE(6)>
268  void call (void (ListenerClass::*callbackFunction) (P1, P2, P3, P4, P5, P6),
269  LL_PARAM(1), LL_PARAM(2), LL_PARAM(3), LL_PARAM(4), LL_PARAM(5), LL_PARAM(6))
270  {
271  for (Iterator<DummyBailOutChecker, ThisType> iter (*this); iter.next();)
272  (iter.getListener()->*callbackFunction) (param1, param2, param3, param4, param5, param6);
273  }
274 
277  template <class BailOutCheckerType, LL_TEMPLATE(1), LL_TEMPLATE(2), LL_TEMPLATE(3), LL_TEMPLATE(4), LL_TEMPLATE(5), LL_TEMPLATE(6)>
278  void callChecked (const BailOutCheckerType& bailOutChecker,
279  void (ListenerClass::*callbackFunction) (P1, P2, P3, P4, P5, P6),
280  LL_PARAM(1), LL_PARAM(2), LL_PARAM(3), LL_PARAM(4), LL_PARAM(5), LL_PARAM(6))
281  {
282  for (Iterator<BailOutCheckerType, ThisType> iter (*this); iter.next (bailOutChecker);)
283  (iter.getListener()->*callbackFunction) (param1, param2, param3, param4, param5, param6);
284  }
285 
286 
287  //==============================================================================
292  {
293  public:
294  inline bool shouldBailOut() const noexcept { return false; }
295  };
296 
297  //==============================================================================
299  template <class BailOutCheckerType, class ListType>
300  class Iterator
301  {
302  public:
303  //==============================================================================
304  Iterator (const ListType& listToIterate) noexcept
305  : list (listToIterate), index (listToIterate.size())
306  {}
307 
309 
310  //==============================================================================
311  bool next() noexcept
312  {
313  if (index <= 0)
314  return false;
315 
316  const int listSize = list.size();
317 
318  if (--index < listSize)
319  return true;
320 
321  index = listSize - 1;
322  return index >= 0;
323  }
324 
325  bool next (const BailOutCheckerType& bailOutChecker) noexcept
326  {
327  return (! bailOutChecker.shouldBailOut()) && next();
328  }
329 
330  typename ListType::ListenerType* getListener() const noexcept
331  {
332  return list.getListeners().getUnchecked (index);
333  }
334 
335  //==============================================================================
336  private:
337  const ListType& list;
338  int index;
339 
341  };
342 
344  typedef ListenerClass ListenerType;
345 
346  const ArrayType& getListeners() const noexcept { return listeners; }
347 
348 private:
349  //==============================================================================
350  ArrayType listeners;
351 
353 
354  #undef LL_TEMPLATE
355  #undef LL_PARAM
356 };
357 
358 
359 #endif // JUCE_LISTENERLIST_H_INCLUDED
#define LL_PARAM(a)
Definition: juce_events.h:79
void call(void(ListenerClass::*callbackFunction)(P1, P2, P3, P4, P5), LL_PARAM(1), LL_PARAM(2), LL_PARAM(3), LL_PARAM(4), LL_PARAM(5))
Definition: juce_ListenerList.h:247
bool next() noexcept
Definition: juce_ListenerList.h:311
#define noexcept
Definition: juce_CompilerSupport.h:141
const ArrayType & getListeners() const noexcept
Definition: juce_ListenerList.h:346
void callChecked(const BailOutCheckerType &bailOutChecker, void(ListenerClass::*callbackFunction)(P1, P2, P3, P4, P5, P6), LL_PARAM(1), LL_PARAM(2), LL_PARAM(3), LL_PARAM(4), LL_PARAM(5), LL_PARAM(6))
Definition: juce_ListenerList.h:278
void call(void(ListenerClass::*callbackFunction)(P1), LL_PARAM(1))
Definition: juce_ListenerList.h:164
ListType::ListenerType * getListener() const noexcept
Definition: juce_ListenerList.h:330
bool isEmpty() const noexcept
Definition: juce_ListenerList.h:127
bool contains(ListenerClass *const listener) const noexcept
Definition: juce_ListenerList.h:139
~Iterator() noexcept
Definition: juce_ListenerList.h:308
Definition: juce_ListenerList.h:291
void callChecked(const BailOutCheckerType &bailOutChecker, void(ListenerClass::*callbackFunction)(P1, P2, P3), LL_PARAM(1), LL_PARAM(2), LL_PARAM(3))
Definition: juce_ListenerList.h:215
Definition: juce_ListenerList.h:69
void callChecked(const BailOutCheckerType &bailOutChecker, void(ListenerClass::*callbackFunction)(P1, P2, P3, P4), LL_PARAM(1), LL_PARAM(2), LL_PARAM(3), LL_PARAM(4))
Definition: juce_ListenerList.h:236
void callChecked(const BailOutCheckerType &bailOutChecker, void(ListenerClass::*callbackFunction)(P1, P2, P3, P4, P5), LL_PARAM(1), LL_PARAM(2), LL_PARAM(3), LL_PARAM(4), LL_PARAM(5))
Definition: juce_ListenerList.h:257
ListenerClass ListenerType
Definition: juce_ListenerList.h:344
int size() const noexcept
Definition: juce_ListenerList.h:121
Iterator(const ListType &listToIterate) noexcept
Definition: juce_ListenerList.h:304
ListenerList()
Definition: juce_ListenerList.h:85
~ListenerList()
Definition: juce_ListenerList.h:90
Definition: juce_Array.h:60
void call(void(ListenerClass::*callbackFunction)(P1, P2, P3, P4), LL_PARAM(1), LL_PARAM(2), LL_PARAM(3), LL_PARAM(4))
Definition: juce_ListenerList.h:226
void callChecked(const BailOutCheckerType &bailOutChecker, void(ListenerClass::*callbackFunction)(P1), LL_PARAM(1))
Definition: juce_ListenerList.h:173
#define jassert(a)
Definition: juce_PlatformDefs.h:146
void clear()
Definition: juce_ListenerList.h:133
#define JUCE_DECLARE_NON_COPYABLE(className)
Definition: juce_PlatformDefs.h:191
void call(void(ListenerClass::*callbackFunction)(P1, P2), LL_PARAM(1), LL_PARAM(2))
Definition: juce_ListenerList.h:184
void call(void(ListenerClass::*callbackFunction)())
Definition: juce_ListenerList.h:146
void add(ListenerClass *const listenerToAdd)
Definition: juce_ListenerList.h:100
void callChecked(const BailOutCheckerType &bailOutChecker, void(ListenerClass::*callbackFunction)())
Definition: juce_ListenerList.h:154
void call(void(ListenerClass::*callbackFunction)(P1, P2, P3, P4, P5, P6), LL_PARAM(1), LL_PARAM(2), LL_PARAM(3), LL_PARAM(4), LL_PARAM(5), LL_PARAM(6))
Definition: juce_ListenerList.h:268
bool next(const BailOutCheckerType &bailOutChecker) noexcept
Definition: juce_ListenerList.h:325
void call(void(ListenerClass::*callbackFunction)(P1, P2, P3), LL_PARAM(1), LL_PARAM(2), LL_PARAM(3))
Definition: juce_ListenerList.h:205
bool shouldBailOut() const noexcept
Definition: juce_ListenerList.h:294
void callChecked(const BailOutCheckerType &bailOutChecker, void(ListenerClass::*callbackFunction)(P1, P2), LL_PARAM(1), LL_PARAM(2))
Definition: juce_ListenerList.h:194
ListenerList< ListenerClass, ArrayType > ThisType
Definition: juce_ListenerList.h:343
Definition: juce_ListenerList.h:300