pub struct ShardByShard<'a, F: 'a + Field> { /* private fields */ }Expand description
Bookkeeper for shard by shard encoding.
This is useful for avoiding incorrect use of
encode_single and encode_single_sep
§Use cases
Shard by shard encoding is useful for streamed data encoding where you do not have all the needed data shards immediately, but you want to spread out the encoding workload rather than doing the encoding after everything is ready.
A concrete example would be network packets encoding, where encoding packet by packet as you receive them may be more efficient than waiting for N packets then encode them all at once.
§Example
use rustfs_erasure_codec::galois_8::Field;
let r: ReedSolomon<Field> = ReedSolomon::new(3, 2).unwrap();
let mut sbs = ShardByShard::new(&r);
let mut shards = shards!([0u8, 1, 2, 3, 4],
[5, 6, 7, 8, 9],
// say we don't have the 3rd data shard yet
// and we want to fill it in later
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]);
// encode 1st and 2nd data shard
sbs.encode(&mut shards).unwrap();
sbs.encode(&mut shards).unwrap();
// fill in 3rd data shard
shards[2][0] = 10.into();
shards[2][1] = 11.into();
shards[2][2] = 12.into();
shards[2][3] = 13.into();
shards[2][4] = 14.into();
// now do the encoding
sbs.encode(&mut shards).unwrap();
assert!(r.verify(&shards).unwrap());Implementations§
Source§impl<'a, F: 'a + Field> ShardByShard<'a, F>
impl<'a, F: 'a + Field> ShardByShard<'a, F>
Sourcepub fn new(codec: &'a ReedSolomon<F>) -> ShardByShard<'a, F>
pub fn new(codec: &'a ReedSolomon<F>) -> ShardByShard<'a, F>
Create a new shard-by-shard encoder.
Sourcepub fn parity_ready(&self) -> bool
pub fn parity_ready(&self) -> bool
Returns true if all data shards have been encoded and parity is ready.
Sourcepub fn reset(&mut self) -> Result<(), SBSError>
pub fn reset(&mut self) -> Result<(), SBSError>
Reset to accept a new batch of data shards.
Returns SBSError::LeftoverShards if the previous batch was incomplete.
Sourcepub fn reset_force(&mut self)
pub fn reset_force(&mut self)
Force-reset without checking for leftover shards.
Sourcepub fn cur_input_index(&self) -> usize
pub fn cur_input_index(&self) -> usize
Returns the index of the next data shard expected.
Trait Implementations§
Source§impl<'a, F: PartialEq + 'a + Field> PartialEq for ShardByShard<'a, F>
impl<'a, F: PartialEq + 'a + Field> PartialEq for ShardByShard<'a, F>
Source§fn eq(&self, other: &ShardByShard<'a, F>) -> bool
fn eq(&self, other: &ShardByShard<'a, F>) -> bool
self and other values to be equal, and is used by ==.impl<'a, F: PartialEq + 'a + Field> StructuralPartialEq for ShardByShard<'a, F>
Auto Trait Implementations§
impl<'a, F> !RefUnwindSafe for ShardByShard<'a, F>
impl<'a, F> !UnwindSafe for ShardByShard<'a, F>
impl<'a, F> Freeze for ShardByShard<'a, F>
impl<'a, F> Send for ShardByShard<'a, F>
impl<'a, F> Sync for ShardByShard<'a, F>
impl<'a, F> Unpin for ShardByShard<'a, F>
impl<'a, F> UnsafeUnpin for ShardByShard<'a, F>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more