use crate::ffi_apis::common::BincodeBuffer;
use crate::ffi_apis::common::from_bincode_buffer;
use crate::ffi_apis::common::to_bincode_buffer;
use crate::symbolic::finite_field::FiniteFieldPolynomial;
use crate::symbolic::poly_factorization::factor_gf;
use crate::symbolic::poly_factorization::poly_derivative_gf;
use crate::symbolic::poly_factorization::poly_gcd_gf;
use crate::symbolic::poly_factorization::square_free_factorization_gf;
#[unsafe(no_mangle)]
pub extern "C" fn rssn_bincode_factor_gf(poly_buf: BincodeBuffer) -> BincodeBuffer {
let poly: Option<FiniteFieldPolynomial> = from_bincode_buffer(&poly_buf);
if let Some(p) = poly {
match factor_gf(&p) {
| Ok(factors) => to_bincode_buffer(&factors),
| Err(_) => BincodeBuffer::empty(),
}
} else {
BincodeBuffer::empty()
}
}
#[unsafe(no_mangle)]
pub extern "C" fn rssn_bincode_square_free_factorization_gf(
poly_buf: BincodeBuffer
) -> BincodeBuffer {
let poly: Option<FiniteFieldPolynomial> = from_bincode_buffer(&poly_buf);
if let Some(p) = poly {
match square_free_factorization_gf(p) {
| Ok(factors) => to_bincode_buffer(&factors),
| Err(_) => BincodeBuffer::empty(),
}
} else {
BincodeBuffer::empty()
}
}
#[unsafe(no_mangle)]
pub extern "C" fn rssn_bincode_poly_gcd_gf(
a_buf: BincodeBuffer,
b_buf: BincodeBuffer,
) -> BincodeBuffer {
let a: Option<FiniteFieldPolynomial> = from_bincode_buffer(&a_buf);
let b: Option<FiniteFieldPolynomial> = from_bincode_buffer(&b_buf);
if let (Some(poly_a), Some(poly_b)) = (a, b) {
match poly_gcd_gf(poly_a, poly_b) {
| Ok(gcd) => to_bincode_buffer(&gcd),
| Err(_) => BincodeBuffer::empty(),
}
} else {
BincodeBuffer::empty()
}
}
#[unsafe(no_mangle)]
pub extern "C" fn rssn_bincode_poly_derivative_gf(poly_buf: BincodeBuffer) -> BincodeBuffer {
let poly: Option<FiniteFieldPolynomial> = from_bincode_buffer(&poly_buf);
if let Some(p) = poly {
let derivative = poly_derivative_gf(&p);
to_bincode_buffer(&derivative)
} else {
BincodeBuffer::empty()
}
}