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::*;