mirror of
https://github.com/sharkdp/hexyl.git
synced 2026-10-30 09:05:54 +00:00
Remove unnecessary squeezer module
This commit is contained in:
1 parent
75d612ff11
commit
945e7a3472
1 file changed
-407
-407
@@ -1,407 +0,0 @@
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
pub enum SqueezeState {
|
||||
/// not enabled
|
||||
Disabled,
|
||||
/// Will be set from all states if equal condition can't be hold up.
|
||||
/// Set if previous byte is not equal the current processed byte.
|
||||
NoSqueeze,
|
||||
/// Valid for a whole line to identify if it is candidate for squeezing
|
||||
Probe,
|
||||
/// Squeeze line parsing is active, but EOL is not reached yet
|
||||
SqueezeActive,
|
||||
/// Squeeze line, EOL is reached, will influence the action
|
||||
Squeeze,
|
||||
/// same as Squeeze, however this is only for the first line after
|
||||
/// the squeeze candidate has been set.
|
||||
SqueezeFirstLine,
|
||||
/// same as SqueezeActive, however this is only for the first line after
|
||||
/// the squeeze candidate has been set.
|
||||
SqueezeActiveFirstLine,
|
||||
}
|
||||
|
||||
pub struct Squeezer {
|
||||
pub state: SqueezeState,
|
||||
byte: u8,
|
||||
lsize: u64,
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
pub enum SqueezeAction {
|
||||
Ignore,
|
||||
Print,
|
||||
Delete,
|
||||
}
|
||||
|
||||
impl Squeezer {
|
||||
pub fn new(enabled: bool, lsize: u64) -> Squeezer {
|
||||
Squeezer {
|
||||
state: if enabled {
|
||||
SqueezeState::Probe
|
||||
} else {
|
||||
SqueezeState::Disabled
|
||||
},
|
||||
byte: 1,
|
||||
lsize,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn process(&mut self, b: u8, i: u64) {
|
||||
use self::SqueezeState::*;
|
||||
if self.state == Disabled {
|
||||
return;
|
||||
}
|
||||
let eq = b == self.byte;
|
||||
|
||||
if i % self.lsize == 0 {
|
||||
if !eq {
|
||||
self.state = Probe;
|
||||
} else {
|
||||
self.state = match self.state {
|
||||
NoSqueeze => Probe,
|
||||
Probe => SqueezeActiveFirstLine,
|
||||
SqueezeActiveFirstLine => SqueezeFirstLine,
|
||||
SqueezeFirstLine => SqueezeActive,
|
||||
SqueezeActive => Squeeze,
|
||||
Squeeze => SqueezeActive,
|
||||
Disabled => Disabled,
|
||||
};
|
||||
}
|
||||
} else if !eq {
|
||||
if i % self.lsize == 1 {
|
||||
self.state = Probe;
|
||||
} else if i % self.lsize != 1 {
|
||||
self.state = NoSqueeze;
|
||||
}
|
||||
}
|
||||
|
||||
self.byte = b;
|
||||
}
|
||||
|
||||
pub fn active(&self) -> bool {
|
||||
use self::SqueezeState::*;
|
||||
matches!(
|
||||
self.state,
|
||||
Squeeze | SqueezeActive | SqueezeFirstLine | SqueezeActiveFirstLine
|
||||
)
|
||||
}
|
||||
|
||||
pub fn action(&self) -> SqueezeAction {
|
||||
match self.state {
|
||||
SqueezeState::SqueezeFirstLine => SqueezeAction::Print,
|
||||
SqueezeState::Squeeze => SqueezeAction::Delete,
|
||||
_ => SqueezeAction::Ignore,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn advance(&mut self) {
|
||||
match self.state {
|
||||
SqueezeState::SqueezeFirstLine => {
|
||||
self.state = SqueezeState::SqueezeActive;
|
||||
}
|
||||
SqueezeState::Squeeze => {
|
||||
self.state = SqueezeState::SqueezeActive;
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
const LSIZE: u64 = 16;
|
||||
const LSIZE_USIZE: usize = LSIZE as usize;
|
||||
|
||||
#[test]
|
||||
fn three_same_lines() {
|
||||
const LINES: usize = 3;
|
||||
let v = vec![0u8; LINES * LSIZE_USIZE];
|
||||
let mut s = Squeezer::new(true, LSIZE);
|
||||
// just initialized
|
||||
assert_eq!(s.action(), SqueezeAction::Ignore);
|
||||
s.advance();
|
||||
|
||||
let exp = vec![
|
||||
SqueezeAction::Ignore, // first line, print as is
|
||||
SqueezeAction::Print, // print squeeze symbol
|
||||
SqueezeAction::Delete, // delete reoccurring line
|
||||
];
|
||||
|
||||
let mut idx = 1;
|
||||
for (line, z) in v.chunks(LSIZE_USIZE).enumerate() {
|
||||
for i in z {
|
||||
s.process(*i, idx);
|
||||
idx += 1;
|
||||
}
|
||||
let action = s.action();
|
||||
s.advance();
|
||||
assert_eq!(action, exp[line]);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn incomplete_while_squeeze() {
|
||||
// fourth line only has 12 bytes and should be printed
|
||||
let v = vec![0u8; 3 * LSIZE_USIZE + 12];
|
||||
let mut s = Squeezer::new(true, LSIZE);
|
||||
// just initialized
|
||||
assert_eq!(s.action(), SqueezeAction::Ignore);
|
||||
s.advance();
|
||||
|
||||
let exp = vec![
|
||||
SqueezeAction::Ignore, // first line, print as is
|
||||
SqueezeAction::Print, // print squeeze symbol
|
||||
SqueezeAction::Delete, // delete reoccurring line
|
||||
SqueezeAction::Ignore, // last line only 12 bytes, print it
|
||||
];
|
||||
|
||||
let mut idx = 1;
|
||||
for (line, z) in v.chunks(LSIZE_USIZE).enumerate() {
|
||||
for i in z {
|
||||
s.process(*i, idx);
|
||||
idx += 1;
|
||||
}
|
||||
assert_eq!(s.action(), exp[line]);
|
||||
s.advance();
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
/// all three lines are different, print all
|
||||
fn three_different_lines() {
|
||||
let mut v: Vec<u8> = vec![];
|
||||
v.extend(vec![0u8; 16]);
|
||||
v.extend(vec![1u8; 16]);
|
||||
v.extend(vec![2u8; 16]);
|
||||
|
||||
let mut s = Squeezer::new(true, LSIZE);
|
||||
// just initialized
|
||||
assert_eq!(s.action(), SqueezeAction::Ignore);
|
||||
s.advance();
|
||||
|
||||
let exp = vec![
|
||||
SqueezeAction::Ignore, // first line, print as is
|
||||
SqueezeAction::Ignore, // different
|
||||
SqueezeAction::Ignore, // different
|
||||
];
|
||||
|
||||
let mut idx = 1;
|
||||
for (line, z) in v.chunks(LSIZE_USIZE).enumerate() {
|
||||
for i in z {
|
||||
s.process(*i, idx);
|
||||
idx += 1;
|
||||
}
|
||||
let action = s.action();
|
||||
assert_eq!(action, exp[line]);
|
||||
s.advance();
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
/// first two lines same, hence squeeze symbol, third line diff, hence
|
||||
/// print
|
||||
fn one_squeeze_no_delete() {
|
||||
const LINES: usize = 3;
|
||||
let mut v = vec![0u8; (LINES - 1) * LSIZE_USIZE];
|
||||
v.extend(vec![1u8; 16]);
|
||||
|
||||
let mut s = Squeezer::new(true, LSIZE);
|
||||
// just initialized
|
||||
assert_eq!(s.action(), SqueezeAction::Ignore);
|
||||
s.advance();
|
||||
|
||||
let exp = vec![
|
||||
SqueezeAction::Ignore, // first line, print as is
|
||||
SqueezeAction::Print, // print squeeze symbol
|
||||
SqueezeAction::Ignore, // different lines, print again
|
||||
];
|
||||
|
||||
let mut idx = 1;
|
||||
for (line, z) in v.chunks(LSIZE_USIZE).enumerate() {
|
||||
for i in z {
|
||||
s.process(*i, idx);
|
||||
idx += 1;
|
||||
}
|
||||
let action = s.action();
|
||||
s.advance();
|
||||
assert_eq!(action, exp[line]);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
/// First line all eq, 2nd half eq with first line, then change
|
||||
fn second_line_different() {
|
||||
const LINES: usize = 2;
|
||||
let mut v = vec![0u8; (LINES - 1) * LSIZE_USIZE];
|
||||
v.extend(vec![0u8; 8]);
|
||||
v.extend(vec![1u8; 8]);
|
||||
|
||||
let mut s = Squeezer::new(true, LSIZE);
|
||||
// just initialized
|
||||
assert_eq!(s.action(), SqueezeAction::Ignore);
|
||||
s.advance();
|
||||
|
||||
let exp = vec![
|
||||
SqueezeAction::Ignore, // first line, print as is
|
||||
SqueezeAction::Ignore, // print squeeze symbol
|
||||
];
|
||||
|
||||
let mut idx = 1;
|
||||
for (line, z) in v.chunks(LSIZE_USIZE).enumerate() {
|
||||
for i in z {
|
||||
s.process(*i, idx);
|
||||
idx += 1;
|
||||
}
|
||||
let action = s.action();
|
||||
s.advance();
|
||||
assert_eq!(action, exp[line]);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
/// all three lines never become squeeze candidate (diff within line)
|
||||
fn never_squeeze_candidate() {
|
||||
let mut v = vec![];
|
||||
v.extend(vec![0u8; 8]);
|
||||
v.extend(vec![1u8; 8]);
|
||||
v.extend(vec![0u8; 8]);
|
||||
v.extend(vec![1u8; 8]);
|
||||
v.extend(vec![0u8; 8]);
|
||||
v.extend(vec![1u8; 8]);
|
||||
|
||||
let mut s = Squeezer::new(true, LSIZE);
|
||||
// just initialized
|
||||
assert_eq!(s.action(), SqueezeAction::Ignore);
|
||||
s.advance();
|
||||
|
||||
let exp = vec![
|
||||
SqueezeAction::Ignore, // first line, print as is
|
||||
SqueezeAction::Ignore, // print squeeze symbol
|
||||
SqueezeAction::Ignore, // print squeeze symbol
|
||||
];
|
||||
|
||||
let mut idx = 1;
|
||||
for (line, z) in v.chunks(LSIZE_USIZE).enumerate() {
|
||||
for i in z {
|
||||
s.process(*i, idx);
|
||||
idx += 1;
|
||||
}
|
||||
let action = s.action();
|
||||
s.advance();
|
||||
assert_eq!(action, exp[line]);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn mix_everything() {
|
||||
let mut v = vec![];
|
||||
v.extend(vec![10u8; 16]); // print
|
||||
v.extend(vec![20u8; 16]); // print
|
||||
v.extend(vec![0u8; 16]); // print
|
||||
v.extend(vec![0u8; 16]); // *
|
||||
v.extend(vec![10u8; 16]); // print
|
||||
v.extend(vec![20u8; 16]); // print
|
||||
v.extend(vec![0u8; 16]); // print
|
||||
v.extend(vec![0u8; 16]); // *
|
||||
v.extend(vec![0u8; 16]); // delete
|
||||
v.extend(vec![0u8; 16]); // delete*
|
||||
v.extend(vec![20u8; 16]); // print
|
||||
v.extend(vec![0u8; 12]); // print, only 12 bytes
|
||||
|
||||
let mut s = Squeezer::new(true, LSIZE);
|
||||
// just initialized
|
||||
assert_eq!(s.action(), SqueezeAction::Ignore);
|
||||
s.advance();
|
||||
|
||||
let exp = vec![
|
||||
SqueezeAction::Ignore,
|
||||
SqueezeAction::Ignore,
|
||||
SqueezeAction::Ignore,
|
||||
SqueezeAction::Print,
|
||||
SqueezeAction::Ignore,
|
||||
SqueezeAction::Ignore,
|
||||
SqueezeAction::Ignore,
|
||||
SqueezeAction::Print,
|
||||
SqueezeAction::Delete,
|
||||
SqueezeAction::Delete,
|
||||
SqueezeAction::Ignore,
|
||||
SqueezeAction::Ignore,
|
||||
];
|
||||
|
||||
let mut idx = 1;
|
||||
for (line, z) in v.chunks(LSIZE_USIZE).enumerate() {
|
||||
for i in z {
|
||||
s.process(*i, idx);
|
||||
idx += 1;
|
||||
}
|
||||
let action = s.action();
|
||||
s.advance();
|
||||
assert_eq!(action, exp[line]);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn last_char_diff() {
|
||||
// see issue #62
|
||||
let mut v = vec![];
|
||||
v.extend(vec![20u8; 16]);
|
||||
v.extend(vec![20u8; 15]);
|
||||
v.push(61);
|
||||
v.extend(vec![20u8; 16]);
|
||||
v.extend(vec![20u8; 16]);
|
||||
|
||||
let mut s = Squeezer::new(true, LSIZE);
|
||||
// just initialized
|
||||
assert_eq!(s.action(), SqueezeAction::Ignore);
|
||||
s.advance();
|
||||
|
||||
let exp = vec![
|
||||
SqueezeAction::Ignore, // print as is
|
||||
SqueezeAction::Ignore, // print as is
|
||||
SqueezeAction::Ignore, // print as is
|
||||
SqueezeAction::Print, // print '*' char
|
||||
];
|
||||
|
||||
let mut idx = 1;
|
||||
for (line, z) in v.chunks(LSIZE_USIZE).enumerate() {
|
||||
for i in z {
|
||||
s.process(*i, idx);
|
||||
idx += 1;
|
||||
}
|
||||
assert_eq!(s.action(), exp[line]);
|
||||
s.advance();
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn first_char_diff() {
|
||||
// see issue #62
|
||||
let mut v = vec![];
|
||||
v.extend(vec![20u8; 16]);
|
||||
v.push(61);
|
||||
v.extend(vec![20u8; 15]);
|
||||
v.extend(vec![20u8; 16]);
|
||||
|
||||
let mut s = Squeezer::new(true, LSIZE);
|
||||
// just initialized
|
||||
assert_eq!(s.action(), SqueezeAction::Ignore);
|
||||
s.advance();
|
||||
|
||||
let exp = vec![
|
||||
SqueezeAction::Ignore, // print as is
|
||||
SqueezeAction::Ignore, // print as is
|
||||
SqueezeAction::Ignore, // print as is
|
||||
];
|
||||
|
||||
let mut idx = 1;
|
||||
for (line, z) in v.chunks(LSIZE_USIZE).enumerate() {
|
||||
for i in z {
|
||||
s.process(*i, idx);
|
||||
idx += 1;
|
||||
}
|
||||
assert_eq!(s.action(), exp[line]);
|
||||
s.advance();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user