sigalign_core/reference/extensions/
io.rs

1use super::{
2    Reference,
3    PatternIndex,
4    SequenceStorage,
5};
6use std::io::{Write, Read, Error};
7
8/// Save and load the structure
9pub trait Serialize {
10    fn save_to<W>(&self, writer: W) -> Result<(), Error> where
11        W: Write;
12    fn load_from<R>(reader: R) -> Result<Self, Error> where
13        R: Read,
14        Self: Sized;
15}
16
17use capwriter::{Save, Load};
18impl<I, S> Serialize for Reference<I, S> where
19    I: PatternIndex + Serialize,
20    S: SequenceStorage + Serialize,
21{
22    fn save_to<W>(&self, mut writer: W) -> Result<(), Error> where
23        W: Write
24    {
25        self.target_boundaries.save_to(&mut writer)?;
26        self.pattern_index.save_to(&mut writer)?;
27        self.sequence_storage.save_to(&mut writer)?;
28        Ok(())
29    }
30    fn load_from<R>(mut reader: R) -> Result<Self, Error> where
31        R: Read,
32        Self: Sized
33    {
34        let target_boundaries = Vec::load_from(&mut reader)?;
35        let pattern_index = I::load_from(&mut reader)?;
36        let sequence_storage = S::load_from(&mut reader)?;
37        Ok(Self {
38            target_boundaries,
39            pattern_index,
40            sequence_storage,
41        })
42    }
43}
44
45/// Provides an estimate of the size of the object when saved.
46pub trait EstimateSize {
47    fn serialized_size(&self) -> usize;
48}
49
50impl<I, S> EstimateSize for Reference<I, S> where
51    I: PatternIndex + EstimateSize,
52    S: SequenceStorage + EstimateSize,
53{
54    fn serialized_size(&self) -> usize {
55        (self.target_boundaries.len() * std::mem::size_of::<u32>())
56        + self.sequence_storage.serialized_size()
57        + self.pattern_index.serialized_size()
58    }
59}