sigalign_core/reference/extensions/
io.rs1use super::{
2 Reference,
3 PatternIndex,
4 SequenceStorage,
5};
6use std::io::{Write, Read, Error};
7
8pub 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
45pub 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}