@@ -11,23 +11,21 @@ macro_rules! write_scalar {
11
11
use :: compio_buf:: { arrayvec:: ArrayVec , BufResult } ;
12
12
13
13
const LEN : usize = :: std:: mem:: size_of:: <$t>( ) ;
14
- let BufResult ( len , _) = self
14
+ let BufResult ( res , _) = self
15
15
. write_all( ArrayVec :: <u8 , LEN >:: from( num. $be( ) ) )
16
16
. await ;
17
- assert_eq!( len?, LEN , "`write_all` returned unexpected length" ) ;
18
- Ok ( ( ) )
17
+ res
19
18
}
20
19
21
20
#[ doc = concat!( "Write a little endian `" , stringify!( $t) , "` into the underlying writer." ) ]
22
21
async fn [ < write_ $t _le >] ( & mut self , num: $t) -> IoResult <( ) > {
23
22
use :: compio_buf:: { arrayvec:: ArrayVec , BufResult } ;
24
23
25
24
const LEN : usize = :: std:: mem:: size_of:: <$t>( ) ;
26
- let BufResult ( len , _) = self
25
+ let BufResult ( res , _) = self
27
26
. write_all( ArrayVec :: <u8 , LEN >:: from( num. $le( ) ) )
28
27
. await ;
29
- assert_eq!( len?, LEN , "`write_all` returned unexpected length" ) ;
30
- Ok ( ( ) )
28
+ res
31
29
}
32
30
}
33
31
} ;
@@ -57,24 +55,42 @@ macro_rules! loop_write_all {
57
55
BufResult ( Err ( ref e) , buf) if e. kind( ) == :: std:: io:: ErrorKind :: Interrupted => {
58
56
$buf = buf;
59
57
}
60
- res => return res ,
58
+ BufResult ( Err ( e ) , buf ) => return BufResult ( Err ( e ) , buf ) ,
61
59
}
62
60
}
63
61
64
- return BufResult ( Ok ( $needle ) , $buf) ;
62
+ return BufResult ( Ok ( ( ) ) , $buf) ;
65
63
} ;
66
64
}
67
65
68
66
macro_rules! loop_write_vectored {
69
- (
70
- $buf: ident,
71
- $tracker: ident :
72
- $tracker_ty: ty,
73
- $iter: ident, loop
74
- $read_expr: expr
75
- ) => {
76
- loop_write_vectored!( $buf, $tracker: $tracker_ty, res, $iter, loop $read_expr, break None )
77
- } ;
67
+ ( $buf: ident, $tracker: ident : $tracker_ty: ty, $iter: ident, loop $read_expr: expr) => { {
68
+ let mut $iter = match $buf. owned_iter( ) {
69
+ Ok ( buf) => buf,
70
+ Err ( buf) => return BufResult ( Ok ( ( ) ) , buf) ,
71
+ } ;
72
+ let mut $tracker: $tracker_ty = 0 ;
73
+
74
+ loop {
75
+ let len = $iter. buf_len( ) ;
76
+ if len == 0 {
77
+ continue ;
78
+ }
79
+
80
+ match $read_expr. await {
81
+ BufResult ( Ok ( ( ) ) , ret) => {
82
+ $iter = ret;
83
+ $tracker += len as $tracker_ty;
84
+ }
85
+ BufResult ( Err ( e) , $iter) => return BufResult ( Err ( e) , $iter. into_inner( ) ) ,
86
+ } ;
87
+
88
+ match $iter. next( ) {
89
+ Ok ( next) => $iter = next,
90
+ Err ( buf) => return BufResult ( Ok ( ( ) ) , buf) ,
91
+ }
92
+ }
93
+ } } ;
78
94
(
79
95
$buf: ident,
80
96
$tracker: ident :
@@ -130,7 +146,7 @@ pub trait AsyncWriteExt: AsyncWrite {
130
146
}
131
147
132
148
/// Write the entire contents of a buffer into this writer.
133
- async fn write_all < T : IoBuf > ( & mut self , mut buf : T ) -> BufResult < usize , T > {
149
+ async fn write_all < T : IoBuf > ( & mut self , mut buf : T ) -> BufResult < ( ) , T > {
134
150
loop_write_all ! (
135
151
buf,
136
152
buf. buf_len( ) ,
@@ -142,8 +158,8 @@ pub trait AsyncWriteExt: AsyncWrite {
142
158
/// Write the entire contents of a buffer into this writer. Like
143
159
/// [`AsyncWrite::write_vectored`], except that it tries to write the entire
144
160
/// contents of the buffer into this writer.
145
- async fn write_vectored_all < T : IoVectoredBuf > ( & mut self , buf : T ) -> BufResult < usize , T > {
146
- loop_write_vectored ! ( buf, total : usize , iter, loop self . write_all( iter) )
161
+ async fn write_vectored_all < T : IoVectoredBuf > ( & mut self , buf : T ) -> BufResult < ( ) , T > {
162
+ loop_write_vectored ! ( buf, _total : usize , iter, loop self . write_all( iter) )
147
163
}
148
164
149
165
write_scalar ! ( u8 , to_be_bytes, to_le_bytes) ;
@@ -168,7 +184,7 @@ impl<A: AsyncWrite + ?Sized> AsyncWriteExt for A {}
168
184
pub trait AsyncWriteAtExt : AsyncWriteAt {
169
185
/// Like [`AsyncWriteAt::write_at`], except that it tries to write the
170
186
/// entire contents of the buffer into this writer.
171
- async fn write_all_at < T : IoBuf > ( & mut self , mut buf : T , pos : u64 ) -> BufResult < usize , T > {
187
+ async fn write_all_at < T : IoBuf > ( & mut self , mut buf : T , pos : u64 ) -> BufResult < ( ) , T > {
172
188
loop_write_all ! (
173
189
buf,
174
190
buf. buf_len( ) ,
@@ -183,7 +199,7 @@ pub trait AsyncWriteAtExt: AsyncWriteAt {
183
199
& mut self ,
184
200
buf : T ,
185
201
pos : u64 ,
186
- ) -> BufResult < usize , T > {
202
+ ) -> BufResult < ( ) , T > {
187
203
loop_write_vectored ! ( buf, total: u64 , iter, loop self . write_all_at( iter, pos + total) )
188
204
}
189
205
}
0 commit comments