use crate::codes::*;
use crate::impls::*;
use crate::traits::*;
use common_traits::*;
use core::error::Error;
#[cfg(feature = "mem_dbg")]
use mem_dbg::{MemDbg, MemSize};
pub trait ReadParams {}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "mem_dbg", derive(MemDbg, MemSize))]
pub struct DefaultReadParams;
impl ReadParams for DefaultReadParams {}
macro_rules! impl_default_read_codes {
($($endianess:ident),*) => {$(
impl<WR: WordRead> GammaRead<$endianess>
for BufBitReader<$endianess, WR, DefaultReadParams>
where
WR:: Word: DoubleType + UpcastableInto<u64>,
<WR::Word as DoubleType>::DoubleType: CastableInto<u64>,
{
#[inline(always)]
fn read_gamma(&mut self) -> Result<u64, Self::Error> {
self.read_gamma_param::<false>()
}
}
impl<WR: WordRead> DeltaRead<$endianess>
for BufBitReader<$endianess, WR, DefaultReadParams>
where
WR:: Word: DoubleType + UpcastableInto<u64>,
<WR::Word as DoubleType>::DoubleType: CastableInto<u64>,
{
#[inline(always)]
fn read_delta(&mut self) -> Result<u64, Self::Error> {
self.read_delta_param::<false, true>()
}
}
impl<WR: WordRead> OmegaRead<$endianess>
for BufBitReader<$endianess, WR, DefaultReadParams>
where
WR:: Word: DoubleType + UpcastableInto<u64>,
<WR::Word as DoubleType>::DoubleType: CastableInto<u64>,
{
#[inline(always)]
fn read_omega(&mut self) -> Result<u64, Self::Error> {
self.read_omega_param::<true>()
}
}
impl<WR: WordRead> ZetaRead<$endianess>
for BufBitReader<$endianess, WR, DefaultReadParams>
where
WR:: Word: DoubleType + UpcastableInto<u64>,
<WR::Word as DoubleType>::DoubleType: CastableInto<u64>,
{
#[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> PiRead<$endianess>
for BufBitReader<$endianess, WR, DefaultReadParams>
where
WR:: Word: DoubleType + UpcastableInto<u64>,
<WR::Word as DoubleType>::DoubleType: CastableInto<u64>,
{
#[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<E: Error + Send + Sync + 'static, WR: WordRead<Error = E, Word = u64> + WordSeek<Error = E>> GammaRead<$endianess>
for BitReader<$endianess, WR, DefaultReadParams>
where
WR:: Word: DoubleType + UpcastableInto<u64>,
<WR::Word as DoubleType>::DoubleType: CastableInto<u64>,
{
#[inline(always)]
fn read_gamma(&mut self) -> Result<u64, Self::Error> {
self.read_gamma_param::<false>()
}
}
impl<E: Error + Send + Sync + 'static, WR: WordRead<Error = E, Word = u64> + WordSeek<Error = E>> DeltaRead<$endianess>
for BitReader<$endianess, WR, DefaultReadParams>
where
WR:: Word: DoubleType + UpcastableInto<u64>,
<WR::Word as DoubleType>::DoubleType: CastableInto<u64>,
{
#[inline(always)]
fn read_delta(&mut self) -> Result<u64, Self::Error> {
self.read_delta_param::<false, true>()
}
}
impl<E: Error + Send + Sync + 'static, WR: WordRead<Error = E, Word = u64> + WordSeek<Error = E>> OmegaRead<$endianess>
for BitReader<$endianess, WR, DefaultReadParams>
where
WR:: Word: DoubleType + UpcastableInto<u64>,
<WR::Word as DoubleType>::DoubleType: CastableInto<u64>,
{
#[inline(always)]
fn read_omega(&mut self) -> Result<u64, Self::Error> {
self.read_omega_param::<true>()
}
}
impl<E: Error + Send + Sync + 'static, WR: WordRead<Error = E, Word = u64> + WordSeek<Error = E>> ZetaRead<$endianess>
for BitReader<$endianess, WR, DefaultReadParams>
where
WR:: Word: DoubleType + UpcastableInto<u64>,
<WR::Word as DoubleType>::DoubleType: CastableInto<u64>,
{
#[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<E: Error + Send + Sync + 'static, WR: WordRead<Error = E, Word = u64> + WordSeek<Error = E>> PiRead<$endianess>
for BitReader<$endianess, WR, DefaultReadParams>
where
WR:: Word: DoubleType + UpcastableInto<u64>,
<WR::Word as DoubleType>::DoubleType: CastableInto<u64>,
{
#[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))]
pub struct DefaultWriteParams;
impl WriteParams for DefaultWriteParams {}
macro_rules! impl_default_write_codes {
($($endianess:ident),*) => {$(
impl<WR: WordWrite> GammaWrite<$endianess>
for BufBitWriter<$endianess, WR, DefaultWriteParams>
where u64: CastableInto<WR::Word>,
{
#[inline(always)]
fn write_gamma(&mut self, value: u64) -> Result<usize, Self::Error> {
self.write_gamma_param::<true>(value)
}
}
impl<WR: WordWrite, DC: WriteParams> DeltaWrite<$endianess>
for BufBitWriter<$endianess, WR, DC>
where u64: CastableInto<WR::Word>,
{
#[inline(always)]
fn write_delta(&mut self, value: u64) -> Result<usize, Self::Error> {
self.write_delta_param::<true, true>(value)
}
}
impl<WR: WordWrite, WP: WriteParams> OmegaWrite<$endianess>
for BufBitWriter<$endianess, WR, WP>
where u64: CastableInto<WR::Word>,
{
#[inline(always)]
fn write_omega(&mut self, value: u64) -> Result<usize, Self::Error> {
self.write_omega_param::<true>(value)
}
}
impl<WR: WordWrite, DC: WriteParams> ZetaWrite<$endianess>
for BufBitWriter<$endianess, WR, DC>
where u64: CastableInto<WR::Word>,
{
#[inline(always)]
fn write_zeta(&mut self, value: u64, k: usize) -> Result<usize, Self::Error> {
self.write_zeta_param::<true>(value, k)
}
#[inline(always)]
fn write_zeta3(&mut self, value: u64) -> Result<usize, Self::Error> {
self.write_zeta3_param::<true>(value)
}
}
impl<WR: WordWrite, DC: WriteParams> PiWrite<$endianess>
for BufBitWriter<$endianess, WR, DC>
where u64: CastableInto<WR::Word>,
{
#[inline(always)]
fn write_pi(&mut self, value: u64, k: usize) -> Result<usize, Self::Error> {
self.write_pi_param::<true>(value, k)
}
#[inline(always)]
fn write_pi2(&mut self, value: u64) -> Result<usize, Self::Error> {
self.write_pi2_param::<true>(value)
}
}
)*};
}
impl_default_write_codes! {LittleEndian, BigEndian}