scrypt_opt/
pipeline.rs

1use crate::{
2    Align64,
3    fixed_r::{Block, BufferSet},
4};
5use generic_array::{ArrayLength, typenum::NonZero};
6
7/// A context for a pipeline computation.
8///
9/// It is already implemented for `(&'a Align64<Block<R>>, &'b mut BlockU8<R>)` and `(&'a Align64<Block<R>>, &'b mut Align64<BlockU8<R>>)`
10pub trait PipelineContext<
11    S,
12    Q: AsRef<[Align64<Block<R>>]> + AsMut<[Align64<Block<R>>]>,
13    R: ArrayLength + NonZero,
14    K,
15>
16{
17    /// Called to initialize each computation.
18    fn begin(&mut self, state: &mut S, buffer_set: &mut BufferSet<Q, R>);
19
20    /// Called to process the result of each computation.
21    ///
22    /// Returns `Some(K)` if the computation should be terminated.
23    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}