@@ -21,6 +21,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
21
#ifndef __MULTIDELEGATE_H
22
22
#define __MULTIDELEGATE_H
23
23
24
+ #include < iterator>
24
25
#if defined(ESP8266) || defined(ESP32) || !defined(ARDUINO)
25
26
#include < atomic>
26
27
#else
@@ -216,6 +217,10 @@ namespace delegate
216
217
unused = node;
217
218
}
218
219
220
+ void traverse (Node_t*& current) const
221
+ {
222
+ current = current->mNext ;
223
+ }
219
224
void traverse (Node_t*& prev, Node_t*& current, bool remove = true )
220
225
{
221
226
if (remove && ISQUEUE)
@@ -248,14 +253,64 @@ namespace delegate
248
253
else
249
254
{
250
255
prev = current;
251
- current = current-> mNext ;
256
+ traverse ( current) ;
252
257
}
253
258
}
254
259
255
260
#ifndef ARDUINO
256
261
std::mutex mutex_unused;
257
262
#endif
258
263
public:
264
+ class iterator : public std ::iterator<std::forward_iterator_tag, Delegate>
265
+ {
266
+ protected:
267
+ MultiDelegatePImpl& multiDel;
268
+ Node_t* current = nullptr ;
269
+ Node_t* const stop = nullptr ;
270
+ public:
271
+ iterator (MultiDelegatePImpl& md) : multiDel(md), current(md.first), stop(md.last) {}
272
+ iterator (MultiDelegatePImpl& md, nullptr_t ) : multiDel(md) {}
273
+ iterator () = default ;
274
+ iterator (const iterator&) = default ;
275
+ iterator& operator =(const iterator&) = default ;
276
+ bool operator ==(const iterator& rhs) const
277
+ {
278
+ return &multiDel == &rhs.multiDel && current == rhs.current ;
279
+ }
280
+ bool operator !=(const iterator& rhs) const {
281
+ return !operator ==(rhs);
282
+ }
283
+ const Delegate& operator *() const
284
+ {
285
+ return current->mDelegate ;
286
+ }
287
+ const Delegate* const operator ->() const
288
+ {
289
+ return ¤t->mDelegate ;
290
+ }
291
+ iterator& operator ++() // prefix
292
+ {
293
+ if (current && stop != current)
294
+ multiDel.traverse (current);
295
+ else
296
+ current = nullptr ; // end
297
+ return *this ;
298
+ }
299
+ iterator& operator ++(int ) // postfix
300
+ {
301
+ iterator tmp (*this );
302
+ operator ++();
303
+ return tmp;
304
+ }
305
+ };
306
+
307
+ iterator begin () const {
308
+ return iterator (*this );
309
+ }
310
+ iterator end () const {
311
+ return iterator (*this , nullptr );
312
+ }
313
+
259
314
const Delegate* IRAM_ATTR add (const Delegate& del)
260
315
{
261
316
return add (Delegate (del));
@@ -372,7 +427,10 @@ namespace delegate
372
427
{
373
428
done = current == stop;
374
429
result = CallP<Delegate, R, ISQUEUE, P...>::execute (current->mDelegate , args...);
375
- traverse (prev, current, result);
430
+ if (ISQUEUE)
431
+ traverse (prev, current, result);
432
+ else
433
+ traverse (current);
376
434
#if defined(ESP8266) || defined(ESP32)
377
435
// running callbacks might last too long for watchdog etc.
378
436
optimistic_yield (10000 );
@@ -426,7 +484,10 @@ namespace delegate
426
484
{
427
485
done = current == stop;
428
486
result = Call<Delegate, R, ISQUEUE>::execute (current->mDelegate );
429
- this ->traverse (prev, current, result);
487
+ if (ISQUEUE)
488
+ this ->traverse (prev, current, result);
489
+ else
490
+ this ->traverse (current);
430
491
#if defined(ESP8266) || defined(ESP32)
431
492
// running callbacks might last too long for watchdog etc.
432
493
optimistic_yield (10000 );
@@ -487,7 +548,10 @@ namespace delegate
487
548
{
488
549
done = current == stop;
489
550
CallP<Delegate, void , ISQUEUE, P...>::execute (current->mDelegate , args...);
490
- this ->traverse (prev, current);
551
+ if (ISQUEUE)
552
+ this ->traverse (prev, current);
553
+ else
554
+ traverse (current);
491
555
#if defined(ESP8266) || defined(ESP32)
492
556
// running callbacks might last too long for watchdog etc.
493
557
optimistic_yield (10000 );
@@ -531,7 +595,10 @@ namespace delegate
531
595
{
532
596
done = current == stop;
533
597
Call<Delegate, void , ISQUEUE>::execute (current->mDelegate );
534
- this ->traverse (prev, current);
598
+ if (ISQUEUE)
599
+ this ->traverse (prev, current);
600
+ else
601
+ this ->traverse (current);
535
602
#if defined(ESP8266) || defined(ESP32)
536
603
// running callbacks might last too long for watchdog etc.
537
604
optimistic_yield (10000 );
0 commit comments