|
30 | 30 |
|
31 | 31 | #![experimental]
|
32 | 32 |
|
33 |
| -use ops::Drop; |
| 33 | +use ops::{Drop, FnMut, FnOnce}; |
34 | 34 |
|
35 | 35 | /// A trait for executing a destructor unconditionally after a block of code,
|
36 | 36 | /// regardless of whether the blocked fails.
|
37 | 37 | pub trait Finally<T> {
|
38 | 38 | /// Executes this object, unconditionally running `dtor` after this block of
|
39 | 39 | /// code has run.
|
40 |
| - fn finally(&mut self, dtor: ||) -> T; |
| 40 | + fn finally<F>(&mut self, dtor: F) -> T where F: FnMut(); |
41 | 41 | }
|
42 | 42 |
|
43 |
| -impl<'a,T> Finally<T> for ||: 'a -> T { |
44 |
| - fn finally(&mut self, dtor: ||) -> T { |
45 |
| - try_finally(&mut (), self, |
46 |
| - |_, f| (*f)(), |
47 |
| - |_| dtor()) |
48 |
| - } |
49 |
| -} |
50 |
| - |
51 |
| -impl<T> Finally<T> for fn() -> T { |
52 |
| - fn finally(&mut self, dtor: ||) -> T { |
53 |
| - try_finally(&mut (), (), |
54 |
| - |_, _| (*self)(), |
55 |
| - |_| dtor()) |
| 43 | +impl<T, F> Finally<T> for F where F: FnMut() -> T { |
| 44 | + fn finally<G>(&mut self, mut dtor: G) -> T where G: FnMut() { |
| 45 | + try_finally(&mut (), self, |_, f| (*f)(), |_| dtor()) |
56 | 46 | }
|
57 | 47 | }
|
58 | 48 |
|
@@ -86,25 +76,24 @@ impl<T> Finally<T> for fn() -> T {
|
86 | 76 | /// // use state.buffer, state.len to cleanup
|
87 | 77 | /// })
|
88 | 78 | /// ```
|
89 |
| -pub fn try_finally<T,U,R>(mutate: &mut T, |
90 |
| - drop: U, |
91 |
| - try_fn: |&mut T, U| -> R, |
92 |
| - finally_fn: |&mut T|) |
93 |
| - -> R { |
| 79 | +pub fn try_finally<T, U, R, F, G>(mutate: &mut T, drop: U, try_fn: F, finally_fn: G) -> R where |
| 80 | + F: FnOnce(&mut T, U) -> R, |
| 81 | + G: FnMut(&mut T), |
| 82 | +{ |
94 | 83 | let f = Finallyalizer {
|
95 | 84 | mutate: mutate,
|
96 | 85 | dtor: finally_fn,
|
97 | 86 | };
|
98 | 87 | try_fn(&mut *f.mutate, drop)
|
99 | 88 | }
|
100 | 89 |
|
101 |
| -struct Finallyalizer<'a,A:'a> { |
| 90 | +struct Finallyalizer<'a, A:'a, F> where F: FnMut(&mut A) { |
102 | 91 | mutate: &'a mut A,
|
103 |
| - dtor: |&mut A|: 'a |
| 92 | + dtor: F, |
104 | 93 | }
|
105 | 94 |
|
106 | 95 | #[unsafe_destructor]
|
107 |
| -impl<'a,A> Drop for Finallyalizer<'a,A> { |
| 96 | +impl<'a, A, F> Drop for Finallyalizer<'a, A, F> where F: FnMut(&mut A) { |
108 | 97 | #[inline]
|
109 | 98 | fn drop(&mut self) {
|
110 | 99 | (self.dtor)(self.mutate);
|
|
0 commit comments