Add support for Rust 1.41.0 (#14)
This commit is contained in:
parent
d056522da4
commit
b6e2894f21
9 changed files with 230 additions and 96 deletions
83
src/types.rs
83
src/types.rs
|
|
@ -2,6 +2,7 @@ use std::fmt;
|
|||
use std::ops::{Index, Range};
|
||||
|
||||
use crate::algorithms::DiffHook;
|
||||
use crate::iter::ChangesIter;
|
||||
|
||||
/// An enum representing a diffing algorithm.
|
||||
#[derive(Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord, Debug)]
|
||||
|
|
@ -272,92 +273,14 @@ impl DiffOp {
|
|||
&self,
|
||||
old: &'lookup Old,
|
||||
new: &'lookup New,
|
||||
) -> impl Iterator<Item = Change<'x, T>> + 'lookup
|
||||
) -> ChangesIter<'lookup, 'x, Old, New, T>
|
||||
where
|
||||
Old: Index<usize, Output = &'x T> + ?Sized,
|
||||
New: Index<usize, Output = &'x T> + ?Sized,
|
||||
T: 'x + ?Sized,
|
||||
'x: 'lookup,
|
||||
{
|
||||
let (tag, old_range, new_range) = self.as_tag_tuple();
|
||||
let mut old_index = old_range.start;
|
||||
let mut new_index = new_range.start;
|
||||
let mut old_i = old_range.start;
|
||||
let mut new_i = new_range.start;
|
||||
|
||||
std::iter::from_fn(move || match tag {
|
||||
DiffTag::Equal => {
|
||||
if old_i < old_range.end {
|
||||
let value = old[old_i];
|
||||
old_i += 1;
|
||||
old_index += 1;
|
||||
new_index += 1;
|
||||
Some(Change {
|
||||
tag: ChangeTag::Equal,
|
||||
old_index: Some(old_index - 1),
|
||||
new_index: Some(new_index - 1),
|
||||
value,
|
||||
})
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
DiffTag::Delete => {
|
||||
if old_i < old_range.end {
|
||||
let value = old[old_i];
|
||||
old_i += 1;
|
||||
old_index += 1;
|
||||
Some(Change {
|
||||
tag: ChangeTag::Delete,
|
||||
old_index: Some(old_index - 1),
|
||||
new_index: None,
|
||||
value,
|
||||
})
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
DiffTag::Insert => {
|
||||
if new_i < new_range.end {
|
||||
let value = new[new_i];
|
||||
new_i += 1;
|
||||
new_index += 1;
|
||||
Some(Change {
|
||||
tag: ChangeTag::Insert,
|
||||
old_index: None,
|
||||
new_index: Some(new_index - 1),
|
||||
value,
|
||||
})
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
DiffTag::Replace => {
|
||||
if old_i < old_range.end {
|
||||
let value = old[old_i];
|
||||
old_i += 1;
|
||||
old_index += 1;
|
||||
Some(Change {
|
||||
tag: ChangeTag::Delete,
|
||||
old_index: Some(old_index - 1),
|
||||
new_index: None,
|
||||
value,
|
||||
})
|
||||
} else if new_i < new_range.end {
|
||||
let value = new[new_i];
|
||||
new_i += 1;
|
||||
new_index += 1;
|
||||
Some(Change {
|
||||
tag: ChangeTag::Insert,
|
||||
old_index: None,
|
||||
new_index: Some(new_index - 1),
|
||||
value,
|
||||
})
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
})
|
||||
ChangesIter::new(old, new, *self)
|
||||
}
|
||||
|
||||
/// Given a diffop yields the changes it encodes against the given slices.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue