pub use self::{
decoder_work::DecoderWork,
encoder_work::EncoderWork,
rate_default::{DefaultRate, DefaultRateDecoder, DefaultRateEncoder},
rate_high::{HighRate, HighRateDecoder, HighRateEncoder},
rate_low::{LowRate, LowRateDecoder, LowRateEncoder},
};
use crate::reed_solomon::{engine::Engine, DecoderResult, EncoderResult, Error};
mod decoder_work;
mod encoder_work;
mod rate_default;
mod rate_high;
mod rate_low;
pub trait Rate<E: Engine> {
type RateEncoder: RateEncoder<E>;
type RateDecoder: RateDecoder<E>;
fn supports(original_count: usize, recovery_count: usize) -> bool;
fn encoder(
original_count: usize,
recovery_count: usize,
shard_bytes: usize,
engine: E,
work: Option<EncoderWork>,
) -> Result<Self::RateEncoder, Error> {
Self::RateEncoder::new(original_count, recovery_count, shard_bytes, engine, work)
}
fn decoder(
original_count: usize,
recovery_count: usize,
shard_bytes: usize,
engine: E,
work: Option<DecoderWork>,
) -> Result<Self::RateDecoder, Error> {
Self::RateDecoder::new(original_count, recovery_count, shard_bytes, engine, work)
}
fn validate(
original_count: usize,
recovery_count: usize,
shard_bytes: usize,
) -> Result<(), Error> {
if !Self::supports(original_count, recovery_count) {
Err(Error::UnsupportedShardCount {
original_count,
recovery_count,
})
} else if shard_bytes == 0 || shard_bytes & 1 != 0 {
Err(Error::InvalidShardSize { shard_bytes })
} else {
Ok(())
}
}
}
pub trait RateEncoder<E: Engine>
where
Self: Sized,
{
type Rate: Rate<E>;
fn add_original_shard<T: AsRef<[u8]>>(&mut self, original_shard: T) -> Result<(), Error>;
fn encode(&mut self) -> Result<EncoderResult<'_>, Error>;
fn into_parts(self) -> (E, EncoderWork);
fn new(
original_count: usize,
recovery_count: usize,
shard_bytes: usize,
engine: E,
work: Option<EncoderWork>,
) -> Result<Self, Error>;
fn reset(
&mut self,
original_count: usize,
recovery_count: usize,
shard_bytes: usize,
) -> Result<(), Error>;
fn supports(original_count: usize, recovery_count: usize) -> bool {
Self::Rate::supports(original_count, recovery_count)
}
fn validate(
original_count: usize,
recovery_count: usize,
shard_bytes: usize,
) -> Result<(), Error> {
Self::Rate::validate(original_count, recovery_count, shard_bytes)
}
}
pub trait RateDecoder<E: Engine>
where
Self: Sized,
{
type Rate: Rate<E>;
fn add_original_shard<T: AsRef<[u8]>>(
&mut self,
index: usize,
original_shard: T,
) -> Result<(), Error>;
fn add_recovery_shard<T: AsRef<[u8]>>(
&mut self,
index: usize,
recovery_shard: T,
) -> Result<(), Error>;
fn decode(&mut self, compute_recovery: bool) -> Result<Option<DecoderResult<'_>>, Error>;
fn into_parts(self) -> (E, DecoderWork);
fn new(
original_count: usize,
recovery_count: usize,
shard_bytes: usize,
engine: E,
work: Option<DecoderWork>,
) -> Result<Self, Error>;
fn reset(
&mut self,
original_count: usize,
recovery_count: usize,
shard_bytes: usize,
) -> Result<(), Error>;
fn supports(original_count: usize, recovery_count: usize) -> bool {
Self::Rate::supports(original_count, recovery_count)
}
fn validate(
original_count: usize,
recovery_count: usize,
shard_bytes: usize,
) -> Result<(), Error> {
Self::Rate::validate(original_count, recovery_count, shard_bytes)
}
}