Skip to content

Commit ab2347f

Browse files
bors[bot]Ralith
andauthored
Merge #62
62: Introduce SliceWithHeader::from_slice r=CAD97 a=Ralith Provides a simpler, possibly faster constructor for a common case. Co-authored-by: Benjamin Saunders <ben.e.saunders@gmail.com>
2 parents 0c47294 + 3ee0af3 commit ab2347f

File tree

1 file changed

+20
-0
lines changed

1 file changed

+20
-0
lines changed

crates/slice-dst/src/provided_types.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,26 @@ impl<Header, Item> SliceWithHeader<Header, Item> {
131131

132132
unsafe { A::new_slice_dst(len, InProgress::init(len, header, items)) }
133133
}
134+
135+
#[allow(clippy::new_ret_no_self)]
136+
/// Create a new slice/header DST from a slice, in a [`AllocSliceDst`] container.
137+
pub fn from_slice<A>(header: Header, s: &[Item]) -> A
138+
where
139+
A: AllocSliceDst<Self>,
140+
Item: Copy,
141+
{
142+
let len = s.len();
143+
let (layout, [length_offset, header_offset, slice_offset]) = Self::layout(len);
144+
unsafe {
145+
A::new_slice_dst(len, |ptr| {
146+
let raw = ptr.as_ptr().cast::<u8>();
147+
ptr::write(raw.add(length_offset).cast(), len);
148+
ptr::write(raw.add(header_offset).cast(), header);
149+
ptr::copy_nonoverlapping(s.as_ptr(), raw.add(slice_offset).cast(), len);
150+
debug_assert_eq!(Layout::for_value(ptr.as_ref()), layout);
151+
})
152+
}
153+
}
134154
}
135155

136156
impl<Header, Item> Clone for Box<SliceWithHeader<Header, Item>>

0 commit comments

Comments
 (0)