use crate::codes::{delta::*, gamma::*, omega::*, pi::*, zeta::*};
use crate::impls::*;
use crate::traits::*;
#[cfg(feature = "mem_dbg")]
use mem_dbg::{MemDbg, MemSize};
use num_primitive::PrimitiveNumberAs;
pub trait ReadParams {}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "mem_dbg", derive(MemDbg, MemSize))]
#[cfg_attr(feature = "mem_dbg", mem_size(flat))]
pub struct DefaultReadParams;
impl ReadParams for DefaultReadParams {}
macro_rules! impl_default_read_codes {
($($endianness:ident),*) => {$(
impl<WR: WordRead<Word: DoubleType>> GammaRead<$endianness>
for BufBitReader<$endianness, WR, DefaultReadParams>
{
#[inline(always)]
fn read_gamma(&mut self) -> Result<u64, Self::Error> {
self.read_gamma_param::<false>()
}
}
impl<WR: WordRead<Word: DoubleType>> DeltaRead<$endianness>
for BufBitReader<$endianness, WR, DefaultReadParams>
{
#[inline(always)]
fn read_delta(&mut self) -> Result<u64, Self::Error> {
if cfg!(target_arch = "aarch64") {
self.read_delta_param::<false, false>()
} else {
self.read_delta_param::<false, true>()
}
}
}
impl<WR: WordRead<Word: DoubleType>> OmegaRead<$endianness>
for BufBitReader<$endianness, WR, DefaultReadParams>
{
#[inline(always)]
fn read_omega(&mut self) -> Result<u64, Self::Error> {
self.read_omega_param::<true>()
}
}
impl<WR: WordRead<Word: DoubleType>> ZetaRead<$endianness>
for BufBitReader<$endianness, WR, DefaultReadParams>
{
#[inline(always)]
fn read_zeta(&mut self, k: usize) -> Result<u64, Self::Error> {
self.read_zeta_param(k)
}
#[inline(always)]
fn read_zeta3(&mut self) -> Result<u64, Self::Error> {
self.read_zeta3_param::<true>()
}
}
impl<WR: WordRead<Word: DoubleType>> PiRead<$endianness>
for BufBitReader<$endianness, WR, DefaultReadParams>
{
#[inline(always)]
fn read_pi(&mut self, k: usize) -> Result<u64, Self::Error> {
self.read_pi_param(k)
}
#[inline(always)]
fn read_pi2(&mut self) -> Result<u64, Self::Error> {
self.read_pi2_param::<false>()
}
}
impl<WR: WordRead<Word = u64> + WordSeek<Error = <WR as WordRead>::Error>> GammaRead<$endianness>
for BitReader<$endianness, WR, DefaultReadParams>
{
#[inline(always)]
fn read_gamma(&mut self) -> Result<u64, Self::Error> {
self.read_gamma_param::<true>()
}
}
impl<WR: WordRead<Word = u64> + WordSeek<Error = <WR as WordRead>::Error>> DeltaRead<$endianness>
for BitReader<$endianness, WR, DefaultReadParams>
{
#[inline(always)]
fn read_delta(&mut self) -> Result<u64, Self::Error> {
self.read_delta_param::<true, true>()
}
}
impl<WR: WordRead<Word = u64> + WordSeek<Error = <WR as WordRead>::Error>> OmegaRead<$endianness>
for BitReader<$endianness, WR, DefaultReadParams>
{
#[inline(always)]
fn read_omega(&mut self) -> Result<u64, Self::Error> {
self.read_omega_param::<true>()
}
}
impl<WR: WordRead<Word = u64> + WordSeek<Error = <WR as WordRead>::Error>> ZetaRead<$endianness>
for BitReader<$endianness, WR, DefaultReadParams>
{
#[inline(always)]
fn read_zeta(&mut self, k: usize) -> Result<u64, Self::Error> {
self.read_zeta_param(k)
}
#[inline(always)]
fn read_zeta3(&mut self) -> Result<u64, Self::Error> {
self.read_zeta3_param::<true>()
}
}
impl<WR: WordRead<Word = u64> + WordSeek<Error = <WR as WordRead>::Error>> PiRead<$endianness>
for BitReader<$endianness, WR, DefaultReadParams>
{
#[inline(always)]
fn read_pi(&mut self, k: usize) -> Result<u64, Self::Error> {
self.read_pi_param(k)
}
#[inline(always)]
fn read_pi2(&mut self) -> Result<u64, Self::Error> {
self.read_pi2_param::<true>()
}
}
)*};
}
impl_default_read_codes! {LittleEndian, BigEndian}
pub trait WriteParams {}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "mem_dbg", derive(MemDbg, MemSize))]
#[cfg_attr(feature = "mem_dbg", mem_size(flat))]
pub struct DefaultWriteParams;
impl WriteParams for DefaultWriteParams {}
macro_rules! impl_default_write_codes {
($($endianness:ident),*) => {$(
impl<WR: WordWrite, WP: WriteParams> GammaWrite<$endianness>
for BufBitWriter<$endianness, WR, WP>
where u64: PrimitiveNumberAs<WR::Word>,
{
#[inline(always)]
fn write_gamma(&mut self, n: u64) -> Result<usize, Self::Error> {
self.write_gamma_param::<true>(n)
}
}
impl<WR: WordWrite, WP: WriteParams> DeltaWrite<$endianness>
for BufBitWriter<$endianness, WR, WP>
where u64: PrimitiveNumberAs<WR::Word>,
{
#[inline(always)]
fn write_delta(&mut self, n: u64) -> Result<usize, Self::Error> {
self.write_delta_param::<true, true>(n)
}
}
impl<WR: WordWrite, WP: WriteParams> OmegaWrite<$endianness>
for BufBitWriter<$endianness, WR, WP>
where u64: PrimitiveNumberAs<WR::Word>,
{
#[inline(always)]
fn write_omega(&mut self, n: u64) -> Result<usize, Self::Error> {
self.write_omega_param::<true>(n)
}
}
impl<WR: WordWrite, WP: WriteParams> ZetaWrite<$endianness>
for BufBitWriter<$endianness, WR, WP>
where u64: PrimitiveNumberAs<WR::Word>,
{
#[inline(always)]
fn write_zeta(&mut self, n: u64, k: usize) -> Result<usize, Self::Error> {
self.write_zeta_param(n, k)
}
#[inline(always)]
fn write_zeta3(&mut self, n: u64) -> Result<usize, Self::Error> {
self.write_zeta3_param::<true>(n)
}
}
impl<WR: WordWrite, WP: WriteParams> PiWrite<$endianness>
for BufBitWriter<$endianness, WR, WP>
where u64: PrimitiveNumberAs<WR::Word>,
{
#[inline(always)]
fn write_pi(&mut self, n: u64, k: usize) -> Result<usize, Self::Error> {
self.write_pi_param(n, k)
}
#[inline(always)]
fn write_pi2(&mut self, n: u64) -> Result<usize, Self::Error> {
self.write_pi2_param::<false>(n)
}
}
)*};
}
impl_default_write_codes! {LittleEndian, BigEndian}