#[no_mangle]
pub extern "C" fn ragc_calculate_seg2_start_pos(left_size: u32, kmer_length: u32) -> u32 {
left_size.saturating_sub(kmer_length / 2)
}
#[no_mangle]
pub extern "C" fn ragc_calculate_segment1_size(seg2_start_pos: u32, kmer_length: u32) -> u32 {
seg2_start_pos.saturating_add(kmer_length)
}
#[repr(C)]
pub struct SegmentSplitInfo {
pub seg2_start_pos: u32,
pub segment1_new_size: u32,
}
#[no_mangle]
pub extern "C" fn ragc_calculate_segment_split(
left_size: u32,
kmer_length: u32,
) -> SegmentSplitInfo {
let seg2_start_pos = left_size.saturating_sub(kmer_length / 2);
let segment1_new_size = seg2_start_pos + kmer_length;
SegmentSplitInfo {
seg2_start_pos,
segment1_new_size,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_seg2_start_pos() {
assert_eq!(ragc_calculate_seg2_start_pos(100, 21), 90);
assert_eq!(ragc_calculate_seg2_start_pos(200, 25), 188);
assert_eq!(ragc_calculate_seg2_start_pos(5, 21), 0);
assert_eq!(ragc_calculate_seg2_start_pos(0, 21), 0);
}
#[test]
fn test_segment1_size() {
assert_eq!(ragc_calculate_segment1_size(90, 21), 111);
assert_eq!(ragc_calculate_segment1_size(188, 25), 213);
assert_eq!(ragc_calculate_segment1_size(0, 21), 21);
}
#[test]
fn test_complete_split() {
let info = ragc_calculate_segment_split(100, 21);
assert_eq!(info.seg2_start_pos, 90); assert_eq!(info.segment1_new_size, 111);
let info = ragc_calculate_segment_split(200, 25);
assert_eq!(info.seg2_start_pos, 188); assert_eq!(info.segment1_new_size, 213);
let info = ragc_calculate_segment_split(5, 21);
assert_eq!(info.seg2_start_pos, 0);
assert_eq!(info.segment1_new_size, 21);
}
#[test]
fn test_overlap_size() {
let info = ragc_calculate_segment_split(100, 21);
let overlap = info.segment1_new_size - info.seg2_start_pos;
assert_eq!(overlap, 21);
let info = ragc_calculate_segment_split(200, 25);
let overlap = info.segment1_new_size - info.seg2_start_pos;
assert_eq!(overlap, 25);
}
#[test]
fn test_realistic_values() {
let info = ragc_calculate_segment_split(250, 21);
assert_eq!(info.seg2_start_pos, 240); assert_eq!(info.segment1_new_size, 261);
}
}