Skip to content

Commit 45d4f89

Browse files
committed
Remove trait constraits from Parcel
1 parent 49e8f6c commit 45d4f89

File tree

5 files changed

+66
-28
lines changed

5 files changed

+66
-28
lines changed

src/parcel.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use std::io::prelude::*;
2-
use std::{fmt, io};
2+
use std::io;
33

44
/// A value which can be read and written.
5-
pub trait Parcel : Clone + fmt::Debug + PartialEq
5+
pub trait Parcel : Sized + PartialEq
66
{
77
/// Reads a value from a stream.
88
fn read(read: &mut Read) -> Result<Self, ::Error>;

src/primitives/array.rs

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,6 @@ use {primitives, Parcel, Error};
33
use std::io::prelude::*;
44
use std;
55

6-
/// The integer type that we will use to send length prefixes.
7-
pub type SizeType = u32;
8-
96
/// An dynamic array type with a custom size prefix type.
107
#[derive(Clone, Debug, PartialEq)]
118
pub struct DynArray<S: primitives::Integer, T: Parcel>
@@ -24,26 +21,12 @@ impl<S: primitives::Integer, T: Parcel> DynArray<S,T>
2421
impl<S: primitives::Integer, T: Parcel> Parcel for DynArray<S, T>
2522
{
2623
fn read(read: &mut Read) -> Result<Self, Error> {
27-
let size = S::read(read)?;
28-
let size: usize = size.try_into()?;
29-
30-
let mut elements = Vec::new();
31-
32-
for _ in 0..size {
33-
elements.push(T::read(read)?);
34-
}
35-
24+
let elements = primitives::util::read_list_ext::<S,T>(read)?;
3625
Ok(Self::new(elements))
3726
}
3827

3928
fn write(&self, write: &mut Write) -> Result<(), Error> {
40-
S::try_from(self.elements.len())?.write(write)?;
41-
42-
for element in self.elements.iter() {
43-
element.write(write)?;
44-
}
45-
46-
Ok(())
29+
primitives::util::write_list_ext::<S,T,_>(write, self.elements.iter())
4730
}
4831
}
4932

@@ -113,11 +96,11 @@ impl_parcel_for_array!(32);
11396
impl<T: Parcel> Parcel for Vec<T>
11497
{
11598
fn read(read: &mut Read) -> Result<Self, Error> {
116-
Ok(DynArray::<SizeType, T>::read(read)?.elements)
99+
primitives::util::read_list(read)
117100
}
118101

119102
fn write(&self, write: &mut Write) -> Result<(), Error> {
120-
DynArray::<SizeType, T>::new(self.clone()).write(write)
103+
primitives::util::write_list(write, self.iter())
121104
}
122105
}
123106

src/primitives/collections/list.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,13 @@ macro_rules! impl_list_type {
44
where T: $crate::Parcel $( + $ty_pred )*
55
{
66
fn read(read: &mut ::std::io::Read) -> Result<Self, $crate::Error> {
7-
let elements: Vec<T> = Vec::read(read)?;
7+
let elements = ::primitives::util::read_list(read)?;
88
Ok(elements.into_iter().collect())
99
}
1010

11-
fn write(&self, write: &mut ::std::io::Write) -> Result<(), $crate::Error> {
12-
let elements: Vec<_> = self.iter().cloned().collect();
13-
elements.write(write)?;
14-
Ok(())
11+
fn write(&self, write: &mut ::std::io::Write)
12+
-> Result<(), $crate::Error> {
13+
::primitives::util::write_list(write, self.iter())
1514
}
1615
}
1716

src/primitives/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,5 @@ pub mod smart_ptr;
1717
#[cfg(feature = "uuid")]
1818
pub mod uuid;
1919

20+
mod util;
21+

src/primitives/util.rs

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
use {Parcel, Error};
2+
use primitives::Integer;
3+
4+
use std::io::prelude::*;
5+
6+
/// The integer type that we will use to send length prefixes.
7+
pub type SizeType = u32;
8+
9+
/// Reads a length-prefixed list from a stream.
10+
pub fn read_list<T>(read: &mut Read)
11+
-> Result<Vec<T>, Error>
12+
where T: Parcel {
13+
self::read_list_ext::<SizeType, T>(read)
14+
}
15+
16+
/// Writes a length-prefixed list to a stream.
17+
pub fn write_list<'a,T,I>(write: &mut Write, elements: I)
18+
-> Result<(), Error>
19+
where T: Parcel+'a,
20+
I: IntoIterator<Item=&'a T> {
21+
self::write_list_ext::<SizeType, T, I>(write, elements)
22+
}
23+
24+
pub fn read_list_ext<S,T>(read: &mut Read)
25+
-> Result<Vec<T>, Error>
26+
where S: Integer,
27+
T: Parcel {
28+
let size = S::read(read)?;
29+
let size: usize = size.try_into()?;
30+
let mut elements = Vec::with_capacity(size);
31+
32+
for _ in 0..size {
33+
let element = T::read(read)?;
34+
elements.push(element);
35+
}
36+
Ok(elements)
37+
}
38+
39+
pub fn write_list_ext<'a,S,T,I>(write: &mut Write, elements: I)
40+
-> Result<(), Error>
41+
where S: Integer,
42+
T: Parcel+'a,
43+
I: IntoIterator<Item=&'a T> {
44+
let elements: Vec<_> = elements.into_iter().collect();
45+
let length = S::try_from(elements.len())?;
46+
length.write(write)?;
47+
48+
for element in elements.into_iter() {
49+
element.write(write)?;
50+
}
51+
52+
Ok(())
53+
}
54+

0 commit comments

Comments
 (0)