use crate::LockType;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum LockUpgrade {
Illegal,
Existing,
WritePromote,
RangeReadImmed,
RangeWriteImmed,
RangeWritePromote,
}
impl LockUpgrade {
#[inline]
pub fn is_illegal(self) -> bool {
self == LockUpgrade::Illegal
}
pub fn get_upgrade_type(self) -> Option<LockType> {
match self {
LockUpgrade::Existing | LockUpgrade::Illegal => None,
LockUpgrade::WritePromote => Some(LockType::Write),
LockUpgrade::RangeReadImmed => Some(LockType::RangeRead),
LockUpgrade::RangeWriteImmed | LockUpgrade::RangeWritePromote => {
Some(LockType::RangeWrite)
}
}
}
#[inline]
pub fn is_promotion(self) -> bool {
matches!(
self,
LockUpgrade::WritePromote | LockUpgrade::RangeWritePromote
)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_illegal() {
assert!(LockUpgrade::Illegal.is_illegal());
assert!(!LockUpgrade::Existing.is_illegal());
assert!(LockUpgrade::Illegal.get_upgrade_type().is_none());
assert!(!LockUpgrade::Illegal.is_promotion());
}
#[test]
fn test_existing() {
assert!(!LockUpgrade::Existing.is_illegal());
assert!(LockUpgrade::Existing.get_upgrade_type().is_none());
assert!(!LockUpgrade::Existing.is_promotion());
}
#[test]
fn test_write_promote() {
let upgrade = LockUpgrade::WritePromote;
assert!(!upgrade.is_illegal());
assert_eq!(upgrade.get_upgrade_type(), Some(LockType::Write));
assert!(upgrade.is_promotion());
}
#[test]
fn test_range_read_immed() {
let upgrade = LockUpgrade::RangeReadImmed;
assert!(!upgrade.is_illegal());
assert_eq!(upgrade.get_upgrade_type(), Some(LockType::RangeRead));
assert!(!upgrade.is_promotion());
}
#[test]
fn test_range_write_immed() {
let upgrade = LockUpgrade::RangeWriteImmed;
assert!(!upgrade.is_illegal());
assert_eq!(upgrade.get_upgrade_type(), Some(LockType::RangeWrite));
assert!(!upgrade.is_promotion());
}
#[test]
fn test_range_write_promote() {
let upgrade = LockUpgrade::RangeWritePromote;
assert!(!upgrade.is_illegal());
assert_eq!(upgrade.get_upgrade_type(), Some(LockType::RangeWrite));
assert!(upgrade.is_promotion());
}
#[test]
fn test_all_promotions() {
assert!(LockUpgrade::WritePromote.is_promotion());
assert!(LockUpgrade::RangeWritePromote.is_promotion());
assert!(!LockUpgrade::Existing.is_promotion());
assert!(!LockUpgrade::RangeReadImmed.is_promotion());
assert!(!LockUpgrade::RangeWriteImmed.is_promotion());
assert!(!LockUpgrade::Illegal.is_promotion());
}
}