diff options
| author | bors <bors@rust-lang.org> | 2015-03-14 08:55:31 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2015-03-14 08:55:31 +0000 |
| commit | 766a4e1acc06061a30cf456840a9915526fb681e (patch) | |
| tree | 16d2c602028d25d21f28b2d28b69a334e7c849d3 /src/libcore | |
| parent | f7453f940b6cbc2b07a2c0d7612a11fa435aad95 (diff) | |
| parent | 85080fa81d3ae6770eb228a982670746e55bf4d9 (diff) | |
Auto merge of #23333 - oli-obk:slice_from_raw_parts, r=alexcrichton
at least that's what the docs say: http://doc.rust-lang.org/std/slice/fn.from_raw_parts.html A few situations got prettier. In some situations the mutability of the resulting and source pointers differed (and was cast away by transmute), the mutability matches now.
Diffstat (limited to 'src/libcore')
| -rw-r--r-- | src/libcore/slice.rs | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/src/libcore/slice.rs b/src/libcore/slice.rs index 07c14d08c07..62cffa9b86e 100644 --- a/src/libcore/slice.rs +++ b/src/libcore/slice.rs @@ -520,10 +520,10 @@ impl<T> ops::Index<ops::Range<usize>> for [T] { assert!(index.start <= index.end); assert!(index.end <= self.len()); unsafe { - transmute(RawSlice { - data: self.as_ptr().offset(index.start as isize), - len: index.end - index.start - }) + from_raw_parts ( + self.as_ptr().offset(index.start as isize), + index.end - index.start + ) } } } @@ -559,10 +559,10 @@ impl<T> ops::IndexMut<ops::Range<usize>> for [T] { assert!(index.start <= index.end); assert!(index.end <= self.len()); unsafe { - transmute(RawSlice { - data: self.as_ptr().offset(index.start as isize), - len: index.end - index.start - }) + from_raw_parts_mut( + self.as_mut_ptr().offset(index.start as isize), + index.end - index.start + ) } } } @@ -731,7 +731,21 @@ macro_rules! make_slice { diff / mem::size_of::<$t>() }; unsafe { - transmute::<_, $result>(RawSlice { data: $start, len: len }) + from_raw_parts($start, len) + } + }} +} + +macro_rules! make_mut_slice { + ($t: ty => $result: ty: $start: expr, $end: expr) => {{ + let diff = $end as usize - $start as usize; + let len = if mem::size_of::<T>() == 0 { + diff + } else { + diff / mem::size_of::<$t>() + }; + unsafe { + from_raw_parts_mut($start, len) } }} } @@ -898,7 +912,7 @@ impl<'a, T> ops::IndexMut<ops::RangeFrom<usize>> for IterMut<'a, T> { impl<'a, T> ops::IndexMut<RangeFull> for IterMut<'a, T> { #[inline] fn index_mut(&mut self, _index: &RangeFull) -> &mut [T] { - make_slice!(T => &mut [T]: self.ptr, self.end) + make_mut_slice!(T => &mut [T]: self.ptr, self.end) } } @@ -912,7 +926,7 @@ impl<'a, T> IterMut<'a, T> { /// restricted lifetimes that do not consume the iterator. #[unstable(feature = "core")] pub fn into_slice(self) -> &'a mut [T] { - make_slice!(T => &'a mut [T]: self.ptr, self.end) + make_mut_slice!(T => &'a mut [T]: self.ptr, self.end) } } @@ -1404,7 +1418,7 @@ impl<'a, T> ExactSizeIterator for ChunksMut<'a, T> {} #[unstable(feature = "core")] pub fn ref_slice<'a, A>(s: &'a A) -> &'a [A] { unsafe { - transmute(RawSlice { data: s, len: 1 }) + from_raw_parts(s, 1) } } @@ -1412,8 +1426,7 @@ pub fn ref_slice<'a, A>(s: &'a A) -> &'a [A] { #[unstable(feature = "core")] pub fn mut_ref_slice<'a, A>(s: &'a mut A) -> &'a mut [A] { unsafe { - let ptr: *const A = transmute(s); - transmute(RawSlice { data: ptr, len: 1 }) + from_raw_parts_mut(s, 1) } } |
