Skip to main content

slop_commit/
rounds.rs

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}