1use crate::{hint, types, util, Parcel, Error, Settings};
2use std::io::prelude::*;
3use std;
4
5#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
7pub struct Vec<S: types::Integer, T: Parcel>
8{
9 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 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
70mod 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