#![allow(dead_code)]
#[derive(Debug, PartialEq, Eq, Clone)]
pub enum KeyErr {
ZeroLen,
Unknown,
}
pub type InsRes<'a, T> = (&'a mut T, Option<T>);
pub trait InsResAide<T> {
fn previous(&self) -> bool;
fn uproot_previous(&mut self) -> T;
unsafe fn uproot_previous_unchecked(&mut self) -> T;
}
impl<'a, T> InsResAide<T> for InsRes<'a, T> {
fn previous(&self) -> bool {
self.1.is_some()
}
fn uproot_previous(&mut self) -> T {
if let Some(p) = self.1.take() {
return p;
} else {
panic!("InsRes previous entry was `None`");
}
}
unsafe fn uproot_previous_unchecked(&mut self) -> T {
self.1.take().unwrap_unchecked()
}
}
impl<'a, T> InsResAide<T> for Result<InsRes<'a, T>, KeyErr> {
fn previous(&self) -> bool {
return if let Ok(r) = self.as_ref() {
r.previous()
} else {
panic!("`Err` variant was supplied.");
};
}
fn uproot_previous(&mut self) -> T {
return if let Ok(r) = self.as_mut() {
r.uproot_previous()
} else {
panic!("`Err` variant was supplied.");
};
}
unsafe fn uproot_previous_unchecked(&mut self) -> T {
return if let Ok(r) = self.as_mut() {
r.uproot_previous_unchecked()
} else {
panic!("`Err` variant was supplied.");
};
}
}
#[cfg(test)]
mod tests_of_units {
mod ins_res {
use super::super::{InsRes, InsResAide};
#[test]
fn previous() {
let mut ins_res: InsRes<'_, usize> = (&mut 3, None);
assert_eq!(false, ins_res.previous());
ins_res.1 = Some(4);
assert_eq!(true, ins_res.previous());
}
#[test]
fn uproot_previous_ok() {
let mut ins_res: InsRes<'_, usize> = (&mut 3, Some(4));
assert_eq!(4, ins_res.uproot_previous());
}
#[test]
#[should_panic(expected = "InsRes previous entry was `None`")]
fn uproot_previous_nok() {
let mut ins_res: InsRes<'_, usize> = (&mut 3, None);
_ = ins_res.uproot_previous();
}
#[test]
fn uproot_previous_unchecked_ok() {
let mut ins_res: InsRes<'_, usize> = (&mut 3, Some(4));
assert_eq!(4, unsafe { ins_res.uproot_previous_unchecked() });
}
}
mod result_ins_res_key_err {
use super::super::{InsRes, InsResAide, KeyErr};
#[test]
fn previous_ok() {
let ins_res = (&mut 3, Some(4));
let res = Ok(ins_res);
assert_eq!(true, res.previous());
}
#[test]
#[should_panic(expected = "`Err` variant was supplied.")]
fn previous_err() {
let res: Result<InsRes<usize>, KeyErr> = Err(KeyErr::ZeroLen);
_ = res.previous();
}
#[test]
fn uproot_previous_ok() {
let ins_res = (&mut 3, Some(4));
let mut res = Ok(ins_res);
assert_eq!(4, res.uproot_previous());
}
#[test]
#[should_panic(expected = "`Err` variant was supplied.")]
fn uproot_previous_err() {
let mut res: Result<InsRes<usize>, KeyErr> = Err(KeyErr::ZeroLen);
_ = res.uproot_previous();
}
#[test]
fn uproot_previous_unchecked_ok() {
let ins_res = (&mut 3, Some(4));
let mut res = Ok(ins_res);
assert_eq!(4, unsafe { res.uproot_previous_unchecked() });
}
#[test]
#[should_panic(expected = "`Err` variant was supplied.")]
fn uproot_previous_unchecked_err() {
let mut res: Result<InsRes<usize>, KeyErr> = Err(KeyErr::ZeroLen);
_ = unsafe { res.uproot_previous_unchecked() };
}
}
}