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) } }