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:
+19
-31
@@ -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> {
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user