fn_traits/fns/
mem_take_fn.rs

1use crate::{Fn, FnMut, FnOnce};
2use core::marker::PhantomData;
3use core::mem;
4
5/// [`mem::take`] function.
6#[derive(Clone, Copy, Default)]
7pub struct MemTakeFn {
8    _phantom: PhantomData<()>,
9}
10
11impl<'a, T> FnOnce<(&'a mut T,)> for MemTakeFn
12where
13    T: Default,
14{
15    type Output = T;
16
17    fn call_once(self, args: (&'a mut T,)) -> Self::Output {
18        mem::take(args.0)
19    }
20}
21
22impl<'a, T> FnMut<(&'a mut T,)> for MemTakeFn
23where
24    T: Default,
25{
26    type Output = T;
27
28    fn call_mut(&mut self, args: (&'a mut T,)) -> Self::Output {
29        self.call_once(args)
30    }
31}
32
33impl<'a, T> Fn<(&'a mut T,)> for MemTakeFn
34where
35    T: Default,
36{
37    type Output = T;
38
39    fn call(&self, args: (&'a mut T,)) -> Self::Output {
40        self.call_once(args)
41    }
42}
43
44#[cfg(test)]
45mod tests {
46    use super::super::tests::{into_std_fn, into_std_fn_mut, into_std_fn_once};
47    use super::MemTakeFn;
48    use std::string::String;
49
50    #[test]
51    fn test_mem_take_fn() {
52        let f = MemTakeFn::default();
53
54        let mut s1 = String::from("foo");
55
56        assert_eq!(into_std_fn_once(Clone::clone(&f))(&mut s1), "foo");
57
58        assert!(s1.is_empty());
59
60        let mut s2 = String::from("bar");
61
62        assert_eq!(into_std_fn_mut(Clone::clone(&f))(&mut s2), "bar");
63
64        assert!(s2.is_empty());
65
66        let mut s3 = String::from("baz");
67
68        assert_eq!(into_std_fn(Clone::clone(&f))(&mut s3), "baz");
69
70        assert!(s3.is_empty());
71    }
72}