aboutsummaryrefslogblamecommitdiffstats
path: root/library/cpp/messagebus/actor/queue_in_actor.h
blob: 9865996532ca43fcc2376f836b24776b56881046 (plain) (tree)
1
2
3
4
5
6
7
8



                            
                     
                  




                                                                
 

                                  
 

                                                                                                                 
 

                                           
 


                                              
 

                                             
 

                                                                   
 


                                                      
 


                                                    
 

                                                              
 

                                 
 

                                                                                                 
 

                                     
 

                                                                                                            
 

                                                
 


                                          
 
 
#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();
        }
    };

}