@@ -3,84 +3,64 @@ use std::io::{stdout, BufWriter, Write};
33use std:: sync:: Arc ;
44
55use anyhow:: Result ;
6- use binseq:: { BinseqReader , BinseqRecord , ParallelProcessor , ParallelReader } ;
6+ use binseq:: { BinseqReader , BinseqRecord , Context , ParallelProcessor , ParallelReader } ;
77use parking_lot:: Mutex ;
88
99/// A struct for decoding BINSEQ data back to FASTQ format.
1010#[ derive( Clone ) ]
1111pub struct Decoder {
12- /// Local values
13- buffer : Vec < u8 > ,
14- /// Local buffer for decoding index
15- ibuf : itoa:: Buffer ,
16- /// Local buffer for decoding primary
17- sbuf : Vec < u8 > ,
18- /// Local buffer for decoding secondary
19- xbuf : Vec < u8 > ,
12+ /// Reusable context
13+ ctx : Context ,
14+
15+ /// local output buffer
16+ local_writer : Vec < u8 > ,
17+
18+ /// global output buffer
19+ global_writer : Arc < Mutex < Box < dyn Write + Send > > > ,
20+
2021 /// Local count of records
2122 local_count : usize ,
22- /// Quality buffer
23- quality : Vec < u8 > ,
2423
25- /// values
26- global_buffer : Arc < Mutex < Box < dyn Write + Send > > > ,
27- num_records : Arc < Mutex < usize > > ,
24+ /// global count of records
25+ global_count : Arc < Mutex < usize > > ,
2826}
2927
3028impl Decoder {
3129 #[ must_use]
3230 pub fn new ( writer : Box < dyn Write + Send > ) -> Self {
33- let global_buffer = Arc :: new ( Mutex :: new ( writer) ) ;
31+ let global_writer = Arc :: new ( Mutex :: new ( writer) ) ;
3432 Decoder {
35- buffer : Vec :: new ( ) ,
36- ibuf : itoa:: Buffer :: new ( ) ,
37- sbuf : Vec :: new ( ) ,
38- xbuf : Vec :: new ( ) ,
33+ local_writer : Vec :: new ( ) ,
34+ ctx : Context :: default ( ) ,
3935 local_count : 0 ,
40- quality : Vec :: new ( ) ,
41- global_buffer,
42- num_records : Arc :: new ( Mutex :: new ( 0 ) ) ,
36+ global_writer,
37+ global_count : Arc :: new ( Mutex :: new ( 0 ) ) ,
4338 }
4439 }
4540
4641 #[ must_use]
4742 pub fn num_records ( & self ) -> usize {
48- * self . num_records . lock ( )
43+ * self . global_count . lock ( )
4944 }
5045}
5146impl ParallelProcessor for Decoder {
5247 fn process_record < R : BinseqRecord > ( & mut self , record : R ) -> binseq:: Result < ( ) > {
53- // clear decoding buffers
54- self . sbuf . clear ( ) ;
55- self . xbuf . clear ( ) ;
56-
57- // decode index
58- let index = self . ibuf . format ( record. index ( ) ) . as_bytes ( ) ;
59-
60- // write primary fastq to local buffer
61- record. decode_s ( & mut self . sbuf ) ?;
62- if self . quality . len ( ) < self . sbuf . len ( ) {
63- self . quality . resize ( self . sbuf . len ( ) , b'?' ) ;
64- }
65- let squal = if record. has_quality ( ) {
66- record. squal ( )
67- } else {
68- & self . quality [ ..self . sbuf . len ( ) ]
69- } ;
70- write_fastq_parts ( & mut self . buffer , index, & self . sbuf , squal) ?;
48+ self . ctx . fill ( & record) ?;
49+ write_fastq_parts (
50+ & mut self . local_writer ,
51+ self . ctx . sheader ( ) ,
52+ self . ctx . sbuf ( ) ,
53+ self . ctx . squal ( ) ,
54+ ) ?;
7155
7256 // write extended fastq to local buffer
7357 if record. is_paired ( ) {
74- record. decode_x ( & mut self . xbuf ) ?;
75- if self . quality . len ( ) < self . xbuf . len ( ) {
76- self . quality . resize ( self . xbuf . len ( ) , b'?' ) ;
77- }
78- let xqual = if record. has_quality ( ) {
79- record. xqual ( )
80- } else {
81- & self . quality [ ..self . xbuf . len ( ) ]
82- } ;
83- write_fastq_parts ( & mut self . buffer , index, & self . xbuf , xqual) ?;
58+ write_fastq_parts (
59+ & mut self . local_writer ,
60+ self . ctx . xheader ( ) ,
61+ & self . ctx . xbuf ( ) ,
62+ self . ctx . xqual ( ) ,
63+ ) ?;
8464 }
8565
8666 self . local_count += 1 ;
@@ -90,18 +70,18 @@ impl ParallelProcessor for Decoder {
9070 fn on_batch_complete ( & mut self ) -> binseq:: Result < ( ) > {
9171 // Lock the mutex to write to the global buffer
9272 {
93- let mut lock = self . global_buffer . lock ( ) ;
94- lock. write_all ( & self . buffer ) ?;
73+ let mut lock = self . global_writer . lock ( ) ;
74+ lock. write_all ( & self . local_writer ) ?;
9575 lock. flush ( ) ?;
9676 }
9777 // Lock the mutex to update the number of records
9878 {
99- let mut num_records = self . num_records . lock ( ) ;
100- * num_records += self . local_count ;
79+ let mut global_count = self . global_count . lock ( ) ;
80+ * global_count += self . local_count ;
10181 }
10282
10383 // Clear the local buffer and reset the local record count
104- self . buffer . clear ( ) ;
84+ self . local_writer . clear ( ) ;
10585 self . local_count = 0 ;
10686 Ok ( ( ) )
10787 }
0 commit comments