Added deadlines to all algorithms (#18)
This adds a deadline to all algorithms which lets one bail in a fixed amount of time to avoid pathological cases.
This commit is contained in:
parent
99386e8106
commit
74e2805a95
11 changed files with 412 additions and 57 deletions
|
|
@ -39,6 +39,7 @@ mod replace;
|
|||
|
||||
use std::hash::Hash;
|
||||
use std::ops::{Index, Range};
|
||||
use std::time::Instant;
|
||||
|
||||
pub use capture::Capture;
|
||||
pub use hook::{DiffHook, NoFinishHook};
|
||||
|
|
@ -62,6 +63,34 @@ pub fn diff<Old, New, D>(
|
|||
new: &New,
|
||||
new_range: Range<usize>,
|
||||
) -> Result<(), D::Error>
|
||||
where
|
||||
Old: Index<usize> + ?Sized,
|
||||
New: Index<usize> + ?Sized,
|
||||
D: DiffHook,
|
||||
Old::Output: Hash + Eq + Ord,
|
||||
New::Output: PartialEq<Old::Output> + Hash + Eq + Ord,
|
||||
{
|
||||
diff_deadline(alg, d, old, old_range, new, new_range, None)
|
||||
}
|
||||
|
||||
/// Creates a diff between old and new with the given algorithm with deadline.
|
||||
///
|
||||
/// Diffs `old`, between indices `old_range` and `new` between indices `new_range`.
|
||||
///
|
||||
/// This diff is done with an optional deadline that defines the maximal
|
||||
/// execution time permitted before it bails and falls back to an approximation.
|
||||
/// Note that not all algorithms behave well if they reach the deadline (LCS
|
||||
/// for instance produces a very simplistic diff when the deadline is reached
|
||||
/// in all cases).
|
||||
pub fn diff_deadline<Old, New, D>(
|
||||
alg: Algorithm,
|
||||
d: &mut D,
|
||||
old: &Old,
|
||||
old_range: Range<usize>,
|
||||
new: &New,
|
||||
new_range: Range<usize>,
|
||||
deadline: Option<Instant>,
|
||||
) -> Result<(), D::Error>
|
||||
where
|
||||
Old: Index<usize> + ?Sized,
|
||||
New: Index<usize> + ?Sized,
|
||||
|
|
@ -70,9 +99,9 @@ where
|
|||
New::Output: PartialEq<Old::Output> + Hash + Eq + Ord,
|
||||
{
|
||||
match alg {
|
||||
Algorithm::Myers => myers::diff(d, old, old_range, new, new_range),
|
||||
Algorithm::Patience => patience::diff(d, old, old_range, new, new_range),
|
||||
Algorithm::Lcs => lcs::diff(d, old, old_range, new, new_range),
|
||||
Algorithm::Myers => myers::diff_deadline(d, old, old_range, new, new_range, deadline),
|
||||
Algorithm::Patience => patience::diff_deadline(d, old, old_range, new, new_range, deadline),
|
||||
Algorithm::Lcs => lcs::diff_deadline(d, old, old_range, new, new_range, deadline),
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -84,3 +113,18 @@ where
|
|||
{
|
||||
diff(alg, d, old, 0..old.len(), new, 0..new.len())
|
||||
}
|
||||
|
||||
/// Shortcut for diffing slices with a specific algorithm.
|
||||
pub fn diff_slices_deadline<D, T>(
|
||||
alg: Algorithm,
|
||||
d: &mut D,
|
||||
old: &[T],
|
||||
new: &[T],
|
||||
deadline: Option<Instant>,
|
||||
) -> Result<(), D::Error>
|
||||
where
|
||||
D: DiffHook,
|
||||
T: Eq + Hash + Ord,
|
||||
{
|
||||
diff_deadline(alg, d, old, 0..old.len(), new, 0..new.len(), deadline)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue