use super::{default_HDPC, NoHDPC, NoLDPC, RQLDPC, ReversedLDPC, R10LDPC, R10HDPC};
use fountain_engine::CodeParams;
use fountain_engine::traits::HDPC;
use fountain_engine::traits::LDPC;
#[derive(Clone, Debug)]
pub enum LDPCType {
NoLDPC,
R10LDPC,
RQLDPC,
ReversedLDPC,
}
impl LDPCType {
pub fn create(&self, params: &CodeParams) -> Box<dyn LDPC> {
match self {
LDPCType::NoLDPC => Box::new(NoLDPC),
LDPCType::R10LDPC => Box::new(R10LDPC::new(params)),
LDPCType::RQLDPC => Box::new(RQLDPC::new(params)),
LDPCType::ReversedLDPC => Box::new(ReversedLDPC::new(params)),
}
}
}
#[derive(Clone, Debug)]
pub enum HDPCType {
NoHDPC,
R10HDPC,
Default,
}
impl HDPCType {
pub fn create(&self, params: &CodeParams) -> Box<dyn HDPC> {
match self {
HDPCType::NoHDPC => Box::new(NoHDPC),
HDPCType::R10HDPC => Box::new(R10HDPC::new()),
HDPCType::Default => default_HDPC(params.h),
}
}
}
#[deprecated(since = "1.0.0", note = "Use HDPCType and LDPCType instead")]
#[derive(Clone, Debug)]
pub struct PrecodeConfig {
pub hdpc_type: HDPCType,
pub ldpc_type: LDPCType,
}
impl PrecodeConfig {
pub fn generate(&self, params: &CodeParams) -> (Option<Box<dyn HDPC>>, Option<Box<dyn LDPC>>) {
let ldpc_option = if params.l == 0 {
None
} else {
Some(self.ldpc_type.create(params))
};
let hdpc_option = if params.h == 0 {
None
} else {
Some(self.hdpc_type.create(params))
};
(hdpc_option, ldpc_option)
}
}