1
1
use std:: sync:: Arc ;
2
2
use tokio:: {
3
3
fs:: { File , OpenOptions } ,
4
- io:: { AsyncReadExt , AsyncWriteExt } ,
4
+ io:: { AsyncReadExt , AsyncSeekExt , AsyncWriteExt } ,
5
5
sync:: Mutex ,
6
6
} ;
7
7
@@ -169,7 +169,9 @@ impl Data {
169
169
None => None ,
170
170
} ;
171
171
172
- let mut data: Vec < u32 > ;
172
+ let mut data: Vec < u32 > = Vec :: with_capacity ( RESOLUTION ) ;
173
+ data. resize ( RESOLUTION , 0 ) ;
174
+
173
175
if file. is_some ( ) {
174
176
let mut file_data: Vec < u8 > = Vec :: with_capacity ( RESOLUTION * 4 ) ;
175
177
file. as_mut ( )
@@ -178,21 +180,11 @@ impl Data {
178
180
. await
179
181
. unwrap ( ) ;
180
182
181
- data = file_data
182
- . chunks_exact ( 4 )
183
- . map ( |chunk| {
184
- let mut buf = [ 0 ; 4 ] ;
185
- buf. copy_from_slice ( chunk) ;
186
-
187
- u32:: from_le_bytes ( buf)
188
- } )
189
- . collect :: < Vec < u32 > > ( ) ;
190
- data. resize ( RESOLUTION , 0 ) ;
191
- } else {
192
- data = Vec :: with_capacity ( RESOLUTION ) ;
193
- data. resize ( RESOLUTION , 0 ) ;
194
-
195
- println ! ( "data: {:?}" , & data. len( ) ) ;
183
+ data. iter_mut ( )
184
+ . zip ( file_data. chunks_exact ( 4 ) )
185
+ . for_each ( |( data, chunk) | {
186
+ * data = u32:: from_le_bytes ( [ chunk[ 0 ] , chunk[ 1 ] , chunk[ 2 ] , chunk[ 3 ] ] ) ;
187
+ } ) ;
196
188
}
197
189
198
190
let data = Arc :: new ( Mutex :: new ( data) ) ;
@@ -206,10 +198,18 @@ impl Data {
206
198
207
199
println ! ( "saving data..." ) ;
208
200
201
+ file. seek ( std:: io:: SeekFrom :: Start ( 0 ) ) . await . unwrap ( ) ;
202
+
209
203
let data = task_data. lock ( ) . await ;
210
- for chunk in data. iter ( ) {
211
- file. write_all ( & chunk. to_le_bytes ( ) ) . await . unwrap ( ) ;
212
- }
204
+ file. write_all (
205
+ & data
206
+ . iter ( )
207
+ . map ( |data| data. to_le_bytes ( ) )
208
+ . flatten ( )
209
+ . collect :: < Vec < u8 > > ( ) ,
210
+ )
211
+ . await
212
+ . unwrap ( ) ;
213
213
214
214
println ! ( "saving data... done" ) ;
215
215
0 commit comments