#![cfg_attr(doc, doc=concat!("<img width=\"600\" class=\"figure\" src=\"data:image/svg+xml;base64,", include_str!("../plots/linux_comparison.svg.base64"), "\"></img>"))]
use std::hash::Hash;
use crate::intern::{InternedInput, Token, TokenSource};
pub use crate::sink::Sink;
#[cfg(feature = "unified_diff")]
pub use unified_diff::UnifiedDiffBuilder;
mod histogram;
pub mod intern;
mod myers;
pub mod sink;
pub mod sources;
#[cfg(feature = "unified_diff")]
mod unified_diff;
mod util;
#[cfg(test)]
mod tests;
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub enum Algorithm {
#[cfg_attr(doc, doc=concat!("<img width=\"600\" class=\"figure\" src=\"data:image/svg+xml;base64,", include_str!("../plots/linux_speedup.svg.base64"), "\"></img>"))]
Histogram,
Myers,
MyersMinimal,
}
impl Algorithm {
#[cfg(test)]
const ALL: [Self; 2] = [Algorithm::Histogram, Algorithm::Myers];
}
impl Default for Algorithm {
fn default() -> Self {
Algorithm::Histogram
}
}
pub fn diff<S: Sink, T: Eq + Hash>(
algorithm: Algorithm,
input: &InternedInput<T>,
sink: S,
) -> S::Out {
diff_with_tokens(
algorithm,
&input.before,
&input.after,
input.interner.num_tokens(),
sink,
)
}
pub fn diff_with_tokens<S: Sink>(
algorithm: Algorithm,
before: &[Token],
after: &[Token],
num_tokens: u32,
sink: S,
) -> S::Out {
assert!(
before.len() < i32::MAX as usize,
"imara-diff only supports up to {} tokens",
i32::MAX
);
assert!(
after.len() < i32::MAX as usize,
"imara-diff only supports up to {} tokens",
i32::MAX
);
match algorithm {
Algorithm::Histogram => histogram::diff(before, after, num_tokens, sink),
Algorithm::Myers => myers::diff(before, after, num_tokens, sink, false),
Algorithm::MyersMinimal => myers::diff(before, after, num_tokens, sink, true),
}
}