sigalign_core/reference/sequence_storage/
mod.rs

1/*!
2Provides the `SequenceStorage` and its basic implementations.
3*/
4
5use super::SequenceBuffer;
6pub trait SequenceStorage {
7    type Buffer: SequenceBuffer;
8
9    fn get_buffer(&self) -> Self::Buffer;
10    fn fill_buffer(&self, target_index: u32, buffer: &mut Self::Buffer);
11    fn num_targets(&self) -> u32;
12
13    fn get_concatenated_sequence_with_boundaries_of_targets(&self) -> (
14        Vec<u8>,
15        Vec<u32>,
16    ) {
17        let num_targets = self.num_targets();
18        let mut boundaries = Vec::with_capacity(num_targets as usize + 1);
19        boundaries.push(0);
20        let mut accumulated_length = 0;
21
22        let mut buffer = self.get_buffer();
23        let mut concatenated_sequence = Vec::new();
24        for target_index in 0..num_targets {
25            self.fill_buffer(target_index, &mut buffer);
26            let target_sequence = buffer.buffered_sequence();
27            accumulated_length += target_sequence.len() as u32;
28            boundaries.push(accumulated_length);
29            concatenated_sequence.extend_from_slice(target_sequence)
30        }
31
32        (
33            concatenated_sequence,
34            boundaries,
35        )
36    }
37}