heh
Diffstat (limited to 'src/util.rs')
-rw-r--r--src/util.rs27
1 files changed, 25 insertions, 2 deletions
diff --git a/src/util.rs b/src/util.rs
index 30362ff..c5b6c9b 100644
--- a/src/util.rs
+++ b/src/util.rs
@@ -15,7 +15,7 @@ pub mod prelude {
pub use super::{
even, gcd, lcm, pa, Dir, GreekTools, IntoCombinations, IntoLines, IterͶ, NumTupleIterTools,
ParseIter, Printable, Skip, TakeLine, TupleIterTools2, TupleIterTools3, TupleUtils,
- UnifiedTupleUtils, Widen, 読む, 読む::Ext, Ͷ, Α, Κ, Λ, Μ,
+ UnifiedTupleUtils, UnsoundUtilities, Widen, 読む, 読む::Ext, Ͷ, Α, Κ, Λ, Μ,
};
pub use itertools::izip;
pub use itertools::Itertools;
@@ -45,7 +45,7 @@ macro_rules! C {
}};
($buf:ident[$n:expr]) => {{
#[allow(unused_unsafe)]
- unsafe {
+ *unsafe {
$buf.get_unchecked($n)
}
}};
@@ -193,6 +193,29 @@ pub enum Dir {
W = b'L',
}
+pub trait UnsoundUtilities<T> {
+ fn ψ(self) -> T;
+}
+
+impl<T> UnsoundUtilities<T> for Option<T> {
+ fn ψ(self) -> T {
+ if cfg!(debug_assertions) && self.is_none() {
+ panic!();
+ }
+ unsafe { self.unwrap_unchecked() }
+ }
+}
+
+impl<T, E> UnsoundUtilities<T> for Result<T, E> {
+ #[track_caller]
+ fn ψ(self) -> T {
+ if cfg!(debug_assertions) && self.is_err() {
+ panic!();
+ }
+ unsafe { self.unwrap_unchecked() }
+ }
+}
+
pub struct LMap<K, V, F>(HashMap<K, V>, F)
where
F: Fn(K) -> Option<V>,