use crate::codes::*;
use crate::impls::*;
use crate::traits::*;
use common_traits::*;
#[cfg(feature = "mem_dbg")]
use mem_dbg::{MemDbg, MemSize};
use std::error::Error;
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> {
return 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> {
return self.read_delta_param::<false, 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<E: Error, 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> {
return self.read_gamma_param::<false>();
}
}
impl<E: Error, 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> {
return self.read_delta_param::<false, true>();
}
}
impl<E: Error, 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_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, 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_default_write_codes! {LittleEndian, BigEndian}