1pub mod eluv;
2pub mod extended_line;
3
4#[macro_export]
9macro_rules! impl_complex_encoder {
10 ($t:ident, $c:ident) => {
11 impl crate::encoder::Encoder<$c> for $t {
12 fn partial_encode(
13 &self,
14 context: &mut $c,
15 data: &mut dyn Iterator<Item = crate::binary::Bit>,
16 ) -> Result<crate::encoder::EncoderResult, Box<dyn std::error::Error>> {
17 let mut is_data_still_available = crate::encoder::EncoderResult::Success;
18 for encoder in &self.methods {
19 if let crate::encoder::EncoderResult::NoDataLeft =
20 encoder.partial_encode(context, data)?
21 {
22 is_data_still_available = crate::encoder::EncoderResult::NoDataLeft;
23 break;
24 }
25 }
26 Ok(is_data_still_available)
27 }
28 }
29
30 impl crate::encoder::Capacity for $t {
31 fn bitrate(&self) -> usize {
32 self.methods
33 .iter()
34 .fold(0, |acc, encoder| acc + encoder.bitrate())
35 }
36 }
37 };
38}
39
40#[macro_export]
45macro_rules! impl_complex_decoder {
46 ($t:ident, $c:ident) => {
47 impl crate::decoder::Decoder<$c> for $t {
48 fn partial_decode(
49 &self,
50 context: &$c,
51 ) -> Result<Vec<crate::binary::Bit>, crate::context::ContextError> {
52 let mut secret_data = Vec::default();
53 for decoder in &self.methods {
54 let mut result = decoder.partial_decode(context)?;
55 secret_data.append(&mut result);
56 }
57 Ok(secret_data)
58 }
59 }
60 };
61}