#[doc(hidden)] pub
mod __ {
#![allow(nonstandard_style)]
pub use ::core;
pub
struct const_<T> (
pub T,
);
impl<'lt> const_<&'lt str> {
pub
const
fn as_bytes (self)
-> &'lt [u8]
{
self.0.as_bytes()
}
}
impl<'lt> const_<&'lt [u8]> {
pub
const
fn as_bytes (self)
-> &'lt [u8]
{
self.0
}
}
impl<'lt, const N: usize> const_<&'lt [u8; N]> {
pub
const
fn as_bytes (self)
-> &'lt [u8]
{
self.0
}
}
#[repr(C)]
pub
struct Contiguous<_0, _1> (
pub _0,
pub _1,
);
pub
const
fn c_strlen (bytes: &[u8])
-> usize
{
let mut i = 0;
while i < bytes.len() {
if bytes[i] == b'\0' {
break;
}
i += 1;
}
i
}
pub
struct c_strlen<const N: usize> {}
}
#[macro_export]
macro_rules! const_as_bytes {( $s:expr $(,)? ) => ({
const __BYTES: &'static [u8] = $crate::const_::__::const_($s).as_bytes();
unsafe {
$crate::__::core::mem::transmute::<
*const u8,
&'static [u8; __BYTES.len()],
>(
__BYTES.as_ptr()
)
}
})}
#[doc(inline)] pub use const_as_bytes as as_bytes;
#[macro_export]
macro_rules! const_concat {(
$($s:expr),* $(,)?
) => (
unsafe {
$crate::__::core::str::from_utf8_unchecked(
$crate::const_concat_bytes!(
$(
<$crate::__::core::primitive::str>::as_bytes($s)
),*
)
)
}
)}
#[doc(inline)] pub use const_concat as concat;
#[macro_export]
macro_rules! const_cstr {() => ( $crate::cstr!() ); (
$($s:expr),* $(,)?
) => ({
const BYTES: &[$crate::__::core::primitive::u8] = {
$crate::const_concat_bytes!($($s ,)*)
};
const _: $crate::const_::__::c_strlen::<{
BYTES.len() - if BYTES[BYTES.len() - 1] == b'\0' { 1 } else { 0 }
}> = $crate::const_::__::c_strlen::<{
$crate::const_::__::c_strlen(BYTES)
}> {};
unsafe {
$crate::__::core::ffi::CStr::from_bytes_with_nul_unchecked(
if BYTES[BYTES.len() - 1] == b'\0' {
BYTES
} else {
$crate::const_concat_bytes!(BYTES, b"\0")
}
)
}
})}
#[doc(inline)] pub use const_cstr as c_str;
#[macro_export]
macro_rules! const_concat_bytes {
() => (b"");
(
$single:expr $(,)?
) => (
$crate::const_as_bytes!($single)
);
(
$first:expr $(,
$rest:expr)+ $(,)?
) => (
$crate::__concat_bytes_two!(
$crate::const_as_bytes!($first),
$crate::const_concat_bytes!($($rest),+),
)
);
}
#[doc(inline)] pub use const_concat_bytes as concat_bytes;
#[doc(hidden)] #[macro_export]
macro_rules! __concat_bytes_two {(
$left:expr,
$right:expr $(,)?
) => ({
const LEFT: &'static [$crate::__::core::primitive::u8] = $left;
const RIGHT: &'static [$crate::__::core::primitive::u8] = $right;
unsafe {
use $crate::const_::__::{Contiguous, core::{self, primitive::*, mem}};
const LEFT_LEN: usize = LEFT.len();
const LEFT_BYTES: &'static [u8; LEFT_LEN] = unsafe {
mem::transmute(LEFT.as_ptr())
};
const RIGHT_LEN: usize = RIGHT.len();
const RIGHT_BYTES: &'static [u8; RIGHT_LEN] = unsafe {
mem::transmute(RIGHT.as_ptr())
};
const CONCAT_CONTIGUOUS: (
&'static Contiguous<
[u8; LEFT_LEN],
[u8; RIGHT_LEN],
>
) = &Contiguous(
*LEFT_BYTES,
*RIGHT_BYTES,
);
const CONCAT_BYTES: &'static [u8; LEFT_LEN + RIGHT_LEN] = unsafe {
mem::transmute(CONCAT_CONTIGUOUS)
};
CONCAT_BYTES
}
})}