argon2/
thread_mode.rs

1// Copyright (c) 2017 Xidorn Quan <[email protected]>
2// Copyright (c) 2017 Martijn Rijkeboer <[email protected]>
3//
4// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
5// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
6// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
7// option. This file may not be copied, modified, or distributed
8// except according to those terms.
9
10/// The thread mode used to perform the hashing.
11#[derive(Clone, Copy, Debug, Eq, PartialEq)]
12pub enum ThreadMode {
13    /// Run in one thread.
14    Sequential,
15
16    #[cfg(feature = "crossbeam-utils")]
17    /// Run in the same number of threads as the number of lanes.
18    Parallel,
19}
20
21impl ThreadMode {
22    #[cfg(feature = "crossbeam-utils")]
23    /// Create a thread mode from the threads count.
24    pub fn from_threads(threads: u32) -> ThreadMode {
25        if threads > 1 {
26            ThreadMode::Parallel
27        } else {
28            ThreadMode::Sequential
29        }
30    }
31
32    #[cfg(not(feature = "crossbeam-utils"))]
33    pub fn from_threads(threads: u32) -> ThreadMode {
34        assert_eq!(threads, 1);
35        Self::default()
36    }
37}
38
39impl Default for ThreadMode {
40    fn default() -> ThreadMode {
41        ThreadMode::Sequential
42    }
43}
44
45#[cfg(test)]
46mod tests {
47
48    use crate::thread_mode::ThreadMode;
49
50    #[test]
51    fn default_returns_correct_thread_mode() {
52        assert_eq!(ThreadMode::default(), ThreadMode::Sequential);
53    }
54
55    #[cfg(feature = "crossbeam-utils")]
56    #[test]
57    fn from_threads_returns_correct_thread_mode() {
58        assert_eq!(ThreadMode::from_threads(0), ThreadMode::Sequential);
59        assert_eq!(ThreadMode::from_threads(1), ThreadMode::Sequential);
60        assert_eq!(ThreadMode::from_threads(2), ThreadMode::Parallel);
61        assert_eq!(ThreadMode::from_threads(10), ThreadMode::Parallel);
62        assert_eq!(ThreadMode::from_threads(100), ThreadMode::Parallel);
63    }
64}