@@ -49,23 +49,47 @@ impl<T: SetBufInit, O> BufResultExt for BufResult<(usize, O), T> {
4949 }
5050}
5151
52- /// Helper trait for [`RecvFrom`] and [`RecvFromVectored`].
52+ impl < T : SetBufInit , C : SetBufInit , O > BufResultExt for BufResult < ( usize , usize , O ) , ( T , C ) > {
53+ fn map_advanced ( self ) -> Self {
54+ self . map (
55+ |( init_buffer, init_control, obj) , ( mut buffer, mut control) | {
56+ unsafe {
57+ buffer. set_buf_init ( init_buffer) ;
58+ control. set_buf_init ( init_control) ;
59+ }
60+ ( ( init_buffer, init_control, obj) , ( buffer, control) )
61+ } ,
62+ )
63+ }
64+ }
65+
66+ /// Helper trait for [`RecvFrom`], [`RecvFromVectored`] and [`RecvMsg`].
5367pub trait RecvResultExt {
5468 /// The mapped result.
55- type RecvFromResult ;
69+ type RecvResult ;
5670
5771 /// Create [`SockAddr`] if the result is [`Ok`].
58- fn map_addr ( self ) -> Self :: RecvFromResult ;
72+ fn map_addr ( self ) -> Self :: RecvResult ;
5973}
6074
6175impl < T > RecvResultExt for BufResult < usize , ( T , sockaddr_storage , socklen_t ) > {
62- type RecvFromResult = BufResult < ( usize , SockAddr ) , T > ;
76+ type RecvResult = BufResult < ( usize , SockAddr ) , T > ;
77+
78+ fn map_addr ( self ) -> Self :: RecvResult {
79+ self . map_buffer ( |( buffer, addr_buffer, addr_size) | ( buffer, addr_buffer, addr_size, 0 ) )
80+ . map_addr ( )
81+ . map_res ( |( res, _, addr) | ( res, addr) )
82+ }
83+ }
84+
85+ impl < T > RecvResultExt for BufResult < usize , ( T , sockaddr_storage , socklen_t , usize ) > {
86+ type RecvResult = BufResult < ( usize , usize , SockAddr ) , T > ;
6387
64- fn map_addr ( self ) -> Self :: RecvFromResult {
88+ fn map_addr ( self ) -> Self :: RecvResult {
6589 self . map2 (
66- |res, ( buffer, addr_buffer, addr_size) | {
90+ |res, ( buffer, addr_buffer, addr_size, len ) | {
6791 let addr = unsafe { SockAddr :: new ( addr_buffer, addr_size) } ;
68- ( ( res, addr) , buffer)
92+ ( ( res, len , addr) , buffer)
6993 } ,
7094 |( buffer, ..) | buffer,
7195 )
0 commit comments