Skip to content

Commit a382334

Browse files
authored
movable TEventObserverHolder
1 parent 9a778e0 commit a382334

File tree

1 file changed

+33
-9
lines changed

1 file changed

+33
-9
lines changed

ydb/library/actors/testlib/test_runtime.h

+33-9
Original file line numberDiff line numberDiff line change
@@ -299,36 +299,60 @@ namespace NActors {
299299
using TEventObserverCollection = std::list<std::function<void(TAutoPtr<IEventHandle>& event)>>;
300300
class TEventObserverHolder {
301301
public:
302-
TEventObserverHolder(TEventObserverCollection& list, TEventObserverCollection::iterator&& iter)
302+
TEventObserverHolder()
303+
: List(nullptr)
304+
{
305+
}
306+
307+
TEventObserverHolder(TEventObserverCollection* list, TEventObserverCollection::iterator&& iter)
303308
: List(list)
304309
, Iter(iter)
305310
{
306311
}
307312

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+
308330
~TEventObserverHolder()
309331
{
310332
Remove();
311333
}
312334

313335
void Remove()
314336
{
315-
if (Iter == List.end()) {
337+
if (List == nullptr || Iter == List->end()) {
316338
return;
317339
}
318340

319-
List.erase(Iter);
320-
Iter = List.end();
341+
List->erase(Iter);
342+
Iter = List->end();
343+
344+
List = nullptr;
321345
}
322346
private:
323-
TEventObserverCollection& List;
347+
TEventObserverCollection* List;
324348
TEventObserverCollection::iterator Iter;
325349
};
326350

327351
// An example of using AddObserver in unit tests
328352
/*
329353
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;
332356
333357
// Optionally reset the event, all subsequent handlers of this event will not be called
334358
event.Reset();
@@ -349,13 +373,13 @@ namespace NActors {
349373
};
350374

351375
auto iter = ObserverFuncs.insert(ObserverFuncs.end(), baseFunc);
352-
return TEventObserverHolder(ObserverFuncs, std::move(iter));
376+
return TEventObserverHolder(&ObserverFuncs, std::move(iter));
353377
}
354378

355379
TEventObserverHolder AddObserver(std::function<void(TAutoPtr<IEventHandle>&)> observerFunc)
356380
{
357381
auto iter = ObserverFuncs.insert(ObserverFuncs.end(), observerFunc);
358-
return TEventObserverHolder(ObserverFuncs, std::move(iter));
382+
return TEventObserverHolder(&ObserverFuncs, std::move(iter));
359383
}
360384

361385
template<typename T>

0 commit comments

Comments
 (0)