| // Part of the Crubit project, under the Apache License v2.0 with LLVM |
| // Exceptions. See /LICENSE for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| |
| /// Emulate the (unstable) `to_raw_parts` on slices, to get the pointer and |
| /// length of the slice, without requiring turning on the unstable feature flag. |
| // TODO: b/324045078 - Move slice_ptr into its own crate once `cc_std` can |
| // depend on a Rust crate. |
| pub mod slice_ptr { |
| pub fn get_raw_parts<T>(slice: *const [T]) -> (*const T, usize) { |
| #[allow(dead_code)] |
| #[repr(C)] |
| struct RawSlice<T>(*const T, usize); |
| // # Safety: |
| // No stable way to do this per se, but the UCG documents this transmute is OK. |
| // An RFC is in the works to officially stabilize this. It is expected |
| // to be noncontroversial. |
| // |
| // See: |
| // |
| // * UCG: https://rust-lang.github.io/unsafe-code-guidelines/layout/pointers.html |
| // * Zulip: https://rust-lang.zulipchat.com/#narrow/stream/213817-t-lang/topic/Can.20we.20stabilize.20the.20layout.20of.20.26.5BT.5D.20and.20.26str.3F/near/394683395 |
| let RawSlice::<T>(ptr, size) = unsafe { core::mem::transmute(slice) }; |
| (ptr, size) |
| } |
| |
| pub fn get_raw_parts_mut<T>(slice: *mut [T]) -> (*mut T, usize) { |
| // Assumption: The layout isn't affected by whether a pointer is mut or const. |
| let (ptr, size) = get_raw_parts::<T>(slice); |
| (ptr as *mut _, size) |
| } |
| } |