@@ -299,36 +299,60 @@ namespace NActors {
299
299
using TEventObserverCollection = std::list<std::function<void (TAutoPtr<IEventHandle>& event)>>;
300
300
class TEventObserverHolder {
301
301
public:
302
- TEventObserverHolder (TEventObserverCollection& list, TEventObserverCollection::iterator&& iter)
302
+ TEventObserverHolder ()
303
+ : List(nullptr )
304
+ {
305
+ }
306
+
307
+ TEventObserverHolder (TEventObserverCollection* list, TEventObserverCollection::iterator&& iter)
303
308
: List(list)
304
309
, Iter(iter)
305
310
{
306
311
}
307
312
313
+ TEventObserverHolder (TEventObserverHolder&& other)
314
+ : List(nullptr )
315
+ {
316
+ *this = std::move (other);
317
+ }
318
+
319
+ TEventObserverHolder& operator =(TEventObserverHolder&& other) noexcept {
320
+ if (this != &other)
321
+ {
322
+ List = std::move (other.List );
323
+ Iter = std::move (other.Iter );
324
+
325
+ other.List = nullptr ;
326
+ }
327
+ return *this ;
328
+ }
329
+
308
330
~TEventObserverHolder ()
309
331
{
310
332
Remove ();
311
333
}
312
334
313
335
void Remove ()
314
336
{
315
- if (Iter == List. end ()) {
337
+ if (List == nullptr || Iter == List-> end ()) {
316
338
return ;
317
339
}
318
340
319
- List.erase (Iter);
320
- Iter = List.end ();
341
+ List->erase (Iter);
342
+ Iter = List->end ();
343
+
344
+ List = nullptr ;
321
345
}
322
346
private:
323
- TEventObserverCollection& List;
347
+ TEventObserverCollection* List;
324
348
TEventObserverCollection::iterator Iter;
325
349
};
326
350
327
351
// An example of using AddObserver in unit tests
328
352
/*
329
353
auto observerHolder = runtime.AddObserver<TEvDataShard::TEvRead>([&](TEvDataShard::TEvRead::TPtr& event) {
330
- // Do something with the event inside the calback
331
- Cout << "An event is observed " << ev ->Get()->Record.ShortDebugString() << Endl;
354
+ // Do something with the event inside the callback
355
+ Cout << "An event is observed " << event ->Get()->Record.ShortDebugString() << Endl;
332
356
333
357
// Optionally reset the event, all subsequent handlers of this event will not be called
334
358
event.Reset();
@@ -349,13 +373,13 @@ namespace NActors {
349
373
};
350
374
351
375
auto iter = ObserverFuncs.insert (ObserverFuncs.end (), baseFunc);
352
- return TEventObserverHolder (ObserverFuncs, std::move (iter));
376
+ return TEventObserverHolder (& ObserverFuncs, std::move (iter));
353
377
}
354
378
355
379
TEventObserverHolder AddObserver (std::function<void (TAutoPtr<IEventHandle>&)> observerFunc)
356
380
{
357
381
auto iter = ObserverFuncs.insert (ObserverFuncs.end (), observerFunc);
358
- return TEventObserverHolder (ObserverFuncs, std::move (iter));
382
+ return TEventObserverHolder (& ObserverFuncs, std::move (iter));
359
383
}
360
384
361
385
template <typename T>
0 commit comments