1 // Copyright 2012 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
12 #[derive(PartialEq, Debug)]
13 pub struct Partial
<T
> { x: T, y: T }
15 #[derive(PartialEq, Debug)]
16 struct S { val: isize }
17 impl S { fn new(v: isize) -> S { S { val: v }
} }
18 impl Drop
for S { fn drop(&mut self) { }
}
20 pub fn f
<T
, F
>((b1
, b2
): (T
, T
), mut f
: F
) -> Partial
<T
> where F
: FnMut(T
) -> T
{
21 let p
= Partial { x: b1, y: b2 }
;
23 // Move of `p` is legal even though we are also moving `p.y`; the
24 // `..p` moves all fields *except* `p.y` in this context.
25 Partial { y: f(p.y), ..p }
29 let p
= f((S
::new(3), S
::new(4)), |S { val: z }
| S
::new(z
+1));
30 assert_eq
!(p
, Partial { x: S::new(3), y: S::new(5) }
);