protocol/types/
vec.rs

1use crate::{hint, types, util, Parcel, Error, Settings};
2use std::io::prelude::*;
3use std;
4
5/// A newtype wrapping `Vec<T>` but with a custom length prefix type.
6#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
7pub struct Vec<S: types::Integer, T: Parcel>
8{
9    /// The inner `Vec<T>`.
10    pub elements: std::vec::Vec<T>,
11    _a: std::marker::PhantomData<S>,
12}
13
14impl<S: types::Integer, T: Parcel> Vec<S,T>
15{
16    /// Creates a new `Vec` from a list of elements.
17    pub fn new(elements: std::vec::Vec<T>) -> Self {
18        Vec { elements: elements, _a: std::marker::PhantomData }
19    }
20}
21
22impl<S: types::Integer, T: Parcel> Parcel for Vec<S, T>
23{
24    const TYPE_NAME: &'static str = "protocol::Vec<S,T>";
25
26    fn read_field(read: &mut dyn Read,
27                  settings: &Settings,
28                  hints: &mut hint::Hints) -> Result<Self, Error> {
29        let elements = util::read_list_ext::<S,T>(read, settings, hints)?;
30        Ok(Self::new(elements))
31    }
32
33    fn write_field(&self, write: &mut dyn Write,
34                   settings: &Settings,
35                   hints: &mut hint::Hints) -> Result<(), Error> {
36        util::write_list_ext::<S,T,_>(self.elements.iter(), write, settings, hints)
37    }
38}
39
40
41impl<S, T> std::fmt::Debug for Vec<S, T>
42    where S: types::Integer, T: Parcel + std::fmt::Debug {
43    fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {
44        self.elements.fmt(fmt)
45    }
46}
47
48impl<S, T> std::ops::Deref for Vec<S, T>
49    where S: types::Integer, T: Parcel {
50    type Target = [T];
51
52    fn deref(&self) -> &[T] { &self.elements[..] }
53}
54
55impl<S, T> std::ops::DerefMut for Vec<S, T>
56    where S: types::Integer, T: Parcel {
57    fn deref_mut(&mut self) -> &mut [T] { &mut self.elements }
58}
59
60impl<S, T> AsRef<[T]> for Vec<S, T>
61    where S: types::Integer, T: Parcel {
62    fn as_ref(&self) -> &[T] { &self.elements[..] }
63}
64
65impl<S, T> AsMut<[T]> for Vec<S, T>
66    where S: types::Integer, T: Parcel {
67    fn as_mut(&mut self) -> &mut [T] { &mut self.elements }
68}
69
70/// Stuff relating to `std::vec::Vec<T>`.
71mod std_vec {
72    use crate::{hint, util, Error, Parcel, Settings};
73    use std::io::prelude::*;
74
75    impl<T: Parcel> Parcel for Vec<T>
76    {
77        const TYPE_NAME: &'static str = "Vec<T>";
78
79        fn read_field(read: &mut dyn Read,
80                      settings: &Settings,
81                      hints: &mut hint::Hints) -> Result<Self, Error> {
82            util::read_list(read, settings, hints)
83        }
84
85        fn write_field(&self,
86                       write: &mut dyn Write,
87                       settings: &Settings,
88                       hints: &mut hint::Hints) -> Result<(), Error> {
89            util::write_list(self.iter(), write, settings, hints)
90        }
91    }
92}
93