Add core::util, with swap, replace, and noncopyable
This commit is contained in:
parent
6fdd1ef9b1
commit
90ce3d94e4
2 changed files with 50 additions and 0 deletions
|
@ -179,6 +179,10 @@ mod option_iter {
|
||||||
mod result;
|
mod result;
|
||||||
mod to_str;
|
mod to_str;
|
||||||
mod to_bytes;
|
mod to_bytes;
|
||||||
|
mod util;
|
||||||
|
|
||||||
|
// Data structure modules
|
||||||
|
|
||||||
mod dvec;
|
mod dvec;
|
||||||
#[path="iter-trait"]
|
#[path="iter-trait"]
|
||||||
mod dvec_iter {
|
mod dvec_iter {
|
||||||
|
|
46
src/libcore/util.rs
Normal file
46
src/libcore/util.rs
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
/**
|
||||||
|
* Miscellaneous helpers for common patterns.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Swap the values at two mutable locations of the same type, without
|
||||||
|
* deinitialising or copying either one.
|
||||||
|
*/
|
||||||
|
fn swap<T>(x: &mut T, y: &mut T) {
|
||||||
|
*x <-> *y;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replace the value at a mutable location with a new one, returning the old
|
||||||
|
* value, without deinitialising or copying either one.
|
||||||
|
*/
|
||||||
|
fn replace<T>(dest: &mut T, +src: T) -> T {
|
||||||
|
let mut tmp = src;
|
||||||
|
swap(dest, &mut tmp);
|
||||||
|
tmp
|
||||||
|
}
|
||||||
|
|
||||||
|
/// A non-copyable dummy type.
|
||||||
|
class noncopyable {
|
||||||
|
i: ();
|
||||||
|
new() { self.i = (); }
|
||||||
|
drop { }
|
||||||
|
}
|
||||||
|
|
||||||
|
mod tests {
|
||||||
|
#[test]
|
||||||
|
fn test_swap() {
|
||||||
|
let mut x = 31337;
|
||||||
|
let mut y = 42;
|
||||||
|
swap(&mut x, &mut y);
|
||||||
|
assert x == 42;
|
||||||
|
assert y == 31337;
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
fn test_replace() {
|
||||||
|
let mut x = some(noncopyable());
|
||||||
|
let y = replace(&mut x, none);
|
||||||
|
assert x.is_none();
|
||||||
|
assert y.is_some();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue