1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
use std::ops;

const DATA_IO: usize            = 0b0000000001;
const ASSOCIATION: usize        = 0b0000000010;
const ADDRESS: usize            = 0b0000000100;
const SEND_FAILURE: usize       = 0b0000001000;
const PEER_ERROR: usize         = 0b0000010000;
const SHUTDOWN: usize           = 0b0000100000;
const PARTIAL_DELIVERY: usize   = 0b0001000000;
const ADAPTATION_LAYER: usize   = 0b0010000000;
const AUTHENTICATION: usize     = 0b0100000000;
const SENDER_DRY: usize         = 0b1000000000;

#[derive(Debug, Copy, PartialEq, Eq, Clone, PartialOrd, Ord)]
pub struct Event(usize);

impl Event {
    #[inline]
    pub fn empty() -> Event {
        Event(0)
    }

    #[inline]
    pub fn data_io() -> Event {
        Event(DATA_IO)
    }

    #[inline]
    pub fn association() -> Event {
        Event(ASSOCIATION)
    }

    #[inline]
    pub fn address() -> Event {
        Event(ADDRESS)
    }

    #[inline]
    pub fn send_failure() -> Event {
        Event(SEND_FAILURE)
    }

    #[inline]
    pub fn peer_error() -> Event {
        Event(PEER_ERROR)
    }

    #[inline]
    pub fn shutdown() -> Event {
        Event(SHUTDOWN)
    }

    #[inline]
    pub fn partial_delivery() -> Event {
        Event(PARTIAL_DELIVERY)
    }

    #[inline]
    pub fn adaptation_layer() -> Event {
        Event(ADAPTATION_LAYER)
    }

    #[inline]
    pub fn authentication() -> Event {
        Event(AUTHENTICATION)
    }

    #[inline]
    pub fn sender_dry() -> Event {
        Event(SENDER_DRY)
    }

    #[inline]
    pub fn insert(&mut self, other: Event) {
        self.0 |= other.0
    }

    #[inline]
    pub fn remove(&mut self, other: Event) {
        self.0 &= !other.0
    }

    #[inline]
    pub fn contains(&self, other: Event) -> bool {
        (*self & other) == other
    }

    #[inline]
    pub fn as_usize(&self) -> usize {
        self.0
    }
}

impl ops::BitOr for Event {
    type Output = Event;

    #[inline]
    fn bitor(self, other: Event) -> Event {
        Event(self.0 | other.0)
    }
}

impl ops::BitXor for Event {
    type Output = Event;

    #[inline]
    fn bitxor(self, other: Event) -> Event {
        Event(self.0 ^ other.0)
    }
}

impl ops::BitAnd for Event {
    type Output = Event;

    #[inline]
    fn bitand(self, other: Event) -> Event {
        Event(self.0 & other.0)
    }
}

impl ops::Sub for Event {
    type Output = Event;

    #[inline]
    fn sub(self, other: Event) -> Event {
        Event(self.0 & !other.0)
    }
}

impl ops::Not for Event {
    type Output = Event;

    #[inline]
    fn not(self) -> Event {
        Event(!self.0)
    }
}

impl From<usize> for Event {
    fn from(event: usize) -> Event {
        Event(event)
    }
}