rseip_core/codec/encode/
slice.rs

1// rseip
2//
3// rseip - Ethernet/IP (CIP) in pure Rust.
4// Copyright: 2021, Joylei <leingliu@gmail.com>
5// License: MIT
6
7use super::*;
8
9pub struct SliceContainer<'a, T> {
10    inner: &'a [T],
11    bytes_count: Option<usize>,
12}
13
14impl<'a, T> SliceContainer<'a, T> {
15    #[inline]
16    pub fn new(inner: &'a [T]) -> Self {
17        Self {
18            inner,
19            bytes_count: None,
20        }
21    }
22
23    /// fast path to compute number of bytes
24    #[inline]
25    pub fn with_bytes_count(mut self, size: usize) -> Self {
26        self.bytes_count = Some(size);
27        self
28    }
29}
30
31impl<'a, T> Encode for SliceContainer<'a, T>
32where
33    T: Encode,
34{
35    #[inline]
36    fn encode_by_ref<A: Encoder>(
37        &self,
38        buf: &mut BytesMut,
39        encoder: &mut A,
40    ) -> Result<(), A::Error> {
41        for item in self.inner.iter() {
42            item.encode_by_ref(buf, encoder)?;
43        }
44        Ok(())
45    }
46
47    #[inline]
48    fn bytes_count(&self) -> usize {
49        if let Some(v) = self.bytes_count {
50            v
51        } else {
52            self.inner.iter().map(|v| v.bytes_count()).sum()
53        }
54    }
55}