#[cfg(feature = "alloc")]
use core::ffi::CStr;
use core::ops::RangeInclusive;
use crate::prelude::*;
use crate::Int;
#[derive(Clone)]
pub struct Sink<'a, I: Iterator<Item = &'a mut u8>, E: EntropyScheme> {
iter: I,
scheme: E,
}
impl<'a, I: Iterator<Item = &'a mut u8>, E: EntropyScheme> Sink<'a, I, E> {
#[inline]
pub fn new(iter: I) -> Self {
Self {
iter,
scheme: E::default(),
}
}
#[inline]
pub fn put_entropic<T: Entropic>(&mut self, entropic: &T) -> Result<usize, EntropicError> {
entropic.to_entropy_sink(self)
}
#[inline]
pub fn put_uniform_range<T: Int>(
&mut self,
range: RangeInclusive<T>,
value: T,
) -> Result<usize, EntropicError> {
self.scheme.put_uniform_range(&mut self.iter, range, value)
}
#[inline]
pub fn put_uniform_ranges<T: Int, const L: usize>(
&mut self,
ranges: &[RangeInclusive<T>; L],
value: T,
) -> Result<usize, EntropicError> {
self.scheme
.put_uniform_ranges(&mut self.iter, ranges, value)
}
#[inline]
pub fn put_bounded_len(
&mut self,
range: RangeInclusive<usize>,
value: usize,
) -> Result<usize, EntropicError> {
self.scheme.put_bounded_len(&mut self.iter, range, value)
}
#[inline]
pub fn put_unbounded_len(&mut self, value: usize) -> Result<usize, EntropicError> {
self.scheme.put_unbounded_len(&mut self.iter, value)
}
#[inline]
pub fn put_bool(&mut self, value: bool) -> Result<usize, EntropicError> {
self.scheme.put_bool(&mut self.iter, value)
}
#[inline]
pub fn put_char(&mut self, value: char) -> Result<usize, EntropicError> {
self.scheme.put_char(&mut self.iter, value)
}
#[cfg(feature = "alloc")]
#[inline]
pub fn put_string(&mut self, value: &str) -> Result<usize, EntropicError> {
self.scheme.put_string(&mut self.iter, value)
}
#[cfg(feature = "alloc")]
#[inline]
pub fn put_cstring(&mut self, value: &CStr) -> Result<usize, EntropicError> {
self.scheme.put_cstring(&mut self.iter, value)
}
#[inline]
pub fn put_byte(&mut self, value: u8) -> Result<usize, EntropicError> {
self.scheme.put_byte(&mut self.iter, value)
}
#[inline]
pub fn put_slice(&mut self, slice: &[u8]) -> Result<usize, EntropicError> {
self.scheme.put_slice(&mut self.iter, slice)
}
#[inline]
pub fn put_bytearray<const T: usize>(
&mut self,
value: [u8; T],
) -> Result<usize, EntropicError> {
self.scheme.put_bytearray(&mut self.iter, value)
}
#[inline]
pub fn put_optional(&mut self, value: bool) -> Result<usize, EntropicError> {
self.scheme.put_optional(&mut self.iter, value)
}
}
pub trait AsSink<'a> {
type I: Iterator<Item = &'a mut u8>;
fn to_sink<E: EntropyScheme>(self) -> Sink<'a, Self::I, E>;
}
impl<'a, T: IntoIterator<Item = &'a mut u8>> AsSink<'a> for T {
type I = T::IntoIter;
#[inline]
fn to_sink<E: EntropyScheme>(self) -> Sink<'a, Self::I, E> {
Sink::new(self.into_iter())
}
}