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