Remove generic types from Differ

The entire implementation pretty much only makes sense for string
slices, and that was all the original code supported anyway.
This commit is contained in:
nmlgc
2018-07-01 18:41:22 +02:00
parent e2bbf92e4c
commit 282c139cc0
2 changed files with 32 additions and 31 deletions
+19 -31
View File
@@ -1,4 +1,4 @@
use sequencematcher::{Sequence, SequenceMatcher}; use sequencematcher::SequenceMatcher;
use std::cmp; use std::cmp;
use utils::{count_leading, str_with_similar_chars}; use utils::{count_leading, str_with_similar_chars};
@@ -15,11 +15,7 @@ impl Differ {
} }
} }
pub fn compare<T: ?Sized + Sequence>( pub fn compare(&self, first_sequence: &[&str], second_sequence: &[&str]) -> Vec<String> {
&self,
first_sequence: &T,
second_sequence: &T,
) -> Vec<String> {
let mut matcher = SequenceMatcher::new(first_sequence, second_sequence); let mut matcher = SequenceMatcher::new(first_sequence, second_sequence);
matcher.set_is_junk(self.line_junk); matcher.set_is_junk(self.line_junk);
let mut res = Vec::new(); let mut res = Vec::new();
@@ -54,16 +50,10 @@ impl Differ {
res res
} }
fn dump<T: ?Sized + Sequence>( fn dump(&self, tag: &str, sequence: &[&str], start: usize, end: usize) -> Vec<String> {
&self,
tag: &str,
sequence: &T,
start: usize,
end: usize,
) -> Vec<String> {
let mut res = Vec::new(); let mut res = Vec::new();
for i in start..end { for i in start..end {
match sequence.at_index(i) { match sequence.get(i) {
Some(s) => res.push(format!("{} {}", tag, s)), Some(s) => res.push(format!("{} {}", tag, s)),
None => {} None => {}
} }
@@ -71,12 +61,12 @@ impl Differ {
res res
} }
fn plain_replace<T: ?Sized + Sequence>( fn plain_replace(
&self, &self,
first_sequence: &T, first_sequence: &[&str],
first_start: usize, first_start: usize,
first_end: usize, first_end: usize,
second_sequence: &T, second_sequence: &[&str],
second_start: usize, second_start: usize,
second_end: usize, second_end: usize,
) -> Vec<String> { ) -> Vec<String> {
@@ -98,12 +88,12 @@ impl Differ {
first first
} }
fn fancy_replace<T: ?Sized + Sequence>( fn fancy_replace(
&self, &self,
first_sequence: &T, first_sequence: &[&str],
first_start: usize, first_start: usize,
first_end: usize, first_end: usize,
second_sequence: &T, second_sequence: &[&str],
second_start: usize, second_start: usize,
second_end: usize, second_end: usize,
) -> Vec<String> { ) -> Vec<String> {
@@ -114,9 +104,9 @@ impl Differ {
let mut eqi: Option<usize> = None; let mut eqi: Option<usize> = None;
let mut eqj: Option<usize> = None; let mut eqj: Option<usize> = None;
for j in second_start..second_end { for j in second_start..second_end {
second_sequence_str = second_sequence.at_index(j).unwrap(); second_sequence_str = &second_sequence[j];
for i in first_start..first_end { for i in first_start..first_end {
first_sequence_str = first_sequence.at_index(i).unwrap(); first_sequence_str = &first_sequence[i];
if first_sequence_str == second_sequence_str { if first_sequence_str == second_sequence_str {
if eqi.is_none() { if eqi.is_none() {
eqi = Some(i); eqi = Some(i);
@@ -124,7 +114,7 @@ impl Differ {
} }
continue; continue;
} }
let mut cruncher = SequenceMatcher::new(first_sequence_str, second_sequence_str); let mut cruncher = SequenceMatcher::new(*first_sequence_str, *second_sequence_str);
cruncher.set_is_junk(self.char_junk); cruncher.set_is_junk(self.char_junk);
if cruncher.ratio() > best_ratio { if cruncher.ratio() > best_ratio {
best_ratio = cruncher.ratio(); best_ratio = cruncher.ratio();
@@ -164,13 +154,11 @@ impl Differ {
).iter() ).iter()
.cloned(), .cloned(),
); );
let (first_element, second_element) = ( let first_element = &first_sequence[best_i];
first_sequence.at_index(best_i).unwrap(), let second_element = &second_sequence[best_j];
second_sequence.at_index(best_j).unwrap(),
);
if eqi.is_none() { if eqi.is_none() {
let (mut first_tag, mut second_tag) = (String::new(), String::new()); let (mut first_tag, mut second_tag) = (String::new(), String::new());
let mut cruncher = SequenceMatcher::new(first_element, second_element); let mut cruncher = SequenceMatcher::new(*first_element, second_element);
cruncher.set_is_junk(self.char_junk); cruncher.set_is_junk(self.char_junk);
for opcode in &cruncher.get_opcodes() { for opcode in &cruncher.get_opcodes() {
let (first_length, second_length) = ( let (first_length, second_length) = (
@@ -219,12 +207,12 @@ impl Differ {
res res
} }
fn fancy_helper<T: ?Sized + Sequence>( fn fancy_helper(
&self, &self,
first_sequence: &T, first_sequence: &[&str],
first_start: usize, first_start: usize,
first_end: usize, first_end: usize,
second_sequence: &T, second_sequence: &[&str],
second_start: usize, second_start: usize,
second_end: usize, second_end: usize,
) -> Vec<String> { ) -> Vec<String> {
+13
View File
@@ -104,6 +104,19 @@ impl<'a> Sequence for Vec<String> {
} }
} }
impl<'a> Sequence for [&'a str] {
fn len(&self) -> usize {
self.len()
}
fn at_index(&self, index: usize) -> Option<&str> {
if index < self.len() {
return Some(self[index]);
}
None
}
}
pub struct SequenceMatcher<'a, T: 'a + ?Sized + Sequence> { pub struct SequenceMatcher<'a, T: 'a + ?Sized + Sequence> {
first_sequence: &'a T, first_sequence: &'a T,
second_sequence: &'a T, second_sequence: &'a T,