use crate::{Digit, WindowSize, WnafSize, le_repr, wnaf_form};
use array::{Array, typenum::Unsigned};
use core::marker::PhantomData;
use ff::PrimeField;
#[cfg(doc)]
use crate::WnafBase;
#[derive(Clone, Debug, Default)]
pub struct WnafScalar<F: PrimeField + WnafSize, W: WindowSize> {
pub(crate) wnaf: Array<Digit, F::StorageSize>,
pub(crate) digits: usize,
_field: PhantomData<(F, W)>,
}
impl<F: PrimeField + WnafSize, W: WindowSize> WnafScalar<F, W> {
#[inline]
pub fn new(scalar: &F) -> Self {
Self::from_le_bytes(le_repr(scalar).as_ref())
}
#[inline]
pub fn from_le_bytes(bytes: &[u8]) -> Self {
let mut wnaf = Self::default();
wnaf.init_from_le_bytes(bytes);
wnaf
}
#[inline]
pub fn init_from_le_bytes(&mut self, bytes: &[u8]) {
debug_assert_eq!(F::NUM_BITS + 1, F::StorageSize::U32);
debug_assert!(
bytes.len() <= F::NUM_BITS.div_ceil(8) as usize,
"input too large: {}",
bytes.len(),
);
let bit_len = (bytes.len() * 8).min(F::NUM_BITS as usize);
self.digits = wnaf_form(&mut self.wnaf, bytes, bit_len, W::USIZE);
}
}