use std::io;
use std::ops::{Deref, DerefMut};
use mio::{Token, Sender};
use time::{Timespec};
use handler::Notify;
use loop_api::LoopApi;
use loop_time::{estimate_timespec};
use notify::create_notifier;
use {Notifier, Time};
use {Evented, EventSet, PollOpt, Timeout, TimerError};
pub struct Scope<'a, C:Sized+'a>{
token: Token,
ctx: &'a mut C,
channel: &'a mut Sender<Notify>,
loop_api: &'a mut LoopApi,
time: Time,
}
pub struct EarlyScope<'a> {
token: Token,
channel: &'a mut Sender<Notify>,
loop_api: &'a mut LoopApi,
}
pub trait GenericScope {
fn register(&mut self, io: &Evented, interest: EventSet, opt: PollOpt)
-> io::Result<()>;
fn reregister(&mut self, io: &Evented,
interest: EventSet, opt: PollOpt)
-> io::Result<()>;
fn deregister(&mut self, io: &Evented) -> io::Result<()>;
fn timeout_ms(&mut self, delay: u64) -> Result<Timeout, TimerError>;
fn clear_timeout(&mut self, token: Timeout) -> bool;
fn notifier(&mut self) -> Notifier;
fn now(&self) -> Time;
fn estimate_timespec(&self, time: Time) -> Timespec {
estimate_timespec(self.now(), time)
}
}
impl<'a, C:Sized+'a> Scope<'a, C> {
pub fn register(&mut self, io: &Evented, interest: EventSet, opt: PollOpt)
-> io::Result<()>
{
self.loop_api.register(io, self.token, interest, opt)
}
pub fn reregister(&mut self, io: &Evented,
interest: EventSet, opt: PollOpt)
-> io::Result<()>
{
self.loop_api.reregister(io, self.token, interest, opt)
}
pub fn deregister(&mut self, io: &Evented) -> io::Result<()>
{
self.loop_api.deregister(io)
}
pub fn timeout_ms(&mut self, delay: u64) -> Result<Timeout, TimerError>
{
self.loop_api.timeout_ms(self.token, delay)
}
pub fn clear_timeout(&mut self, token: Timeout) -> bool
{
self.loop_api.clear_timeout(token)
}
pub fn notifier(&mut self) -> Notifier {
create_notifier(self.token, self.channel)
}
pub fn shutdown_loop(&mut self) {
self.loop_api.shutdown()
}
pub fn now(&self) -> Time {
self.time
}
pub fn estimate_timespec(&self, time: Time) -> Timespec {
estimate_timespec(self.now(), time)
}
}
impl<'a, C:Sized+'a> GenericScope for Scope<'a, C> {
fn register(&mut self, io: &Evented, interest: EventSet, opt: PollOpt)
-> io::Result<()>
{
self.register(io, interest, opt)
}
fn reregister(&mut self, io: &Evented,
interest: EventSet, opt: PollOpt)
-> io::Result<()>
{
self.reregister(io, interest, opt)
}
fn deregister(&mut self, io: &Evented) -> io::Result<()>
{
self.deregister(io)
}
fn timeout_ms(&mut self, delay: u64) -> Result<Timeout, TimerError>
{
self.timeout_ms(delay)
}
fn clear_timeout(&mut self, token: Timeout) -> bool
{
self.clear_timeout(token)
}
fn notifier(&mut self) -> Notifier {
self.notifier()
}
fn now(&self) -> Time {
self.time
}
}
impl<'a, C> Deref for Scope<'a, C> {
type Target = C;
fn deref(&self) -> &C {
self.ctx
}
}
impl<'a, C> DerefMut for Scope<'a, C> {
fn deref_mut(&mut self) -> &mut C {
self.ctx
}
}
impl<'a> EarlyScope<'a> {
pub fn register(&mut self, io: &Evented, interest: EventSet, opt: PollOpt)
-> io::Result<()>
{
self.loop_api.register(io, self.token, interest, opt)
}
pub fn reregister(&mut self, io: &Evented,
interest: EventSet, opt: PollOpt)
-> io::Result<()>
{
self.loop_api.reregister(io, self.token, interest, opt)
}
pub fn deregister(&mut self, io: &Evented) -> io::Result<()>
{
self.loop_api.deregister(io)
}
pub fn timeout_ms(&mut self, delay: u64) -> Result<Timeout, TimerError>
{
self.loop_api.timeout_ms(self.token, delay)
}
pub fn clear_timeout(&mut self, token: Timeout) -> bool
{
self.loop_api.clear_timeout(token)
}
pub fn notifier(&mut self) -> Notifier {
create_notifier(self.token, self.channel)
}
pub fn now(&self) -> Time {
Time::zero()
}
pub fn estimate_timespec(&self, time: Time) -> Timespec {
estimate_timespec(self.now(), time)
}
}
impl<'a> GenericScope for EarlyScope<'a> {
fn register(&mut self, io: &Evented, interest: EventSet, opt: PollOpt)
-> io::Result<()>
{
self.register(io, interest, opt)
}
fn reregister(&mut self, io: &Evented,
interest: EventSet, opt: PollOpt)
-> io::Result<()>
{
self.reregister(io, interest, opt)
}
fn deregister(&mut self, io: &Evented) -> io::Result<()>
{
self.deregister(io)
}
fn timeout_ms(&mut self, delay: u64) -> Result<Timeout, TimerError>
{
self.timeout_ms(delay)
}
fn clear_timeout(&mut self, token: Timeout) -> bool
{
self.clear_timeout(token)
}
fn notifier(&mut self) -> Notifier {
self.notifier()
}
fn now(&self) -> Time {
Time::zero()
}
}
#[doc(hidden)]
pub fn scope<'x, C, L:LoopApi>(time: Time, token: Token, ctx: &'x mut C,
channel: &'x mut Sender<Notify>, loop_api: &'x mut L)
-> Scope<'x, C>
{
Scope {
token: token,
ctx: ctx,
channel: channel,
loop_api: loop_api,
time: time,
}
}
#[doc(hidden)]
pub fn early_scope<'x, L:LoopApi>(token: Token,
channel: &'x mut Sender<Notify>, loop_api: &'x mut L)
-> EarlyScope<'x>
{
EarlyScope {
token: token,
channel: channel,
loop_api: loop_api,
}
}