Skip to content

Commit 2c8adee

Browse files
authored
Merge pull request #38 from Shnatsel/rle-decode-fast
Switch to rle_decode_fast crate
2 parents bf3c6c3 + 912fabd commit 2c8adee

File tree

5 files changed

+6
-41
lines changed

5 files changed

+6
-41
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ codecov = {repository = "sile/libflate"}
1818
adler32 = "1"
1919
byteorder = "1"
2020
crc32fast = "1"
21+
rle-decode-fast = "1.0.0"
2122
take_mut = "0.2.2"
2223

2324
[dev-dependencies]

src/deflate/decode.rs

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ use byteorder::ReadBytesExt;
33
use std::cmp;
44
use std::io;
55
use std::io::Read;
6+
use rle_decode_fast::rle_decode;
67

78
use super::symbol;
89
use bit;
910
use lz77;
10-
use util;
1111

1212
/// DEFLATE decoder.
1313
#[derive(Debug)]
@@ -116,19 +116,7 @@ where
116116
distance
117117
));
118118
}
119-
let old_len = self.buffer.len();
120-
self.buffer.reserve(length as usize);
121-
unsafe {
122-
self.buffer.set_len(old_len + length as usize);
123-
let start = old_len - distance as usize;
124-
let ptr = self.buffer.as_mut_ptr();
125-
util::ptr_copy(
126-
ptr.add(start),
127-
ptr.add(old_len),
128-
length as usize,
129-
length > distance,
130-
);
131-
}
119+
rle_decode(&mut self.buffer, usize::from(distance), usize::from(length));
132120
}
133121
symbol::Symbol::EndOfBlock => {
134122
break;

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
extern crate adler32;
44
extern crate byteorder;
55
extern crate crc32fast;
6+
extern crate rle_decode_fast;
67
extern crate take_mut;
78

89
pub use finish::Finish;

src/non_blocking/deflate/decode.rs

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,11 @@ use byteorder::ReadBytesExt;
33
use std::cmp;
44
use std::io;
55
use std::io::Read;
6+
use rle_decode_fast::rle_decode;
67

78
use deflate::symbol::{self, HuffmanCodec};
89
use lz77;
910
use non_blocking::transaction::TransactionalBitReader;
10-
use util;
11-
1211
/// DEFLATE decoder which supports non-blocking I/O.
1312
#[derive(Debug)]
1413
pub struct Decoder<R> {
@@ -210,19 +209,7 @@ impl BlockDecoder {
210209
distance
211210
));
212211
}
213-
let old_len = self.buffer.len();
214-
self.buffer.reserve(length as usize);
215-
unsafe {
216-
self.buffer.set_len(old_len + length as usize);
217-
let start = old_len - distance as usize;
218-
let ptr = self.buffer.as_mut_ptr();
219-
util::ptr_copy(
220-
ptr.add(start),
221-
ptr.add(old_len),
222-
length as usize,
223-
length > distance,
224-
);
225-
}
212+
rle_decode(&mut self.buffer, usize::from(distance), usize::from(length));
226213
}
227214
symbol::Symbol::EndOfBlock => {
228215
self.eob = true;

src/util.rs

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,5 @@
11
#[cfg(test)]
22
use std::io::{self, Read};
3-
use std::ptr;
4-
5-
#[inline]
6-
pub unsafe fn ptr_copy(src: *const u8, dst: *mut u8, count: usize, is_overlapping: bool) {
7-
if !is_overlapping {
8-
ptr::copy_nonoverlapping(src, dst, count);
9-
} else {
10-
for i in 0..count {
11-
ptr::copy_nonoverlapping(src.add(i), dst.add(i), 1);
12-
}
13-
}
14-
}
153

164
#[cfg(test)]
175
pub struct WouldBlockReader<R> {

0 commit comments

Comments
 (0)