#![cfg_attr(feature = "bench", feature(test))]
extern crate byteorder;
#[cfg(feature = "bench")]
extern crate test;
use byteorder::ByteOrder;
#[cfg(feature = "dyn")]
mod bitvec;
mod bitwise;
pub mod secded7264;
mod secded_64;
pub use secded_64::SecDed64;
mod secded_128;
pub use secded_128::SecDed128;
#[cfg(feature = "ffi")]
#[allow(non_snake_case)]
pub mod ffi;
#[cfg(feature = "dyn")]
mod secded_dynamic;
#[cfg(feature = "dyn")]
pub use secded_dynamic::SecDedDynamic;
fn hamming_size(encodable_size: usize) -> usize {
let mut m = 1;
while (1 << m) - m - 1 < encodable_size as usize {
m += 1;
}
m
}
pub trait SecDedCodec {
fn encodable_size(&self) -> usize;
fn code_size(&self) -> usize;
fn expected_slice_size(&self) -> Option<usize> {
None
}
fn encode(&self, data: &mut [u8]);
fn decode(&self, data: &mut [u8]) -> Result<(), ()>;
}
pub enum SECDED {
U64(SecDed64),
U128(SecDed128),
#[cfg(feature = "dyn")]
DYNAMIC(SecDedDynamic),
}
impl SECDED {
pub fn new(encodable_size: usize) -> Self {
match encodable_size {
0..=57 => SECDED::U64(SecDed64::new(encodable_size)),
58..=120 => SECDED::U128(SecDed128::new(encodable_size)),
#[cfg(feature = "dyn")]
_ => SECDED::DYNAMIC(SecDedDynamic::new(encodable_size)),
#[cfg(not(feature = "dyn"))]
_ => panic!("{} bits not handled by this version of the crate, try on a platform that has u128 or \
using features std and dyn", encodable_size)
}
}
}