Skip to main content

apple_quant_core/
unwrap_fast.rs

1use std::fmt::Debug;
2
3use crate::log::AnyhowErrorExt;
4
5pub trait UnwrapOptionExt<T> {
6	unsafe fn unwrap_unchecked_release(
7		self,
8	) -> T;
9
10	unsafe fn expect_unchecked_release(
11		self,
12		msg: &str,
13	) -> T;
14}
15
16impl<T> UnwrapOptionExt<T> for Option<T> {
17	#[inline(always)]
18	unsafe fn unwrap_unchecked_release(
19		self,
20	) -> T {
21		if cfg!(debug_assertions) {
22			self.unwrap()
23		} else {
24			unsafe {
25				self.unwrap_unchecked()
26			}
27		}
28	}
29
30	#[inline(always)]
31	unsafe fn expect_unchecked_release(
32		self,
33		msg: &str,
34	) -> T {
35		if cfg!(debug_assertions) {
36			self.expect(msg)
37		} else {
38			unsafe {
39				self.unwrap_unchecked()
40			}
41		}
42	}
43}
44
45pub trait UnwrapResultExt<T, E> {
46	unsafe fn unwrap_unchecked_release(
47		self,
48	) -> T;
49
50	unsafe fn expect_unchecked_release(
51		self,
52		msg: &str,
53	) -> T;
54
55	unsafe fn unwrap_err_unchecked_release(
56		self,
57	) -> E;
58
59	unsafe fn expect_err_unchecked_release(
60		self,
61		msg: &str,
62	) -> E;
63}
64
65pub trait AnyhowResultExt<T> {
66	unsafe fn now_unchecked_release(
67		self,
68	) -> T;
69
70	fn now_checked(
71		self,
72	) -> Option<T>;
73}
74
75impl<T: Debug> AnyhowResultExt<T> for anyhow::Result<T> {
76	#[inline(always)]
77	unsafe fn now_unchecked_release(
78		self,
79	) -> T {
80		#[cfg(debug_assertions)]
81		match self {
82			Ok(t) => t,
83			Err(e) => {
84				e.now();
85				panic!();
86			},
87		}
88
89		#[cfg(not(debug_assertions))]
90		unsafe {
91			self.unwrap_unchecked()
92		}
93	}
94
95	#[inline(always)]
96	fn now_checked(
97		self,
98	) -> Option<T> {
99		match self {
100			Ok(t) => Some(t),
101			Err(e) => {
102				e.now();
103				None
104			},
105		}
106	}
107}
108
109impl<
110	T: Debug,
111	E: Debug,
112> UnwrapResultExt<T, E> for Result<T, E> {
113	#[inline(always)]
114	unsafe fn unwrap_unchecked_release(
115		self,
116	) -> T {
117		if cfg!(debug_assertions) {
118			self.unwrap()
119		} else {
120			unsafe {
121				self.unwrap_unchecked()
122			}
123		}
124	}
125
126	#[inline(always)]
127	unsafe fn expect_unchecked_release(
128		self,
129		msg: &str,
130	) -> T {
131		if cfg!(debug_assertions) {
132			self.expect(msg)
133		} else {
134			unsafe {
135				self.unwrap_unchecked()
136			}
137		}
138	}
139
140	#[inline(always)]
141	unsafe fn unwrap_err_unchecked_release(
142		self,
143	) -> E {
144		if cfg!(debug_assertions) {
145			self.unwrap_err()
146		} else {
147			unsafe {
148				self.unwrap_err_unchecked()
149			}
150		}
151	}
152
153	#[inline(always)]
154	unsafe fn expect_err_unchecked_release(
155		self,
156		msg: &str,
157	) -> E {
158		if cfg!(debug_assertions) {
159			self.expect_err(msg)
160		} else {
161			unsafe {
162				self.unwrap_err_unchecked()
163			}
164		}
165	}
166}