asyncio/generic/
mod.rs

1use prelude::{Protocol, SockAddr};
2use ffi::{SockAddrImpl, sockaddr};
3
4use std::slice;
5use std::marker::PhantomData;
6
7#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
8pub struct GenericEndpoint<P: Protocol> {
9    sa: SockAddrImpl<Box<[u8]>>,
10    protocol: i32,
11    _marker: PhantomData<P>,
12}
13
14impl<P: Protocol> GenericEndpoint<P> {
15    pub fn new<T>(ep: &T, protocol: i32) -> GenericEndpoint<P>
16        where T: SockAddr,
17    {
18        let mut sa = vec![0; ep.capacity()];
19        let len = ep.size();
20        let src = unsafe { slice::from_raw_parts(ep.as_ref() as *const _ as *const u8, len) };
21        sa[..len].copy_from_slice(src);
22        GenericEndpoint {
23            sa: SockAddrImpl::from_vec(sa, len),
24            protocol: protocol,
25            _marker: PhantomData,
26        }
27    }
28
29    fn default(capacity: usize, protocol: i32) -> GenericEndpoint<P> {
30        GenericEndpoint {
31            sa: SockAddrImpl::from_vec(vec![0; capacity], 0),
32            protocol: protocol,
33            _marker: PhantomData,
34        }
35    }
36}
37
38impl<P: Protocol> SockAddr for GenericEndpoint<P> {
39    type SockAddr = sockaddr;
40
41    fn as_ref(&self) -> &Self::SockAddr {
42        unsafe { &*(self.sa.as_ptr() as *const _) }
43    }
44
45    unsafe fn as_mut(&mut self) -> &mut Self::SockAddr {
46        &mut *(self.sa.as_ptr() as *mut _)
47    }
48
49    fn capacity(&self) -> usize {
50        self.sa.capacity()
51    }
52
53    fn size(&self) -> usize {
54        self.sa.size()
55    }
56
57    unsafe fn resize(&mut self, size: usize) {
58        debug_assert!(size <= self.capacity());
59        self.sa.resize(size)
60    }
61}
62
63mod stream;
64pub use self::stream::*;
65
66mod dgram;
67pub use self::dgram::*;
68
69mod raw;
70pub use self::raw::*;
71
72mod seq_packet;
73pub use self::seq_packet::*;