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}