blob: 9865996532ca43fcc2376f836b24776b56881046 (
plain) (
tree)
|
|
#pragma once
#include "actor.h"
#include "queue_for_actor.h"
#include <functional>
namespace NActor {
template <typename TItem>
class IQueueInActor {
public:
virtual void EnqueueAndScheduleV(const TItem& item) = 0;
virtual void DequeueAllV() = 0;
virtual void DequeueAllLikelyEmptyV() = 0;
virtual ~IQueueInActor() {
}
};
template <typename TThis, typename TItem, typename TActorTag = TDefaultTag, typename TQueueTag = TDefaultTag>
class TQueueInActor: public IQueueInActor<TItem> {
typedef TQueueInActor<TThis, TItem, TActorTag, TQueueTag> TSelf;
public:
// TODO: make protected
TQueueForActor<TItem> QueueInActor;
private:
TActor<TThis, TActorTag>* GetActor() {
return GetThis();
}
TThis* GetThis() {
return static_cast<TThis*>(this);
}
void ProcessItem(const TItem& item) {
GetThis()->ProcessItem(TActorTag(), TQueueTag(), item);
}
public:
void EnqueueAndNoSchedule(const TItem& item) {
QueueInActor.Enqueue(item);
}
void EnqueueAndSchedule(const TItem& item) {
EnqueueAndNoSchedule(item);
GetActor()->Schedule();
}
void EnqueueAndScheduleV(const TItem& item) override {
EnqueueAndSchedule(item);
}
void Clear() {
QueueInActor.Clear();
}
void DequeueAll() {
QueueInActor.DequeueAll(std::bind(&TSelf::ProcessItem, this, std::placeholders::_1));
}
void DequeueAllV() override {
return DequeueAll();
}
void DequeueAllLikelyEmpty() {
QueueInActor.DequeueAllLikelyEmpty(std::bind(&TSelf::ProcessItem, this, std::placeholders::_1));
}
void DequeueAllLikelyEmptyV() override {
return DequeueAllLikelyEmpty();
}
bool IsEmpty() {
return QueueInActor.IsEmpty();
}
};
}
|