@@ -18,6 +18,7 @@ pub mod record_serde;
18
18
19
19
use std:: ffi;
20
20
use std:: path:: Path ;
21
+ use std:: rc:: Rc ;
21
22
use std:: slice;
22
23
use std:: str;
23
24
@@ -93,9 +94,6 @@ pub trait Read: Sized {
93
94
/// Return the header.
94
95
fn header ( & self ) -> & HeaderView ;
95
96
96
- /// Return the header, mutable.
97
- fn header_mut ( & mut self ) -> & mut HeaderView ;
98
-
99
97
/// Seek to the given virtual offset in the file
100
98
fn seek ( & mut self , offset : i64 ) -> Result < ( ) > {
101
99
let htsfile = unsafe { self . htsfile ( ) . as_ref ( ) } . expect ( "bug: null pointer to htsFile" ) ;
@@ -158,7 +156,7 @@ fn path_as_bytes<'a, P: 'a + AsRef<Path>>(path: P, must_exist: bool) -> Result<V
158
156
#[ derive( Debug ) ]
159
157
pub struct Reader {
160
158
htsfile : * mut htslib:: htsFile ,
161
- header : HeaderView ,
159
+ header : Rc < HeaderView > ,
162
160
}
163
161
164
162
unsafe impl Send for Reader { }
@@ -194,7 +192,7 @@ impl Reader {
194
192
let header = unsafe { htslib:: sam_hdr_read ( htsfile) } ;
195
193
Ok ( Reader {
196
194
htsfile,
197
- header : HeaderView :: new ( header) ,
195
+ header : Rc :: new ( HeaderView :: new ( header) ) ,
198
196
} )
199
197
}
200
198
@@ -203,7 +201,13 @@ impl Reader {
203
201
record : * mut htslib:: bam1_t ,
204
202
) -> i32 {
205
203
let mut _self = unsafe { ( data as * mut Self ) . as_mut ( ) . unwrap ( ) } ;
206
- unsafe { htslib:: sam_read1 ( _self. htsfile ( ) , _self. header_mut ( ) . inner_mut ( ) , record) }
204
+ unsafe {
205
+ htslib:: sam_read1 (
206
+ _self. htsfile ( ) ,
207
+ _self. header ( ) . inner_ptr ( ) as * mut hts_sys:: sam_hdr_t ,
208
+ record,
209
+ )
210
+ }
207
211
}
208
212
209
213
/// Iterator over the records between the (optional) virtual offsets `start` and `end`
@@ -262,15 +266,15 @@ impl Read for Reader {
262
266
match unsafe {
263
267
htslib:: sam_read1 (
264
268
self . htsfile ,
265
- self . header . inner_mut ( ) ,
269
+ self . header ( ) . inner_ptr ( ) as * mut hts_sys :: sam_hdr_t ,
266
270
record. inner_ptr_mut ( ) ,
267
271
)
268
272
} {
269
273
-1 => Ok ( false ) ,
270
274
-2 => Err ( Error :: TruncatedRecord ) ,
271
275
-4 => Err ( Error :: InvalidRecord ) ,
272
276
_ => {
273
- record. set_header ( self . header ( ) . clone ( ) ) ;
277
+ record. set_header ( Rc :: clone ( & self . header ) ) ;
274
278
275
279
Ok ( true )
276
280
}
@@ -303,10 +307,6 @@ impl Read for Reader {
303
307
fn header ( & self ) -> & HeaderView {
304
308
& self . header
305
309
}
306
-
307
- fn header_mut ( & mut self ) -> & mut HeaderView {
308
- & mut self . header
309
- }
310
310
}
311
311
312
312
impl Drop for Reader {
@@ -320,7 +320,7 @@ impl Drop for Reader {
320
320
#[ derive( Debug ) ]
321
321
pub struct IndexedReader {
322
322
htsfile : * mut htslib:: htsFile ,
323
- header : HeaderView ,
323
+ header : Rc < HeaderView > ,
324
324
idx : * mut htslib:: hts_idx_t ,
325
325
itr : Option < * mut htslib:: hts_itr_t > ,
326
326
}
@@ -365,7 +365,7 @@ impl IndexedReader {
365
365
} else {
366
366
Ok ( IndexedReader {
367
367
htsfile,
368
- header : HeaderView :: new ( header) ,
368
+ header : Rc :: new ( HeaderView :: new ( header) ) ,
369
369
idx,
370
370
itr : None ,
371
371
} )
@@ -392,7 +392,7 @@ impl IndexedReader {
392
392
} else {
393
393
Ok ( IndexedReader {
394
394
htsfile,
395
- header : HeaderView :: new ( header) ,
395
+ header : Rc :: new ( HeaderView :: new ( header) ) ,
396
396
idx,
397
397
itr : None ,
398
398
} )
@@ -424,7 +424,13 @@ impl IndexedReader {
424
424
}
425
425
let rstr = ffi:: CString :: new ( region) . unwrap ( ) ;
426
426
let rptr = rstr. as_ptr ( ) ;
427
- let itr = unsafe { htslib:: sam_itr_querys ( self . idx , self . header . inner_mut ( ) , rptr) } ;
427
+ let itr = unsafe {
428
+ htslib:: sam_itr_querys (
429
+ self . idx ,
430
+ self . header ( ) . inner_ptr ( ) as * mut hts_sys:: sam_hdr_t ,
431
+ rptr,
432
+ )
433
+ } ;
428
434
if itr. is_null ( ) {
429
435
self . itr = None ;
430
436
Err ( Error :: Fetch )
@@ -441,7 +447,13 @@ impl IndexedReader {
441
447
let _self = unsafe { ( data as * mut Self ) . as_mut ( ) . unwrap ( ) } ;
442
448
match _self. itr {
443
449
Some ( itr) => itr_next ( _self. htsfile , itr, record) , // read fetched region
444
- None => unsafe { htslib:: sam_read1 ( _self. htsfile , _self. header . inner_mut ( ) , record) } , // ordinary reading
450
+ None => unsafe {
451
+ htslib:: sam_read1 (
452
+ _self. htsfile ,
453
+ _self. header ( ) . inner_ptr ( ) as * mut hts_sys:: sam_hdr_t ,
454
+ record,
455
+ )
456
+ } , // ordinary reading
445
457
}
446
458
}
447
459
@@ -464,7 +476,7 @@ impl Read for IndexedReader {
464
476
-2 => Err ( Error :: TruncatedRecord ) ,
465
477
-4 => Err ( Error :: InvalidRecord ) ,
466
478
_ => {
467
- record. set_header ( self . header ( ) . clone ( ) ) ;
479
+ record. set_header ( Rc :: clone ( & self . header ) ) ;
468
480
469
481
Ok ( true )
470
482
}
@@ -500,10 +512,6 @@ impl Read for IndexedReader {
500
512
fn header ( & self ) -> & HeaderView {
501
513
& self . header
502
514
}
503
-
504
- fn header_mut ( & mut self ) -> & mut HeaderView {
505
- & mut self . header
506
- }
507
515
}
508
516
509
517
impl Drop for IndexedReader {
@@ -539,7 +547,7 @@ impl Format {
539
547
#[ derive( Debug ) ]
540
548
pub struct Writer {
541
549
f : * mut htslib:: htsFile ,
542
- header : HeaderView ,
550
+ header : Rc < HeaderView > ,
543
551
}
544
552
545
553
unsafe impl Send for Writer { }
@@ -615,7 +623,7 @@ impl Writer {
615
623
616
624
Ok ( Writer {
617
625
f,
618
- header : HeaderView :: new ( header_record) ,
626
+ header : Rc :: new ( HeaderView :: new ( header_record) ) ,
619
627
} )
620
628
}
621
629
@@ -1544,7 +1552,7 @@ CCCCCCCCCCCCCCCCCCC"[..],
1544
1552
let sam_recs: Vec < Record > = sam
1545
1553
. split ( |x| * x == b'\n' )
1546
1554
. filter ( |x| x. len ( ) > 0 && x[ 0 ] != b'@' )
1547
- . map ( |line| Record :: from_sam ( rdr. header_mut ( ) , line) . unwrap ( ) )
1555
+ . map ( |line| Record :: from_sam ( rdr. header ( ) , line) . unwrap ( ) )
1548
1556
. collect ( ) ;
1549
1557
1550
1558
for ( b1, s1) in bam_recs. iter ( ) . zip ( sam_recs. iter ( ) ) {
0 commit comments