#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Hash)]
pub enum BufferAccessStrategy {
#[default]
Normal,
SequentialScan,
BulkRead,
BulkWrite,
}
impl BufferAccessStrategy {
pub fn ring_size(self) -> Option<usize> {
match self {
Self::Normal => None,
Self::SequentialScan => Some(16),
Self::BulkRead | Self::BulkWrite => Some(32),
}
}
pub fn is_ring(self) -> bool {
self.ring_size().is_some()
}
pub fn is_write(self) -> bool {
matches!(self, Self::BulkWrite)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_is_normal() {
assert_eq!(
BufferAccessStrategy::default(),
BufferAccessStrategy::Normal
);
}
#[test]
fn ring_size_matches_strategy() {
assert_eq!(BufferAccessStrategy::Normal.ring_size(), None);
assert_eq!(BufferAccessStrategy::SequentialScan.ring_size(), Some(16));
assert_eq!(BufferAccessStrategy::BulkRead.ring_size(), Some(32));
assert_eq!(BufferAccessStrategy::BulkWrite.ring_size(), Some(32));
}
#[test]
fn is_ring_true_for_non_normal() {
assert!(!BufferAccessStrategy::Normal.is_ring());
assert!(BufferAccessStrategy::SequentialScan.is_ring());
assert!(BufferAccessStrategy::BulkRead.is_ring());
assert!(BufferAccessStrategy::BulkWrite.is_ring());
}
#[test]
fn is_write_only_for_bulk_write() {
assert!(!BufferAccessStrategy::Normal.is_write());
assert!(!BufferAccessStrategy::SequentialScan.is_write());
assert!(!BufferAccessStrategy::BulkRead.is_write());
assert!(BufferAccessStrategy::BulkWrite.is_write());
}
}