diff --git a/src/lib.rs b/src/lib.rs index 127d7db78..7193777ad 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -19,6 +19,7 @@ mod table_collection; mod table_iterator; mod trees; pub mod types; +mod util; // re-export fundamental constants that // we can't live without diff --git a/src/util.rs b/src/util.rs new file mode 100644 index 000000000..65ff4a323 --- /dev/null +++ b/src/util.rs @@ -0,0 +1,58 @@ +pub(crate) fn metadata_like_are_equal(a: &Option>, b: &Option>) -> bool { + match a { + Some(x) => match b { + Some(y) => x == y, + None => false, + }, + None => match b.is_none() { + true => true, + false => false, + }, + } +} + +pub(crate) fn f64_partial_cmp_equal(a: &f64, b: &f64) -> bool { + match a.partial_cmp(b) { + Some(std::cmp::Ordering::Equal) => true, + Some(std::cmp::Ordering::Less) => false, + Some(std::cmp::Ordering::Greater) => false, + None => false, + } +} + +#[cfg(test)] +mod test { + use super::metadata_like_are_equal; + + #[test] + fn compare_some_to_none() { + let v: Vec = vec![1, 2, 3]; + assert!(!metadata_like_are_equal(&Some(v), &None)); + } + + #[test] + fn compare_none_to_some() { + let v: Vec = vec![1, 2, 3]; + assert!(!metadata_like_are_equal(&None, &Some(v))); + } + + #[test] + fn compare_none_to_none() { + assert!(metadata_like_are_equal(&None, &None)); + } + + #[test] + fn compare_some_to_some_are_equal() { + let v: Vec = vec![1, 2, 3]; + let vc = v.clone(); + assert!(metadata_like_are_equal(&Some(v), &Some(vc))); + } + + #[test] + fn compare_some_to_some_are_not_equal() { + let v: Vec = vec![1, 2, 3]; + let mut vc = v.clone(); + vc.push(11); + assert!(!metadata_like_are_equal(&Some(v), &Some(vc))); + } +}