#pragma once
#include"noncopyable.h"
#include"Timestamp.h"
#include<vector>
#include<unordered_map>
class Channel;
class EventLoop;
class Poller:noncopyable
{
public:
using ChannelList=std::vector<Channel*>;
Poller(EventLoop *loop);
virtual ~Poller()=default;
virtual Timestamp poll(int timeoutMs,ChannelList *activeChannels) = 0;
virtual void updateChannel(Channel*channel) = 0;
virtual void removeChannel(Channel*channel) = 0;
bool hasChannel(Channel*channel)const;
static Poller* newDefaultPoller(EventLoop*loop);
protected:
using ChannelMap=std::unordered_map<int,Channel*>;
ChannelMap channels_;
private:
EventLoop *ownerLoop_;
};
#include"Poller.h"
#include"Channel.h"
Poller::Poller(EventLoop*loop)
:ownerLoop_(loop)
{
}
bool Poller::hasChannel(Channel*channel) const
{
auto it=channels_.find(channel->fd());
return it!=channels_.end()&&it->second==channel;
}