mod ops;
mod conv;
use crate::*;
use flint_sys::{
fq_default::fq_default_ctx_struct,
fq_default_poly::*
};
use std::fmt;
use std::mem::{ManuallyDrop, MaybeUninit};
pub struct FinFldPoly {
inner: fq_default_poly_struct,
ctx: FinFldCtx,
}
impl AsRef<FinFldPoly> for FinFldPoly {
#[inline]
fn as_ref(&self) -> &FinFldPoly {
self
}
}
impl Clone for FinFldPoly {
#[inline]
fn clone(&self) -> Self {
let mut res = FinFldPoly::zero(self.context());
unsafe {
fq_default_poly_set(
res.as_mut_ptr(),
self.as_ptr(),
self.ctx_as_ptr()
);
}
res
}
}
impl fmt::Debug for FinFldPoly {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("FinFldPoly")
.field("ctx", &self.ctx)
.finish()
}
}
impl Drop for FinFldPoly {
#[inline]
fn drop(&mut self) {
unsafe {
fq_default_poly_clear(self.as_mut_ptr(), self.ctx_as_ptr())
}
}
}
impl FinFldPoly {
pub fn with_capacity(capacity: usize, ctx: &FinFldCtx) -> Self {
let mut z = MaybeUninit::uninit();
unsafe {
fq_default_poly_init2(
z.as_mut_ptr(),
capacity.try_into().expect("Cannot convert input to a signed long."),
ctx.as_ptr()
);
FinFldPoly::from_raw(z.assume_init(), ctx.clone())
}
}
#[inline]
pub fn zero(ctx: &FinFldCtx) -> FinFldPoly {
let mut z = MaybeUninit::uninit();
unsafe {
fq_default_poly_init(z.as_mut_ptr(), ctx.as_ptr());
FinFldPoly::from_raw(z.assume_init(), ctx.clone())
}
}
#[inline]
pub fn one(ctx: &FinFldCtx) -> FinFldPoly {
let mut res = FinFldPoly::zero(ctx);
unsafe{ fq_default_poly_one(res.as_mut_ptr(), ctx.as_ptr()); }
res
}
#[inline]
pub const fn as_ptr(&self) -> *const fq_default_poly_struct {
&self.inner
}
#[inline]
pub fn as_mut_ptr(&mut self) -> *mut fq_default_poly_struct {
&mut self.inner
}
#[inline]
pub fn ctx_as_ptr(&self) -> *const fq_default_ctx_struct {
self.context().as_ptr()
}
#[inline]
pub const unsafe fn from_raw(
inner: fq_default_poly_struct,
ctx: FinFldCtx
) -> Self {
FinFldPoly { inner, ctx }
}
#[inline]
pub const fn into_raw(self) -> fq_default_poly_struct {
let inner = self.inner;
let _ = ManuallyDrop::new(self);
inner
}
#[inline]
pub fn context(&self) -> &FinFldCtx {
&self.ctx
}
#[inline]
pub fn modulus(&self) -> IntModPoly {
self.context().modulus()
}
}