#[no_mangle]
pub extern "C" fn ragc_calculate_split_position(pos: u64, kmer_length: u32) -> u64 {
(pos + 1).saturating_sub(kmer_length as u64)
}
#[no_mangle]
pub extern "C" fn ragc_calculate_segment_end(pos: u64) -> u64 {
pos + 1
}
#[no_mangle]
pub extern "C" fn ragc_calculate_segment_length(split_pos: u64, segment_end: u64) -> u64 {
segment_end.saturating_sub(split_pos)
}
#[repr(C)]
pub struct SegmentBoundary {
pub segment_end: u64,
pub new_split_pos: u64,
pub segment_length: u64,
}
#[no_mangle]
pub extern "C" fn ragc_calculate_segment_boundary(
current_pos: u64,
current_split_pos: u64,
kmer_length: u32,
) -> SegmentBoundary {
let segment_end = ragc_calculate_segment_end(current_pos);
let segment_length = ragc_calculate_segment_length(current_split_pos, segment_end);
let new_split_pos = ragc_calculate_split_position(current_pos, kmer_length);
SegmentBoundary {
segment_end,
new_split_pos,
segment_length,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_split_position() {
assert_eq!(ragc_calculate_split_position(100, 21), 80);
assert_eq!(ragc_calculate_split_position(10, 21), 0);
assert_eq!(ragc_calculate_split_position(50, 3), 48);
}
#[test]
fn test_segment_end() {
assert_eq!(ragc_calculate_segment_end(100), 101);
assert_eq!(ragc_calculate_segment_end(0), 1);
assert_eq!(ragc_calculate_segment_end(999), 1000);
}
#[test]
fn test_segment_length() {
assert_eq!(ragc_calculate_segment_length(0, 101), 101);
assert_eq!(ragc_calculate_segment_length(80, 101), 21);
assert_eq!(ragc_calculate_segment_length(100, 50), 0);
}
#[test]
fn test_complete_boundary() {
let boundary = ragc_calculate_segment_boundary(100, 0, 21);
assert_eq!(boundary.segment_end, 101); assert_eq!(boundary.new_split_pos, 80); assert_eq!(boundary.segment_length, 101); }
#[test]
fn test_complete_boundary_mid_contig() {
let boundary = ragc_calculate_segment_boundary(250, 80, 21);
assert_eq!(boundary.segment_end, 251); assert_eq!(boundary.new_split_pos, 230); assert_eq!(boundary.segment_length, 171); }
#[test]
fn test_boundary_with_small_k() {
let boundary = ragc_calculate_segment_boundary(100, 0, 3);
assert_eq!(boundary.segment_end, 101);
assert_eq!(boundary.new_split_pos, 98); assert_eq!(boundary.segment_length, 101);
}
}