libtw2_common/
takeable.rs1use std::ops;
2
3pub struct Takeable<T> {
4 inner: Option<T>,
5}
6
7impl<T: Default> Default for Takeable<T> {
8 fn default() -> Takeable<T> {
9 Takeable::new(Default::default())
10 }
11}
12
13impl<T> Takeable<T> {
14 pub fn new(value: T) -> Takeable<T> {
15 Takeable { inner: Some(value) }
16 }
17 pub fn empty() -> Takeable<T> {
18 Takeable { inner: None }
19 }
20 pub fn take(&mut self) -> T {
21 self.inner
22 .take()
23 .unwrap_or_else(|| panic!("value taken when absent"))
24 }
25 pub fn restore(&mut self, value: T) {
26 assert!(self.inner.is_none(), "value restored when already present");
27 self.inner = Some(value);
28 }
29}
30
31impl<T> ops::Deref for Takeable<T> {
32 type Target = T;
33 fn deref(&self) -> &T {
34 self.inner
35 .as_ref()
36 .unwrap_or_else(|| panic!("value borrowed when absent"))
37 }
38}
39
40impl<T> ops::DerefMut for Takeable<T> {
41 fn deref_mut(&mut self) -> &mut T {
42 self.inner
43 .as_mut()
44 .unwrap_or_else(|| panic!("value mutably borrowed when absent"))
45 }
46}