1use std::io::Result;
2use std::{io::Write, io::Read};
3use crate::encoding::{Encoder, Decoder};
4use crate::var_int::{VarIntRead, VarIntWrite};
5
6pub trait VarIntSizedVecRead<D>: Sized {
7 fn read_var_int_sized_vec(&mut self) -> Result<Vec<D>>;
8}
9
10pub trait VarIntSizedVecWrite {
11 fn write_var_int_sized_vec<E: Encoder>(&mut self, vec: &Vec<E>) -> Result<()>;
12}
13
14impl<W> VarIntSizedVecWrite for W
15where
16 W: Write,
17{
18 fn write_var_int_sized_vec<E: Encoder>(&mut self, vec: &Vec<E>) -> Result<()> {
19 self.write_var_i32(vec.len() as i32)?;
20 for ele in vec {
21 ele.encode_to_write(self)?;
22 }
23 Ok(())
24 }
25}
26
27impl<D, R> VarIntSizedVecRead<D> for R
28where
29 R: Read,
30 D: Decoder,
31{
32 fn read_var_int_sized_vec(&mut self) -> Result<Vec<D>> {
33 let len = self.read_var_i32()?;
34 let mut buf = Vec::<D>::with_capacity(len as usize);
35 for _ in 0..len {
36 let ele = D::decode_from_read(self)?;
37 buf.push(ele);
38 }
39 Ok(buf)
40 }
41}