diff --git a/Cargo.toml b/Cargo.toml index d3dee26..93d14bd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,6 +18,7 @@ codecov = {repository = "sile/libflate"} adler32 = "1" byteorder = "1" crc32fast = "1" +rle-decode-fast = "1.0.0" take_mut = "0.2.2" [dev-dependencies] diff --git a/src/deflate/decode.rs b/src/deflate/decode.rs index 862992e..3f0217c 100644 --- a/src/deflate/decode.rs +++ b/src/deflate/decode.rs @@ -3,11 +3,11 @@ use byteorder::ReadBytesExt; use std::cmp; use std::io; use std::io::Read; +use rle_decode_fast::rle_decode; use super::symbol; use bit; use lz77; -use util; /// DEFLATE decoder. #[derive(Debug)] @@ -116,19 +116,7 @@ where distance )); } - let old_len = self.buffer.len(); - self.buffer.reserve(length as usize); - unsafe { - self.buffer.set_len(old_len + length as usize); - let start = old_len - distance as usize; - let ptr = self.buffer.as_mut_ptr(); - util::ptr_copy( - ptr.add(start), - ptr.add(old_len), - length as usize, - length > distance, - ); - } + rle_decode(&mut self.buffer, usize::from(distance), usize::from(length)); } symbol::Symbol::EndOfBlock => { break; diff --git a/src/lib.rs b/src/lib.rs index 3803e16..a414e02 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,6 +3,7 @@ extern crate adler32; extern crate byteorder; extern crate crc32fast; +extern crate rle_decode_fast; extern crate take_mut; pub use finish::Finish; diff --git a/src/non_blocking/deflate/decode.rs b/src/non_blocking/deflate/decode.rs index 438b72a..f672911 100644 --- a/src/non_blocking/deflate/decode.rs +++ b/src/non_blocking/deflate/decode.rs @@ -3,12 +3,11 @@ use byteorder::ReadBytesExt; use std::cmp; use std::io; use std::io::Read; +use rle_decode_fast::rle_decode; use deflate::symbol::{self, HuffmanCodec}; use lz77; use non_blocking::transaction::TransactionalBitReader; -use util; - /// DEFLATE decoder which supports non-blocking I/O. #[derive(Debug)] pub struct Decoder { @@ -210,19 +209,7 @@ impl BlockDecoder { distance )); } - let old_len = self.buffer.len(); - self.buffer.reserve(length as usize); - unsafe { - self.buffer.set_len(old_len + length as usize); - let start = old_len - distance as usize; - let ptr = self.buffer.as_mut_ptr(); - util::ptr_copy( - ptr.add(start), - ptr.add(old_len), - length as usize, - length > distance, - ); - } + rle_decode(&mut self.buffer, usize::from(distance), usize::from(length)); } symbol::Symbol::EndOfBlock => { self.eob = true; diff --git a/src/util.rs b/src/util.rs index 682bfa7..82f58d1 100644 --- a/src/util.rs +++ b/src/util.rs @@ -1,17 +1,5 @@ #[cfg(test)] use std::io::{self, Read}; -use std::ptr; - -#[inline] -pub unsafe fn ptr_copy(src: *const u8, dst: *mut u8, count: usize, is_overlapping: bool) { - if !is_overlapping { - ptr::copy_nonoverlapping(src, dst, count); - } else { - for i in 0..count { - ptr::copy_nonoverlapping(src.add(i), dst.add(i), 1); - } - } -} #[cfg(test)] pub struct WouldBlockReader {