1use crate::{
2 Align64,
3 fixed_r::{Block, BufferSet},
4};
5use generic_array::{ArrayLength, typenum::NonZero};
6
7pub trait PipelineContext<
11 S,
12 Q: AsRef<[Align64<Block<R>>]> + AsMut<[Align64<Block<R>>]>,
13 R: ArrayLength + NonZero,
14 K,
15>
16{
17 fn begin(&mut self, state: &mut S, buffer_set: &mut BufferSet<Q, R>);
19
20 fn drain(self, state: &mut S, buffer_set: &mut BufferSet<Q, R>) -> Option<K>;
24}
25
26impl<
27 'a,
28 'b,
29 S,
30 Q: AsRef<[Align64<Block<R>>]> + AsMut<[Align64<Block<R>>]>,
31 R: ArrayLength + NonZero,
32> PipelineContext<S, Q, R, ()> for (&'a Align64<Block<R>>, &'b mut Align64<Block<R>>)
33{
34 #[inline(always)]
35 fn begin(&mut self, _state: &mut S, buffer_set: &mut BufferSet<Q, R>) {
36 buffer_set.input_buffer_mut().copy_from_slice(self.0);
37 }
38
39 #[inline(always)]
40 fn drain(self, _state: &mut S, buffer_set: &mut BufferSet<Q, R>) -> Option<()> {
41 self.1.copy_from_slice(buffer_set.raw_salt_output());
42 None
43 }
44}