Skip to main content

libtw2_common/
takeable.rs

1use 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}