pub(crate) fn entries_as_slice<T>(entries: &[(T, ())]) -> &[T] {
const {
assert!(size_of::<(T, ())>() == size_of::<T>());
assert!(align_of::<(T, ())>() == align_of::<T>());
}
unsafe { std::mem::transmute::<&[(T, ())], &[T]>(entries) }
}
#[cfg(test)]
mod tests {
use super::entries_as_slice;
#[test]
fn entries_as_slice_empty() {
let entries: [(i32, ()); 0] = [];
assert_eq!(entries_as_slice(&entries), &[] as &[i32]);
}
#[test]
fn entries_as_slice_primitive() {
let entries = [(1i32, ()), (2i32, ()), (3i32, ())];
assert_eq!(entries_as_slice(&entries), [1, 2, 3]);
}
#[test]
fn entries_as_slice_str_ref() {
let entries = [("a", ()), ("b", ())];
assert_eq!(entries_as_slice(&entries), ["a", "b"]);
}
#[test]
fn entries_as_slice_zero_sized_t() {
let entries = [((), ()), ((), ())];
assert_eq!(entries_as_slice(&entries), [(), ()]);
}
#[test]
fn entries_as_slice_over_aligned_t() {
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
#[repr(align(16))]
struct OverAligned(u8);
let entries = [(OverAligned(1), ()), (OverAligned(2), ())];
assert_eq!(entries_as_slice(&entries), [OverAligned(1), OverAligned(2)]);
}
}