rendy_chain/schedule/
queue.rs

1use super::submission::{Submission, SubmissionId};
2
3/// Queue id.
4#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
5pub struct QueueId {
6    /// Family id of the queue.
7    pub family: rendy_core::hal::queue::QueueFamilyId,
8
9    /// Index of the queue.
10    pub index: usize,
11}
12
13impl QueueId {
14    /// Create queue id from family id and index.
15    pub fn new(family: rendy_core::hal::queue::QueueFamilyId, index: usize) -> Self {
16        QueueId {
17            family: family,
18            index,
19        }
20    }
21
22    /// Get family id.
23    pub fn family(&self) -> rendy_core::hal::queue::QueueFamilyId {
24        self.family
25    }
26
27    /// Get index within the family.
28    pub fn index(&self) -> usize {
29        self.index
30    }
31}
32
33/// Instances of this type contains array of `Submission`s.
34/// Those submissions are expected to be submitted in order.
35#[derive(Clone, Debug)]
36pub struct Queue<S> {
37    id: QueueId,
38    submissions: Vec<Submission<S>>,
39}
40
41impl<S> Queue<S> {
42    /// Create new queue with specified id.
43    pub fn new(id: QueueId) -> Self {
44        Queue {
45            id,
46            submissions: Vec::new(),
47        }
48    }
49
50    /// Get id of the queue.
51    pub fn id(&self) -> QueueId {
52        self.id
53    }
54
55    /// Iterate over immutable references to each submission in this queue
56    pub fn iter(&self) -> impl Iterator<Item = &Submission<S>> {
57        self.submissions.iter()
58    }
59
60    /// Iterate over mutable references to each submission in this queue
61    pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut Submission<S>> {
62        self.submissions.iter_mut()
63    }
64
65    // /// Iterate over mutable references to each submission in this queue
66    // pub fn into_iter(self) -> QueueIntoIter<S> {
67    //     QueueIntoIter {
68    //         qid: self.id,
69    //         iter: self.submissions.into_iter().enumerate(),
70    //     }
71    // }
72
73    /// Get the number of submissions in queue.
74    pub fn len(&self) -> usize {
75        self.submissions.len()
76    }
77
78    /// Get reference to `Submission` instance by id.
79    ///
80    /// # Panic
81    ///
82    /// This function will panic if requested submission isn't part of this queue.
83    ///
84    pub fn submission(&self, sid: SubmissionId) -> Option<&Submission<S>> {
85        assert_eq!(self.id, sid.queue());
86        self.submissions.get(sid.index())
87    }
88
89    /// Get mutable reference to `Submission` instance by id.
90    ///
91    /// # Panic
92    ///
93    /// This function will panic if requested submission isn't part of this queue.
94    ///
95    pub fn submission_mut(&mut self, sid: SubmissionId) -> Option<&mut Submission<S>> {
96        assert_eq!(self.id, sid.queue());
97        self.submissions.get_mut(sid.index())
98    }
99
100    // /// Get reference to last `Submission` instance.
101    // pub fn last_submission(&self) -> Option<&Submission<S>> {
102    //     self.submissions.last()
103    // }
104
105    // /// Get mutable reference to last `Submission` instance.
106    // pub fn last_submission_mut(&mut self) -> Option<&mut Submission<S>> {
107    //     self.submissions.last_mut()
108    // }
109
110    /// Add `Submission` instance to the end of queue.
111    /// Returns id of the added submission.
112    pub fn add_submission(
113        &mut self,
114        node: usize,
115        wait_factor: usize,
116        submit_order: usize,
117        sync: S,
118    ) -> SubmissionId {
119        let sid = SubmissionId::new(self.id, self.submissions.len());
120        self.submissions
121            .push(Submission::new(node, wait_factor, submit_order, sid, sync));
122        sid
123    }
124
125    /// Add `Submission` instance to the end of queue.
126    /// Check that submission has correct id.
127    pub fn add_submission_checked(&mut self, submission: Submission<S>) {
128        assert_eq!(
129            submission.id(),
130            SubmissionId::new(self.id, self.submissions.len())
131        );
132        self.submissions.push(submission);
133    }
134}