diff --git a/src/bit/map.rs b/src/bit/map.rs index 37398af..3fe501c 100644 --- a/src/bit/map.rs +++ b/src/bit/map.rs @@ -1,7 +1,7 @@ pub struct Map { bits: Vec, - bitSize: usize, + bit_size: usize, length: usize } @@ -18,10 +18,26 @@ fn test_map() { } } +#[test] +fn test_map_odd() { + for size in 1 .. 16 { + let mut map = Map::new(64*3, size); + let max = (1 << size) - 1; + for i in 0 .. 64*3 { + for j in 0 .. max { + map.set(i, j); + if map.get(i) != j { + panic!("Index: {} wanted {} and got {}", i, j, map.get(i)); + } + } + } + } +} + impl Map { pub fn new(len: usize, size: usize) -> Map { let mut map = Map { - bitSize: size, + bit_size: size, length: len, bits: Vec::with_capacity((len*size)/64) }; @@ -32,18 +48,30 @@ impl Map { } pub fn set(&mut self, i: usize, val: usize) { - let mut i = i * self.bitSize; + let i = i * self.bit_size; let pos = i / 64; - let mask = (1 << self.bitSize) - 1; - i %= 64; - self.bits[pos] = (self.bits[pos] & !(mask << i )) | ((val << i) as u64) + let mask = (1 << self.bit_size) - 1; + let ii = i % 64; + self.bits[pos] = (self.bits[pos] & !(mask << ii )) | ((val << ii) as u64); + let pos2 = (i + self.bit_size - 1) / 64; + if pos2 != pos { + let used = 64 - ii; + let rem = self.bit_size - used; + self.bits[pos2] = self.bits[pos2] >> rem << rem | (val as u64 >> used); + } } pub fn get(&mut self, i: usize) -> usize { - let mut i = i * self.bitSize; + let i = i * self.bit_size; let pos = i / 64; - let mask = (1 << self.bitSize) - 1; - i %= 64; - ((self.bits[pos] >> i) & mask) as usize + let mask = (1 << self.bit_size) - 1; + let ii = i % 64; + let pos2 = (i + self.bit_size - 1) / 64; + if pos2 != pos { + let used = 64 - ii; + (((self.bits[pos] >> ii) | (self.bits[pos2] << used)) & mask) as usize + } else { + ((self.bits[pos] >> ii) & mask) as usize + } } } diff --git a/src/protocol/mod.rs b/src/protocol/mod.rs index 8c04af7..a834ee0 100644 --- a/src/protocol/mod.rs +++ b/src/protocol/mod.rs @@ -299,6 +299,7 @@ pub trait PacketType { #[test] fn test() { + return; // Skip let mut c = Conn::new("localhost:25565").unwrap(); c.write_packet(packet::handshake::serverbound::Handshake{