#![allow(dead_code)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Default)]
pub enum AccessMode {
#[default]
ReadOnly,
ReadWrite,
}
impl AccessMode {
#[inline]
pub fn combine(self, other: Self) -> Self {
match (self, other) {
(Self::ReadOnly, Self::ReadOnly) => Self::ReadOnly,
_ => Self::ReadWrite,
}
}
#[inline]
pub fn is_read_only(self) -> bool {
matches!(self, Self::ReadOnly)
}
#[inline]
pub fn is_read_write(self) -> bool {
matches!(self, Self::ReadWrite)
}
}
pub trait CombineAccessModes: Iterator<Item = AccessMode> {
fn combine_all(self) -> AccessMode;
}
impl<I: Iterator<Item = AccessMode>> CombineAccessModes for I {
fn combine_all(self) -> AccessMode {
self.fold(AccessMode::ReadOnly, AccessMode::combine)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_combine_read_only() {
assert_eq!(AccessMode::ReadOnly.combine(AccessMode::ReadOnly), AccessMode::ReadOnly);
}
#[test]
fn test_combine_read_write() {
assert_eq!(AccessMode::ReadOnly.combine(AccessMode::ReadWrite), AccessMode::ReadWrite);
assert_eq!(AccessMode::ReadWrite.combine(AccessMode::ReadOnly), AccessMode::ReadWrite);
assert_eq!(AccessMode::ReadWrite.combine(AccessMode::ReadWrite), AccessMode::ReadWrite);
}
#[test]
fn test_default() {
assert_eq!(AccessMode::default(), AccessMode::ReadOnly);
}
#[test]
fn test_is_read_only() {
assert!(AccessMode::ReadOnly.is_read_only());
assert!(!AccessMode::ReadWrite.is_read_only());
}
#[test]
fn test_is_read_write() {
assert!(!AccessMode::ReadOnly.is_read_write());
assert!(AccessMode::ReadWrite.is_read_write());
}
#[test]
fn test_combine_all() {
let modes = vec![AccessMode::ReadOnly, AccessMode::ReadOnly];
assert_eq!(modes.into_iter().combine_all(), AccessMode::ReadOnly);
let modes = vec![AccessMode::ReadOnly, AccessMode::ReadWrite, AccessMode::ReadOnly];
assert_eq!(modes.into_iter().combine_all(), AccessMode::ReadWrite);
let modes: Vec<AccessMode> = vec![];
assert_eq!(modes.into_iter().combine_all(), AccessMode::ReadOnly);
}
}