From 90ce3d94e45233f8aa49e40b1e8a2efc7a0f35ef Mon Sep 17 00:00:00 2001 From: Ben Blum Date: Wed, 1 Aug 2012 19:04:43 -0400 Subject: [PATCH] Add core::util, with swap, replace, and noncopyable --- src/libcore/core.rc | 4 ++++ src/libcore/util.rs | 46 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 src/libcore/util.rs diff --git a/src/libcore/core.rc b/src/libcore/core.rc index 3dff701e875..ed9f642cc96 100644 --- a/src/libcore/core.rc +++ b/src/libcore/core.rc @@ -179,6 +179,10 @@ mod option_iter { mod result; mod to_str; mod to_bytes; +mod util; + +// Data structure modules + mod dvec; #[path="iter-trait"] mod dvec_iter { diff --git a/src/libcore/util.rs b/src/libcore/util.rs new file mode 100644 index 00000000000..0c7a54053b2 --- /dev/null +++ b/src/libcore/util.rs @@ -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(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(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(); + } +}