@@ -224,6 +224,46 @@ pub fn unpack_base(base: u8) -> u8 {
224224 b"ACTG" [ base as usize ]
225225}
226226
227+ /// Unpack a 2-bit encoded kmer into corresponding `ACTG` characters.
228+ /// Slice the returned array to the correct length.
229+ #[ inline( always) ]
230+ pub fn unpack_kmer ( kmer : u64 ) -> [ u8 ; 32 ] {
231+ std:: array:: from_fn ( |i| unpack_base ( ( ( kmer >> ( 2 * i) ) & 3 ) as u8 ) )
232+ }
233+ /// Unpack a 2-bit encoded kmer into corresponding `ACTG` character.
234+ #[ inline( always) ]
235+ pub fn unpack_kmer_into_vec ( kmer : u64 , k : usize , out : & mut Vec < u8 > ) {
236+ out. clear ( ) ;
237+ out. extend ( ( 0 ..k) . map ( |i| unpack_base ( ( ( kmer >> ( 2 * i) ) & 3 ) as u8 ) ) ) ;
238+ }
239+ /// Unpack a 2-bit encoded kmer into corresponding `ACTG` character.
240+ #[ inline( always) ]
241+ pub fn unpack_kmer_to_vec ( kmer : u64 , k : usize ) -> Vec < u8 > {
242+ let mut out = vec ! [ ] ;
243+ unpack_kmer_into_vec ( kmer, k, & mut out) ;
244+ out
245+ }
246+
247+ /// Unpack a 2-bit encoded kmer into corresponding `ACTG` characters.
248+ /// Slice the returned array to the correct length.
249+ #[ inline( always) ]
250+ pub fn unpack_kmer_u128 ( kmer : u128 ) -> [ u8 ; 64 ] {
251+ std:: array:: from_fn ( |i| unpack_base ( ( ( kmer >> ( 2 * i) ) & 3 ) as u8 ) )
252+ }
253+ /// Unpack a 2-bit encoded kmer into corresponding `ACTG` character.
254+ #[ inline( always) ]
255+ pub fn unpack_kmer_u128_into_vec ( kmer : u128 , k : usize , out : & mut Vec < u8 > ) {
256+ out. clear ( ) ;
257+ out. extend ( ( 0 ..k) . map ( |i| unpack_base ( ( ( kmer >> ( 2 * i) ) & 3 ) as u8 ) ) ) ;
258+ }
259+ /// Unpack a 2-bit encoded kmer into corresponding `ACTG` character.
260+ #[ inline( always) ]
261+ pub fn unpack_kmer_u128_to_vec ( kmer : u128 , k : usize ) -> Vec < u8 > {
262+ let mut out = vec ! [ ] ;
263+ unpack_kmer_u128_into_vec ( kmer, k, & mut out) ;
264+ out
265+ }
266+
227267/// Complement an ASCII character: `A<>T` and `C<>G`.
228268#[ inline( always) ]
229269pub const fn complement_char ( base : u8 ) -> u8 {
0 commit comments