diff options
| author | Kevin Butler <haqkrs@gmail.com> | 2014-04-08 03:13:23 +0100 |
|---|---|---|
| committer | Kevin Butler <haqkrs@gmail.com> | 2014-04-11 20:31:46 +0100 |
| commit | 9b9ad9b741bcab9669b9a64dd8004382290dfa47 (patch) | |
| tree | 070e2af7cb4dc6d98499f826ff5330eede5ee318 /src/libstd/path | |
| parent | d1e20488a5d1258b1582caa2db77e5210b8bd28f (diff) | |
| download | rust-9b9ad9b741bcab9669b9a64dd8004382290dfa47.tar.gz rust-9b9ad9b741bcab9669b9a64dd8004382290dfa47.zip | |
Simplify GenericPath::set_extension.
Diffstat (limited to 'src/libstd/path')
| -rw-r--r-- | src/libstd/path/mod.rs | 55 |
1 files changed, 21 insertions, 34 deletions
diff --git a/src/libstd/path/mod.rs b/src/libstd/path/mod.rs index 54a8d813137..660f92d8f7b 100644 --- a/src/libstd/path/mod.rs +++ b/src/libstd/path/mod.rs @@ -287,42 +287,29 @@ pub trait GenericPath: Clone + GenericPathUnsafe { /// Fails the task if the extension contains a NUL. fn set_extension<T: BytesContainer>(&mut self, extension: T) { assert!(!contains_nul(&extension)); - // borrowck causes problems here too - let val = { - match self.filename() { - None => None, - Some(name) => { - let dot = '.' as u8; - match name.rposition_elem(&dot) { - None | Some(0) => { - if extension.container_as_bytes().is_empty() { - None - } else { - let mut v; - let extension = extension.container_as_bytes(); - v = slice::with_capacity(name.len() + extension.len() + 1); - v.push_all(name); - v.push(dot); - v.push_all(extension); - Some(v) - } - } - Some(idx) => { - if extension.container_as_bytes().is_empty() { - Some(name.slice_to(idx).to_owned()) - } else { - let mut v; - let extension = extension.container_as_bytes(); - v = slice::with_capacity(idx + extension.len() + 1); - v.push_all(name.slice_to(idx+1)); - v.push_all(extension); - Some(v) - } - } - } + + let val = self.filename().and_then(|name| { + let dot = '.' as u8; + let extlen = extension.container_as_bytes().len(); + match (name.rposition_elem(&dot), extlen) { + (None, 0) | (Some(0), 0) => None, + (Some(idx), 0) => Some(name.slice_to(idx).to_owned()), + (idx, extlen) => { + let idx = match idx { + None | Some(0) => name.len(), + Some(val) => val + }; + + let mut v; + v = slice::with_capacity(idx + extlen + 1); + v.push_all(name.slice_to(idx)); + v.push(dot); + v.push_all(extension.container_as_bytes()); + Some(v) } } - }; + }); + match val { None => (), Some(v) => unsafe { self.set_filename_unchecked(v) } |
