use std::cmp::{max, min};
#[repr(C)]
pub struct KmerPair {
pub first: u64,
pub second: u64,
}
#[no_mangle]
pub extern "C" fn ragc_create_kmer_pair(kmer1: u64, kmer2: u64) -> KmerPair {
KmerPair {
first: min(kmer1, kmer2),
second: max(kmer1, kmer2),
}
}
#[no_mangle]
pub extern "C" fn ragc_kmer_pair_equals(
pair1_first: u64,
pair1_second: u64,
pair2_first: u64,
pair2_second: u64,
) -> bool {
pair1_first == pair2_first && pair1_second == pair2_second
}
#[no_mangle]
pub extern "C" fn ragc_is_empty_kmer(kmer: u64) -> bool {
kmer == u64::MAX }
#[no_mangle]
pub extern "C" fn ragc_is_valid_kmer_pair(first: u64, second: u64) -> bool {
first != u64::MAX && second != u64::MAX
}
#[no_mangle]
pub extern "C" fn ragc_create_empty_kmer_pair() -> KmerPair {
KmerPair {
first: u64::MAX,
second: u64::MAX,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_create_kmer_pair() {
let pair = ragc_create_kmer_pair(100, 200);
assert_eq!(pair.first, 100);
assert_eq!(pair.second, 200);
let pair = ragc_create_kmer_pair(200, 100);
assert_eq!(pair.first, 100);
assert_eq!(pair.second, 200);
let pair = ragc_create_kmer_pair(150, 150);
assert_eq!(pair.first, 150);
assert_eq!(pair.second, 150);
}
#[test]
fn test_kmer_pair_equals() {
assert!(ragc_kmer_pair_equals(100, 200, 100, 200));
assert!(!ragc_kmer_pair_equals(100, 200, 100, 201));
assert!(!ragc_kmer_pair_equals(100, 200, 101, 200));
assert!(!ragc_kmer_pair_equals(100, 200, 200, 100));
}
#[test]
fn test_is_empty_kmer() {
assert!(ragc_is_empty_kmer(u64::MAX));
assert!(!ragc_is_empty_kmer(0));
assert!(!ragc_is_empty_kmer(100));
assert!(!ragc_is_empty_kmer(u64::MAX - 1));
}
#[test]
fn test_is_valid_kmer_pair() {
assert!(ragc_is_valid_kmer_pair(100, 200));
assert!(ragc_is_valid_kmer_pair(0, 0));
assert!(!ragc_is_valid_kmer_pair(u64::MAX, 200));
assert!(!ragc_is_valid_kmer_pair(100, u64::MAX));
assert!(!ragc_is_valid_kmer_pair(u64::MAX, u64::MAX));
}
#[test]
fn test_create_empty_kmer_pair() {
let pair = ragc_create_empty_kmer_pair();
assert_eq!(pair.first, u64::MAX);
assert_eq!(pair.second, u64::MAX);
assert!(ragc_is_empty_kmer(pair.first));
assert!(ragc_is_empty_kmer(pair.second));
assert!(!ragc_is_valid_kmer_pair(pair.first, pair.second));
}
#[test]
fn test_realistic_kmer_values() {
let kmer1: u64 = 0x3FFFFFFFFFF; let kmer2: u64 = 0x123456789AB;
let pair = ragc_create_kmer_pair(kmer1, kmer2);
assert_eq!(pair.first, min(kmer1, kmer2));
assert_eq!(pair.second, max(kmer1, kmer2));
assert!(ragc_is_valid_kmer_pair(pair.first, pair.second));
}
}