#[cfg(feature = "extra_traits")]
use core::hash::Hash;
use core::mem::MaybeUninit;
use crate::prelude::*;
#[allow(dead_code)]
#[repr(transparent)]
#[derive(Clone, Copy)]
pub(crate) struct Padding<T: Copy>(MaybeUninit<T>);
impl<T: Copy> Default for Padding<T> {
fn default() -> Self {
Self(MaybeUninit::zeroed())
}
}
impl<T: Copy> Padding<T> {
#[allow(dead_code)]
pub(crate) const fn new(val: T) -> Self {
Self(MaybeUninit::new(val))
}
}
impl<T: Copy> fmt::Debug for Padding<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let full_name = core::any::type_name::<Self>();
let prefix_len = full_name.find("Padding").unwrap();
f.pad(&full_name[prefix_len..])
}
}
#[cfg(feature = "extra_traits")]
impl<T: Copy> Hash for Padding<T> {
fn hash<H: hash::Hasher>(&self, _state: &mut H) {}
}
#[cfg(feature = "extra_traits")]
impl<T: Copy> PartialEq for Padding<T> {
fn eq(&self, _other: &Self) -> bool {
true
}
}
#[cfg(feature = "extra_traits")]
impl<T: Copy> Eq for Padding<T> {}
#[cfg(target_env = "msvc")]
#[allow(unused)]
pub(crate) type CEnumRepr = c_int;
#[cfg(not(target_env = "msvc"))]
#[allow(unused)]
pub(crate) type CEnumRepr = c_uint;
#[allow(unused)]
pub(crate) const fn u16_cast_short(x: u16) -> c_short {
assert!(size_of::<u16>() <= size_of::<c_short>()); x as i16
}
#[allow(unused)]
pub(crate) const fn u32_cast_int(x: u32) -> c_int {
assert!(size_of::<u32>() <= size_of::<c_int>());
x as i32
}
#[allow(unused)]
pub(crate) const fn u32_cast_long(x: u32) -> c_long {
assert!(size_of::<u32>() <= size_of::<c_long>()); x as c_long
}
#[allow(unused)]
pub(crate) const fn ulong_cast_int(x: c_ulong) -> c_int {
assert!(x <= (c_int::MAX as c_ulong));
x as c_int
}
#[allow(unused)]
pub(crate) const fn ulong_cast_uint(x: c_ulong) -> c_uint {
assert!(x <= (c_uint::MAX as c_ulong));
x as c_uint
}
#[allow(unused)]
#[cfg(any(target_os = "linux", target_os = "android", target_os = "l4re"))]
pub(crate) const fn u32_cast_ioctl(x: u32) -> crate::Ioctl {
assert!(size_of::<u32>() <= size_of::<crate::Ioctl>()); x as crate::Ioctl
}
#[allow(unused)]
pub(crate) const fn u8_slice_cast_char_slice(x: &[u8]) -> &[c_char] {
assert!(size_of::<u8>() == size_of::<c_char>());
unsafe { mem::transmute::<&[u8], &[c_char]>(x) }
}
#[must_use]
#[allow(dead_code)]
pub const fn replace_array_items<T: Copy, const N: usize>(
mut dst: [T; N],
src: &[T],
start: usize,
) -> [T; N] {
let mut i = 0;
while i < src.len() {
dst[i + start] = src[i];
i += 1;
}
dst
}