use super::HeaplessBigInt;
use crate::MachineWord;
use crate::fixeduint::BytesHolder;
use const_num_traits::{FromBytes, Personality, ToBytes};
impl<T, const CAP: usize, P: Personality> HeaplessBigInt<T, CAP, P>
where
T: MachineWord + core::fmt::Debug,
{
fn holder_be(&self) -> BytesHolder<T, CAP> {
let mut ret = BytesHolder::default();
let word_size = core::mem::size_of::<T>();
for (chunk, word) in ret
.as_byte_slice_mut()
.chunks_exact_mut(word_size)
.zip(self.limbs.iter().rev())
{
let word_bytes = word.to_be_bytes();
for (dst, src) in chunk.iter_mut().zip(word_bytes.as_ref()) {
*dst = *src;
}
}
ret
}
fn holder_le(&self) -> BytesHolder<T, CAP> {
let mut ret = BytesHolder::default();
let word_size = core::mem::size_of::<T>();
for (chunk, word) in ret
.as_byte_slice_mut()
.chunks_exact_mut(word_size)
.zip(self.limbs.iter())
{
let word_bytes = word.to_le_bytes();
for (dst, src) in chunk.iter_mut().zip(word_bytes.as_ref()) {
*dst = *src;
}
}
ret
}
}
impl<T, const CAP: usize, P: Personality> ToBytes for HeaplessBigInt<T, CAP, P>
where
T: MachineWord + core::fmt::Debug,
{
type Bytes = BytesHolder<T, CAP>;
fn to_be_bytes(self) -> Self::Bytes {
self.holder_be()
}
fn to_le_bytes(self) -> Self::Bytes {
self.holder_le()
}
}
impl<T, const CAP: usize, P: Personality> ToBytes for &HeaplessBigInt<T, CAP, P>
where
T: MachineWord + core::fmt::Debug,
{
type Bytes = BytesHolder<T, CAP>;
fn to_be_bytes(self) -> Self::Bytes {
self.holder_be()
}
fn to_le_bytes(self) -> Self::Bytes {
self.holder_le()
}
}
impl<T, const CAP: usize, P: Personality> FromBytes for HeaplessBigInt<T, CAP, P>
where
T: MachineWord + core::fmt::Debug,
{
type Bytes = BytesHolder<T, CAP>;
fn from_be_bytes(bytes: &Self::Bytes) -> Self {
Self::from_be_bytes(bytes.as_ref())
}
fn from_le_bytes(bytes: &Self::Bytes) -> Self {
Self::from_le_bytes(bytes.as_ref())
}
}