use super::submission::{Submission, SubmissionId};
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub struct QueueId {
pub family: rendy_core::hal::queue::QueueFamilyId,
pub index: usize,
}
impl QueueId {
pub fn new(family: rendy_core::hal::queue::QueueFamilyId, index: usize) -> Self {
QueueId {
family: family,
index,
}
}
pub fn family(&self) -> rendy_core::hal::queue::QueueFamilyId {
self.family
}
pub fn index(&self) -> usize {
self.index
}
}
#[derive(Clone, Debug)]
pub struct Queue<S> {
id: QueueId,
submissions: Vec<Submission<S>>,
}
impl<S> Queue<S> {
pub fn new(id: QueueId) -> Self {
Queue {
id,
submissions: Vec::new(),
}
}
pub fn id(&self) -> QueueId {
self.id
}
pub fn iter(&self) -> impl Iterator<Item = &Submission<S>> {
self.submissions.iter()
}
pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut Submission<S>> {
self.submissions.iter_mut()
}
pub fn len(&self) -> usize {
self.submissions.len()
}
pub fn submission(&self, sid: SubmissionId) -> Option<&Submission<S>> {
assert_eq!(self.id, sid.queue());
self.submissions.get(sid.index())
}
pub fn submission_mut(&mut self, sid: SubmissionId) -> Option<&mut Submission<S>> {
assert_eq!(self.id, sid.queue());
self.submissions.get_mut(sid.index())
}
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
}
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);
}
}