@@ -18,19 +18,19 @@ use utils;
18
18
macro_rules! flag {
19
19
( $get: ident, $set: ident, $bit: expr) => (
20
20
pub fn $get( & self ) -> bool {
21
- self . inner. core. flag & $bit != 0
21
+ self . inner( ) . core. flag & $bit != 0
22
22
}
23
23
24
24
pub fn $set( & mut self ) {
25
- self . inner . core. flag |= $bit;
25
+ self . inner_mut ( ) . core. flag |= $bit;
26
26
}
27
27
)
28
28
}
29
29
30
30
31
31
/// A BAM record.
32
32
pub struct Record {
33
- pub inner : htslib:: bam1_t ,
33
+ pub inner : * mut htslib:: bam1_t ,
34
34
own : bool ,
35
35
}
36
36
@@ -41,109 +41,115 @@ unsafe impl Send for Record {}
41
41
impl Record {
42
42
/// Create an empty BAM record.
43
43
pub fn new ( ) -> Self {
44
- let mut inner;
45
- unsafe {
46
- let aux = htslib:: bam_init1 ( ) ;
47
- inner = * aux;
48
- :: libc:: free ( aux as * mut :: libc:: c_void ) ;
49
- }
50
- inner. m_data = 0 ;
51
- Record { inner : inner, own : true }
44
+ let inner = unsafe { htslib:: bam_init1 ( ) } ;
45
+ let mut record = Record { inner : inner, own : true } ;
46
+ record. inner_mut ( ) . m_data = 0 ;
47
+ record
52
48
}
53
49
54
50
pub fn from_inner ( inner : * mut htslib:: bam1_t ) -> Self {
55
- Record { inner : unsafe { * inner } , own : false }
51
+ Record { inner : inner, own : false }
56
52
}
57
53
58
54
fn data ( & self ) -> & [ u8 ] {
59
- unsafe { slice:: from_raw_parts ( self . inner . data , self . inner . l_data as usize ) }
55
+ unsafe { slice:: from_raw_parts ( self . inner ( ) . data , self . inner ( ) . l_data as usize ) }
56
+ }
57
+
58
+ #[ inline]
59
+ pub fn inner_mut ( & mut self ) -> & mut htslib:: bam1_t {
60
+ unsafe { & mut * self . inner }
61
+ }
62
+
63
+ #[ inline]
64
+ pub fn inner ( & self ) -> & htslib:: bam1_t {
65
+ unsafe { & * self . inner }
60
66
}
61
67
62
68
/// Get target id.
63
69
pub fn tid ( & self ) -> i32 {
64
- self . inner . core . tid
70
+ self . inner ( ) . core . tid
65
71
}
66
72
67
73
/// Set target id.
68
74
pub fn set_tid ( & mut self , tid : i32 ) {
69
- self . inner . core . tid = tid;
75
+ self . inner_mut ( ) . core . tid = tid;
70
76
}
71
77
72
78
/// Get position.
73
79
pub fn pos ( & self ) -> i32 {
74
- self . inner . core . pos
80
+ self . inner ( ) . core . pos
75
81
}
76
82
77
83
/// Set position.
78
84
pub fn set_pos ( & mut self , pos : i32 ) {
79
- self . inner . core . pos = pos;
85
+ self . inner_mut ( ) . core . pos = pos;
80
86
}
81
87
82
88
pub fn bin ( & self ) -> u16 {
83
- self . inner . core . bin
89
+ self . inner ( ) . core . bin
84
90
}
85
91
86
92
pub fn set_bin ( & mut self , bin : u16 ) {
87
- self . inner . core . bin = bin;
93
+ self . inner_mut ( ) . core . bin = bin;
88
94
}
89
95
90
96
/// Get MAPQ.
91
97
pub fn mapq ( & self ) -> u8 {
92
- self . inner . core . qual
98
+ self . inner ( ) . core . qual
93
99
}
94
100
95
101
/// Set MAPQ.
96
102
pub fn set_mapq ( & mut self , mapq : u8 ) {
97
- self . inner . core . qual = mapq;
103
+ self . inner_mut ( ) . core . qual = mapq;
98
104
}
99
105
100
106
/// Get raw flags.
101
107
pub fn flags ( & self ) -> u16 {
102
- self . inner . core . flag
108
+ self . inner ( ) . core . flag
103
109
}
104
110
105
111
/// Set raw flags.
106
112
pub fn set_flags ( & mut self , flags : u16 ) {
107
- self . inner . core . flag = flags;
113
+ self . inner_mut ( ) . core . flag = flags;
108
114
}
109
115
110
116
/// Unset all flags.
111
117
pub fn unset_flags ( & mut self ) {
112
- self . inner . core . flag = 0 ;
118
+ self . inner_mut ( ) . core . flag = 0 ;
113
119
}
114
120
115
121
/// Get target id of mate.
116
122
pub fn mtid ( & self ) -> i32 {
117
- self . inner . core . mtid
123
+ self . inner ( ) . core . mtid
118
124
}
119
125
120
126
/// Set target id of mate.
121
127
pub fn set_mtid ( & mut self , mtid : i32 ) {
122
- self . inner . core . mtid = mtid;
128
+ self . inner_mut ( ) . core . mtid = mtid;
123
129
}
124
130
125
131
/// Get mate position.
126
132
pub fn mpos ( & self ) -> i32 {
127
- self . inner . core . mpos
133
+ self . inner ( ) . core . mpos
128
134
}
129
135
130
136
/// Set mate position.
131
137
pub fn set_mpos ( & mut self , mpos : i32 ) {
132
- self . inner . core . mpos = mpos;
138
+ self . inner_mut ( ) . core . mpos = mpos;
133
139
}
134
140
135
141
/// Get insert size.
136
142
pub fn insert_size ( & self ) -> i32 {
137
- self . inner . core . isize
143
+ self . inner ( ) . core . isize
138
144
}
139
145
140
146
/// Set insert size.
141
147
pub fn set_insert_size ( & mut self , insert_size : i32 ) {
142
- self . inner . core . isize = insert_size;
148
+ self . inner_mut ( ) . core . isize = insert_size;
143
149
}
144
150
145
151
fn qname_len ( & self ) -> usize {
146
- self . inner . core . l_qname as usize
152
+ self . inner ( ) . core . l_qname as usize
147
153
}
148
154
149
155
/// Get qname (read name).
@@ -153,25 +159,25 @@ impl Record {
153
159
154
160
/// Set variable length data (qname, cigar, seq, qual).
155
161
pub fn set ( & mut self , qname : & [ u8 ] , cigar : & [ Cigar ] , seq : & [ u8 ] , qual : & [ u8 ] ) {
156
- self . inner . l_data = ( qname. len ( ) + 1 + cigar. len ( ) * 4 + seq. len ( ) / 2 + qual. len ( ) ) as i32 ;
162
+ self . inner_mut ( ) . l_data = ( qname. len ( ) + 1 + cigar. len ( ) * 4 + seq. len ( ) / 2 + qual. len ( ) ) as i32 ;
157
163
158
- if self . inner . m_data < self . inner . l_data {
164
+ if self . inner ( ) . m_data < self . inner ( ) . l_data {
159
165
160
- self . inner . m_data = self . inner . l_data ;
161
- self . inner . m_data += 32 - self . inner . m_data % 32 ;
166
+ self . inner_mut ( ) . m_data = self . inner ( ) . l_data ;
167
+ self . inner_mut ( ) . m_data += 32 - self . inner ( ) . m_data % 32 ;
162
168
unsafe {
163
- self . inner . data = :: libc:: realloc (
164
- self . inner . data as * mut :: libc:: c_void , self . inner . m_data as usize
169
+ self . inner_mut ( ) . data = :: libc:: realloc (
170
+ self . inner ( ) . data as * mut :: libc:: c_void , self . inner ( ) . m_data as usize
165
171
) as * mut u8 ;
166
172
}
167
173
}
168
174
169
- let mut data = unsafe { slice:: from_raw_parts_mut ( self . inner . data , self . inner . l_data as usize ) } ;
175
+ let mut data = unsafe { slice:: from_raw_parts_mut ( ( * self . inner ) . data , self . inner ( ) . l_data as usize ) } ;
170
176
// qname
171
177
utils:: copy_memory ( qname, data) ;
172
178
data[ qname. len ( ) ] = b'\0' ;
173
179
let mut i = qname. len ( ) + 1 ;
174
- self . inner . core . l_qname = i as u8 ;
180
+ self . inner_mut ( ) . core . l_qname = i as u8 ;
175
181
176
182
// cigar
177
183
{
@@ -181,7 +187,7 @@ impl Record {
181
187
for ( i, c) in cigar. iter ( ) . enumerate ( ) {
182
188
cigar_data[ i] = c. encode ( ) ;
183
189
}
184
- self . inner . core . n_cigar = cigar. len ( ) as u16 ;
190
+ self . inner_mut ( ) . core . n_cigar = cigar. len ( ) as u16 ;
185
191
i += cigar. len ( ) * 4 ;
186
192
}
187
193
@@ -190,7 +196,7 @@ impl Record {
190
196
for j in ( 0 ..seq. len ( ) ) . step ( 2 ) {
191
197
data[ i + j / 2 ] = ENCODE_BASE [ seq[ j] as usize ] << 4 | ENCODE_BASE [ seq[ j + 1 ] as usize ] ;
192
198
}
193
- self . inner . core . l_qseq = seq. len ( ) as i32 ;
199
+ self . inner_mut ( ) . core . l_qseq = seq. len ( ) as i32 ;
194
200
i += ( seq. len ( ) + 1 ) / 2 ;
195
201
}
196
202
@@ -199,7 +205,7 @@ impl Record {
199
205
}
200
206
201
207
fn cigar_len ( & self ) -> usize {
202
- self . inner . core . n_cigar as usize
208
+ self . inner ( ) . core . n_cigar as usize
203
209
}
204
210
205
211
/// Get cigar sequence.
@@ -224,7 +230,7 @@ impl Record {
224
230
}
225
231
226
232
fn seq_len ( & self ) -> usize {
227
- self . inner . core . l_qseq as usize
233
+ self . inner ( ) . core . l_qseq as usize
228
234
}
229
235
230
236
/// Get read sequence.
@@ -244,7 +250,7 @@ impl Record {
244
250
245
251
/// Get auxiliary data (tags).
246
252
pub fn aux ( & self , tag : & [ u8 ] ) -> Option < Aux > {
247
- let aux = unsafe { htslib:: bam_aux_get ( & self . inner , ffi:: CString :: new ( tag) . unwrap ( ) . as_ptr ( ) as * mut i8 ) } ;
253
+ let aux = unsafe { htslib:: bam_aux_get ( self . inner , ffi:: CString :: new ( tag) . unwrap ( ) . as_ptr ( ) as * mut i8 ) } ;
248
254
249
255
unsafe {
250
256
if aux. is_null ( ) {
@@ -269,11 +275,11 @@ impl Record {
269
275
let ctag = tag. as_ptr ( ) as * mut i8 ;
270
276
unsafe {
271
277
match * value {
272
- Aux :: Integer ( v) => htslib:: bam_aux_append ( & mut self . inner , ctag, b'i' as i8 , 4 , [ v] . as_mut_ptr ( ) as * mut u8 ) ,
273
- Aux :: Float ( v) => htslib:: bam_aux_append ( & mut self . inner , ctag, b'f' as i8 , 4 , [ v] . as_mut_ptr ( ) as * mut u8 ) ,
274
- Aux :: Char ( v) => htslib:: bam_aux_append ( & mut self . inner , ctag, b'A' as i8 , 1 , [ v] . as_mut_ptr ( ) as * mut u8 ) ,
278
+ Aux :: Integer ( v) => htslib:: bam_aux_append ( self . inner , ctag, b'i' as i8 , 4 , [ v] . as_mut_ptr ( ) as * mut u8 ) ,
279
+ Aux :: Float ( v) => htslib:: bam_aux_append ( self . inner , ctag, b'f' as i8 , 4 , [ v] . as_mut_ptr ( ) as * mut u8 ) ,
280
+ Aux :: Char ( v) => htslib:: bam_aux_append ( self . inner , ctag, b'A' as i8 , 1 , [ v] . as_mut_ptr ( ) as * mut u8 ) ,
275
281
Aux :: String ( v) => htslib:: bam_aux_append (
276
- & mut self . inner ,
282
+ self . inner ,
277
283
ctag,
278
284
b'Z' as i8 ,
279
285
( v. len ( ) + 1 ) as i32 ,
@@ -301,7 +307,7 @@ impl Record {
301
307
impl Drop for Record {
302
308
fn drop ( & mut self ) {
303
309
if self . own {
304
- unsafe { :: libc :: free ( self . inner . data as * mut :: libc :: c_void ) } ;
310
+ unsafe { htslib :: bam_destroy1 ( self . inner ) } ;
305
311
}
306
312
}
307
313
}
0 commit comments