1
0
Fork 0
mirror of https://codeberg.org/icewind/bitbuffer.git synced 2026-06-03 16:44:06 +02:00

implement ReadSized for HashMap

This commit is contained in:
Robin Appelman 2019-02-28 21:19:53 +01:00
commit ccced2c28e
3 changed files with 27 additions and 1 deletions

View file

@ -1,6 +1,6 @@
[package]
name = "bitstream_reader"
version = "0.3.0"
version = "0.3.1"
authors = ["Robin Appelman <robin@icewind.nl>"]
edition = "2018"
description = "Reading bit sequences from a byte slice"
@ -14,4 +14,7 @@ travis-ci = { repository = "icewind1991/bitstream_reader" }
num-traits = "0.2"
bitstream_reader_derive = { version = "0.3", path = "bitstream_reader_derive" }
[dev-dependencies]
maplit = "1.0.1"
[workspace]

View file

@ -1,4 +1,6 @@
use crate::{BitStream, Endianness, Result};
use std::collections::HashMap;
use std::hash::Hash;
/// Trait for types that can be read from a stream without requiring the size to be configured
///
@ -269,3 +271,16 @@ impl<E: Endianness, T: BitRead<E>> BitReadSized<E> for Vec<T> {
// stream.read_bytes(size)
// }
//}
/// Read `K` and `T` `size` times and return as `HashMap<K, T>`
impl<E: Endianness, K: BitRead<E> + Eq + Hash, T: BitRead<E>> BitReadSized<E> for HashMap<K, T> {
fn read(stream: &mut BitStream<E>, size: usize) -> Result<Self> {
let mut map = HashMap::with_capacity(size);
for _ in 0..size {
let key = stream.read()?;
let value = stream.read()?;
map.insert(key, value);
}
Ok(map)
}
}

View file

@ -1,4 +1,6 @@
use bitstream_reader::{BigEndian, BitBuffer, BitRead, BitStream, LittleEndian};
use maplit::hashmap;
use std::collections::HashMap;
// for bench on nightly
//use std::fs;
@ -270,6 +272,12 @@ fn read_sized_trait() {
stream.set_pos(0).unwrap();
let vec: Vec<u8> = stream.read_sized(3).unwrap();
assert_eq!(vec![0b1011_0101, 0b0110_1010, 0b1010_1100], vec);
stream.set_pos(0).unwrap();
let result: HashMap<u8, u8> = stream.read_sized(2).unwrap();
assert_eq!(
hashmap!(0b1011_0101 => 0b0110_1010, 0b1010_1100 => 0b1001_1001),
result
);
}
#[derive(BitRead, PartialEq, Debug)]