Lines Matching full:src

60     pub unsafe trait Project<Src: ?Sized, Dst: ?Sized> {
61 /// Projects a pointer from `Src` to `Dst`.
72 /// `src`'s referent, and has the same provenance as `src`.
73 fn project(src: PtrInner<'_, Src>) -> *mut Dst; in project()
83 pub unsafe trait Cast<Src: ?Sized, Dst: ?Sized>: Project<Src, Dst> {}
90 pub unsafe trait CastExact<Src: ?Sized, Dst: ?Sized>: Cast<Src, Dst> {}
102 fn project(src: PtrInner<'_, T>) -> *mut T { in project()
103 src.as_ptr() in project()
119 /// guarantee that `Dst` is no larger than `Src`. Thus, `CastSized` has a
120 /// sound implementation of [`Project`] for all `Src` and `Dst` – the caller
121 /// may pass any `Src` and `Dst` without being responsible for soundness.
125 // SAFETY: By the `static_assert!`, `Dst` is no larger than `Src`,
128 unsafe impl<Src, Dst> Project<Src, Dst> for CastSized {
130 fn project(src: PtrInner<'_, Src>) -> *mut Dst { in project()
131 static_assert!(Src, Dst => mem::size_of::<Src>() >= mem::size_of::<Dst>()); in project()
132 src.as_ptr().cast::<Dst>() in project()
137 unsafe impl<Src, Dst> Cast<Src, Dst> for CastSized {}
145 /// guarantee that `Dst` has the same size as `Src`. Thus, `CastSizedExact`
146 /// has a sound implementation of [`Project`] for all `Src` and `Dst` – the
147 /// caller may pass any `Src` and `Dst` without being responsible for
152 // SAFETY: By the `static_assert!`, `Dst` has the same size as `Src`,
155 unsafe impl<Src, Dst> Project<Src, Dst> for CastSizedExact {
157 fn project(src: PtrInner<'_, Src>) -> *mut Dst { in project()
158 static_assert!(Src, Dst => mem::size_of::<Src>() == mem::size_of::<Dst>()); in project()
159 src.as_ptr().cast::<Dst>() in project()
164 unsafe impl<Src, Dst> Cast<Src, Dst> for CastSizedExact {}
168 unsafe impl<Src, Dst> CastExact<Src, Dst> for CastSizedExact {}
177 /// `CastUnsized` has a sound implementation of [`Project`] for all `Src`
178 /// and `Dst` – the caller may pass any `Src` and `Dst` without being
183 // SAFETY: By the `static_assert!`, `Src` and `Dst` are either:
186 // and with align_of::<Src>() == align_of::<Dst>(). These ensure that any
187 // given pointer metadata encodes the same size for both `Src` and `Dst`
190 unsafe impl<Src, Dst> Project<Src, Dst> for CastUnsized
192 Src: ?Sized + KnownLayout,
193 Dst: ?Sized + KnownLayout<PointerMetadata = Src::PointerMetadata>,
196 fn project(src: PtrInner<'_, Src>) -> *mut Dst { in project()
199 static_assert!(Src: ?Sized + KnownLayout, Dst: ?Sized + KnownLayout => { in project()
200 let src = <Src as KnownLayout>::LAYOUT; in project() localVariable
202 match (src.size_info, dst.size_info) { in project()
207 …) => src.align.get() == dst.align.get() && src_offset == dst_offset && src_elem_size == dst_elem_s… in project()
212 let metadata = Src::pointer_to_metadata(src.as_ptr()); in project()
213 Dst::raw_from_ptr_len(src.as_non_null().cast::<u8>(), metadata).as_ptr() in project()
218 unsafe impl<Src, Dst> Cast<Src, Dst> for CastUnsized
220 Src: ?Sized + KnownLayout,
221 Dst: ?Sized + KnownLayout<PointerMetadata = Src::PointerMetadata>,
225 // SAFETY: By the `static_assert!` in `Project::project`, `Src` and `Dst`
230 // same size for both `Src` and `Dst` (note that the alignment is required
232 unsafe impl<Src, Dst> CastExact<Src, Dst> for CastUnsized
234 Src: ?Sized + KnownLayout,
235 Dst: ?Sized + KnownLayout<PointerMetadata = Src::PointerMetadata>,
257 fn project(src: PtrInner<'_, T>) -> *mut T::Type { in project()
258 T::project(src) in project()
365 // SAFETY: `project` constructs a pointer with the same address as `src`
366 // and with a referent of the same size as `*src`. It does this using
370 // Technically, this proof assumes that `*src` is contiguous (the same is
374 fn project(src: PtrInner<'_, T>) -> *mut [u8] { in project()
375 let bytes = match T::size_of_val_raw(src.as_non_null()) { in project()
379 // `usize`. By invariant on `PtrInner`, `src` refers to a range in project()
385 core::ptr::slice_from_raw_parts_mut(src.as_ptr().cast::<u8>(), bytes) in project()
403 fn project(src: PtrInner<'_, T>) -> *mut () { in project()
404 src.as_ptr().cast::<()>() in project()