1use std::ops::{Deref, DerefMut};
2
3use serde::{Deserialize, Serialize};
4use slop_alloc::HasBackend;
5
6#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct Rounds<M> {
8 pub rounds: Vec<M>,
9}
10
11impl<M> Rounds<M> {
12 #[inline]
13 pub const fn new() -> Self {
14 Self { rounds: vec![] }
15 }
16}
17
18impl<M> Default for Rounds<M> {
19 #[inline]
20 fn default() -> Self {
21 Self::new()
22 }
23}
24
25impl<M> Deref for Rounds<M> {
26 type Target = Vec<M>;
27
28 fn deref(&self) -> &Self::Target {
29 &self.rounds
30 }
31}
32
33impl<M> DerefMut for Rounds<M> {
34 fn deref_mut(&mut self) -> &mut Self::Target {
35 &mut self.rounds
36 }
37}
38
39impl<M> FromIterator<M> for Rounds<M> {
40 fn from_iter<T: IntoIterator<Item = M>>(iter: T) -> Self {
41 Rounds { rounds: iter.into_iter().collect() }
42 }
43}
44
45impl<M> IntoIterator for Rounds<M> {
46 type Item = M;
47 type IntoIter = <Vec<M> as IntoIterator>::IntoIter;
48
49 fn into_iter(self) -> Self::IntoIter {
50 self.rounds.into_iter()
51 }
52}
53
54impl<M> Extend<M> for Rounds<M> {
55 fn extend<T: IntoIterator<Item = M>>(&mut self, iter: T) {
56 self.rounds.extend(iter);
57 }
58}
59
60impl<M> HasBackend for Rounds<M>
61where
62 M: HasBackend,
63{
64 type Backend = M::Backend;
65
66 fn backend(&self) -> &Self::Backend {
67 assert!(!self.rounds.is_empty(), "Rounds must not be empty");
68 self.rounds.first().unwrap().backend()
69 }
70}