@@ -92,6 +92,9 @@ pub trait Read: Sized {
92
92
/// Return the header.
93
93
fn header ( & self ) -> & HeaderView ;
94
94
95
+ /// Return the header, mutable.
96
+ fn header_mut ( & mut self ) -> & mut HeaderView ;
97
+
95
98
/// Seek to the given virtual offset in the file
96
99
fn seek ( & mut self , offset : i64 ) -> Result < ( ) > {
97
100
let htsfile = unsafe { self . htsfile ( ) . as_ref ( ) } . expect ( "bug: null pointer to htsFile" ) ;
@@ -198,8 +201,8 @@ impl Reader {
198
201
data : * mut :: std:: os:: raw:: c_void ,
199
202
record : * mut htslib:: bam1_t ,
200
203
) -> i32 {
201
- let _self = unsafe { & * ( data as * mut Self ) } ;
202
- unsafe { htslib:: sam_read1 ( _self. htsfile ( ) , & mut _self. header ( ) . inner ( ) , record) }
204
+ let mut _self = unsafe { ( data as * mut Self ) . as_mut ( ) . unwrap ( ) } ;
205
+ unsafe { htslib:: sam_read1 ( _self. htsfile ( ) , _self. header_mut ( ) . inner_mut ( ) , record) }
203
206
}
204
207
205
208
/// Iterator over the records between the (optional) virtual offsets `start` and `end`
@@ -258,7 +261,7 @@ impl Read for Reader {
258
261
match unsafe {
259
262
htslib:: sam_read1 (
260
263
self . htsfile ,
261
- & mut self . header . inner ( ) ,
264
+ self . header . inner_mut ( ) ,
262
265
record. inner_ptr_mut ( ) ,
263
266
)
264
267
} {
@@ -295,6 +298,10 @@ impl Read for Reader {
295
298
fn header ( & self ) -> & HeaderView {
296
299
& self . header
297
300
}
301
+
302
+ fn header_mut ( & mut self ) -> & mut HeaderView {
303
+ & mut self . header
304
+ }
298
305
}
299
306
300
307
impl Drop for Reader {
@@ -412,7 +419,7 @@ impl IndexedReader {
412
419
}
413
420
let rstr = ffi:: CString :: new ( region) . unwrap ( ) ;
414
421
let rptr = rstr. as_ptr ( ) ;
415
- let itr = unsafe { htslib:: sam_itr_querys ( self . idx , & mut self . header . inner ( ) , rptr) } ;
422
+ let itr = unsafe { htslib:: sam_itr_querys ( self . idx , self . header . inner_mut ( ) , rptr) } ;
416
423
if itr. is_null ( ) {
417
424
self . itr = None ;
418
425
Err ( Error :: Fetch )
@@ -426,10 +433,10 @@ impl IndexedReader {
426
433
data : * mut :: std:: os:: raw:: c_void ,
427
434
record : * mut htslib:: bam1_t ,
428
435
) -> i32 {
429
- let _self = unsafe { & * ( data as * mut Self ) } ;
436
+ let _self = unsafe { ( data as * mut Self ) . as_mut ( ) . unwrap ( ) } ;
430
437
match _self. itr {
431
438
Some ( itr) => itr_next ( _self. htsfile , itr, record) , // read fetched region
432
- None => unsafe { htslib:: sam_read1 ( _self. htsfile , & mut _self. header . inner ( ) , record) } , // ordinary reading
439
+ None => unsafe { htslib:: sam_read1 ( _self. htsfile , _self. header . inner_mut ( ) , record) } , // ordinary reading
433
440
}
434
441
}
435
442
@@ -484,6 +491,10 @@ impl Read for IndexedReader {
484
491
fn header ( & self ) -> & HeaderView {
485
492
& self . header
486
493
}
494
+
495
+ fn header_mut ( & mut self ) -> & mut HeaderView {
496
+ & mut self . header
497
+ }
487
498
}
488
499
489
500
impl Drop for IndexedReader {
@@ -612,7 +623,7 @@ impl Writer {
612
623
///
613
624
/// * `record` - the record to write
614
625
pub fn write ( & mut self , record : & record:: Record ) -> Result < ( ) > {
615
- if unsafe { htslib:: sam_write1 ( self . f , & self . header . inner ( ) , record. inner_ptr ( ) ) } == -1 {
626
+ if unsafe { htslib:: sam_write1 ( self . f , self . header . inner ( ) , record. inner_ptr ( ) ) } == -1 {
616
627
Err ( Error :: Write )
617
628
} else {
618
629
Ok ( ( ) )
@@ -819,8 +830,8 @@ impl HeaderView {
819
830
}
820
831
821
832
#[ inline]
822
- pub fn inner ( & self ) -> htslib:: bam_hdr_t {
823
- unsafe { ( * self . inner ) }
833
+ pub fn inner ( & self ) -> & htslib:: bam_hdr_t {
834
+ unsafe { self . inner . as_ref ( ) . unwrap ( ) }
824
835
}
825
836
826
837
#[ inline]
@@ -829,9 +840,14 @@ impl HeaderView {
829
840
self . inner
830
841
}
831
842
843
+ #[ inline]
844
+ pub fn inner_mut ( & mut self ) -> & mut htslib:: bam_hdr_t {
845
+ unsafe { self . inner . as_mut ( ) . unwrap ( ) }
846
+ }
847
+
832
848
#[ inline]
833
849
// Mutable pointer to bam_hdr_t struct
834
- pub fn inner_ptr_mut ( & self ) -> * mut htslib:: bam_hdr_t {
850
+ pub fn inner_ptr_mut ( & mut self ) -> * mut htslib:: bam_hdr_t {
835
851
self . inner
836
852
}
837
853
@@ -1249,12 +1265,12 @@ CCCCCCCCCCCCCCCCCCC"[..],
1249
1265
. push_tag ( b"SN" , & "1" )
1250
1266
. push_tag ( b"LN" , & 10000000 ) ,
1251
1267
) ;
1252
- let header = HeaderView :: from_header ( & _header) ;
1268
+ let mut header = HeaderView :: from_header ( & _header) ;
1253
1269
1254
1270
let line =
1255
1271
b"blah1 0 1 1 255 1M * 0 0 A F CB:Z:AAAA-1 UR:Z:AAAA UB:Z:AAAA GX:Z:G1 xf:i:1 fx:Z:G1\t li:i:0\t tf:Z:cC" ;
1256
1272
1257
- let mut rec = Record :: from_sam ( & header, line) . unwrap ( ) ;
1273
+ let mut rec = Record :: from_sam ( & mut header, line) . unwrap ( ) ;
1258
1274
assert_eq ! ( rec. qname( ) , b"blah1" ) ;
1259
1275
rec. set_qname ( b"r0" ) ;
1260
1276
assert_eq ! ( rec. qname( ) , b"r0" ) ;
@@ -1492,7 +1508,7 @@ CCCCCCCCCCCCCCCCCCC"[..],
1492
1508
let sam_recs: Vec < Record > = sam
1493
1509
. split ( |x| * x == b'\n' )
1494
1510
. filter ( |x| x. len ( ) > 0 && x[ 0 ] != b'@' )
1495
- . map ( |line| Record :: from_sam ( rdr. header ( ) , line) . unwrap ( ) )
1511
+ . map ( |line| Record :: from_sam ( rdr. header_mut ( ) , line) . unwrap ( ) )
1496
1512
. collect ( ) ;
1497
1513
1498
1514
for ( b1, s1) in bam_recs. iter ( ) . zip ( sam_recs. iter ( ) ) {
0 commit comments