#![cfg_attr(not(feature = "std"), no_std)]
#[cfg(feature = "std")]
extern crate std;
#[cfg(feature = "std")]
use std::path::{Path, PathBuf};
#[cfg(feature = "std")]
use std::ffi::{OsStr, OsString};
#[cfg(feature = "alloc")]
extern crate alloc;
use core::{
any::{type_name, TypeId},
ops::{Bound, ControlFlow},
sync::atomic::{
AtomicBool, AtomicI16, AtomicI32, AtomicI64, AtomicI8, AtomicIsize, AtomicU16, AtomicU32,
AtomicU64, AtomicU8, AtomicUsize, Ordering,
},
};
pub trait Staticize {
type Static: 'static + ?Sized;
fn static_type_id() -> TypeId {
TypeId::of::<Self::Static>()
}
fn static_type_name() -> &'static str {
&type_name::<Self::Static>()
}
}
impl<'a, T: ?Sized> Staticize for &'a T
where
T: Staticize,
{
type Static = &'static T::Static;
}
impl<'a, T: Staticize> Staticize for &'a [T]
where
<T as Staticize>::Static: Sized,
{
type Static = &'static [T::Static];
}
impl<T: Staticize> Staticize for Option<T>
where
<T as Staticize>::Static: Sized,
{
type Static = Option<T::Static>;
}
impl<T: Staticize, E: Staticize> Staticize for Result<T, E>
where
<T as Staticize>::Static: Sized,
<E as Staticize>::Static: Sized,
{
type Static = Result<T::Static, E::Static>;
}
impl<B: Staticize, C: Staticize> Staticize for ControlFlow<B, C>
where
<B as Staticize>::Static: Sized,
<C as Staticize>::Static: Sized,
{
type Static = ControlFlow<B::Static, C::Static>;
}
impl<T: Staticize> Staticize for Bound<T>
where
<T as Staticize>::Static: Sized,
{
type Static = Bound<T::Static>;
}
#[cfg(all(feature = "alloc", not(feature = "std")))]
impl<T: Staticize> Staticize for alloc::vec::Vec<T>
where
<T as Staticize>::Static: Sized,
{
type Static = alloc::vec::Vec<T::Static>;
}
#[cfg(all(feature = "alloc", not(feature = "std")))]
impl<K: Staticize, V: Staticize> Staticize for alloc::collections::BTreeMap<K, V>
where
<K as Staticize>::Static: Sized,
<V as Staticize>::Static: Sized,
{
type Static = alloc::collections::BTreeMap<K::Static, V::Static>;
}
#[cfg(all(feature = "alloc", not(feature = "std")))]
impl<T: Staticize> Staticize for alloc::collections::BTreeSet<T>
where
<T as Staticize>::Static: Sized,
{
type Static = alloc::collections::BTreeSet<T::Static>;
}
#[cfg(all(feature = "alloc", not(feature = "std")))]
impl<T: Staticize> Staticize for alloc::collections::BinaryHeap<T>
where
<T as Staticize>::Static: Sized,
{
type Static = alloc::collections::BinaryHeap<T::Static>;
}
#[cfg(all(feature = "alloc", not(feature = "std")))]
impl<T: Staticize> Staticize for alloc::collections::LinkedList<T>
where
<T as Staticize>::Static: Sized,
{
type Static = alloc::collections::LinkedList<T::Static>;
}
#[cfg(all(feature = "alloc", not(feature = "std")))]
impl<T: Staticize> Staticize for alloc::collections::VecDeque<T>
where
<T as Staticize>::Static: Sized,
{
type Static = alloc::collections::VecDeque<T::Static>;
}
#[cfg(feature = "std")]
impl<T: Staticize> Staticize for std::vec::Vec<T>
where
<T as Staticize>::Static: Sized,
{
type Static = std::vec::Vec<T::Static>;
}
#[cfg(feature = "std")]
impl<K: Staticize, V: Staticize> Staticize for std::collections::BTreeMap<K, V>
where
<K as Staticize>::Static: Sized,
<V as Staticize>::Static: Sized,
{
type Static = std::collections::BTreeMap<K::Static, V::Static>;
}
#[cfg(feature = "std")]
impl<T: Staticize> Staticize for std::collections::BTreeSet<T>
where
<T as Staticize>::Static: Sized,
{
type Static = std::collections::BTreeSet<T::Static>;
}
#[cfg(feature = "std")]
impl<T: Staticize> Staticize for std::collections::BinaryHeap<T>
where
<T as Staticize>::Static: Sized,
{
type Static = std::collections::BinaryHeap<T::Static>;
}
#[cfg(feature = "std")]
impl<T: Staticize> Staticize for std::collections::LinkedList<T>
where
<T as Staticize>::Static: Sized,
{
type Static = std::collections::LinkedList<T::Static>;
}
#[cfg(feature = "std")]
impl<T: Staticize> Staticize for std::collections::VecDeque<T>
where
<T as Staticize>::Static: Sized,
{
type Static = std::collections::VecDeque<T::Static>;
}
#[macro_export]
macro_rules! derive_staticize_tuples {
($($ident:ident),*) => {
impl<$($ident: Staticize),*> Staticize for ($($ident),*,)
where $(<$ident as Staticize>::Static: Sized),*
{
type Static = ($($ident::Static),*,);
}
};
}
derive_staticize_tuples!(A);
derive_staticize_tuples!(A, B);
derive_staticize_tuples!(A, B, C);
derive_staticize_tuples!(A, B, C, D);
derive_staticize_tuples!(A, B, C, D, E);
derive_staticize_tuples!(A, B, C, D, E, F);
derive_staticize_tuples!(A, B, C, D, E, F, G);
derive_staticize_tuples!(A, B, C, D, E, F, G, H);
derive_staticize_tuples!(A, B, C, D, E, F, G, H, I);
derive_staticize_tuples!(A, B, C, D, E, F, G, H, I, J);
derive_staticize_tuples!(A, B, C, D, E, F, G, H, I, J, K);
derive_staticize_tuples!(A, B, C, D, E, F, G, H, I, J, K, L);
derive_staticize_tuples!(A, B, C, D, E, F, G, H, I, J, K, L, M);
derive_staticize_tuples!(A, B, C, D, E, F, G, H, I, J, K, L, M, N);
derive_staticize_tuples!(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O);
derive_staticize_tuples!(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P);
#[macro_export]
macro_rules! derive_staticize {
($typ:ty) => {
impl $crate::Staticize for $typ {
type Static = $typ;
}
};
}
derive_staticize!(str);
derive_staticize!(char);
derive_staticize!(bool);
derive_staticize!(usize);
derive_staticize!(isize);
derive_staticize!(u8);
derive_staticize!(u16);
derive_staticize!(u32);
derive_staticize!(u64);
derive_staticize!(u128);
derive_staticize!(i8);
derive_staticize!(i16);
derive_staticize!(i32);
derive_staticize!(i64);
derive_staticize!(i128);
derive_staticize!(f32);
derive_staticize!(f64);
derive_staticize!(());
derive_staticize!(Ordering);
derive_staticize!(AtomicBool);
derive_staticize!(AtomicU8);
derive_staticize!(AtomicU16);
derive_staticize!(AtomicU32);
derive_staticize!(AtomicU64);
derive_staticize!(AtomicI8);
derive_staticize!(AtomicI16);
derive_staticize!(AtomicI32);
derive_staticize!(AtomicI64);
derive_staticize!(AtomicIsize);
derive_staticize!(AtomicUsize);
#[cfg(all(feature = "alloc", not(feature = "std")))]
derive_staticize!(alloc::string::String);
#[cfg(feature = "std")]
derive_staticize!(String);
#[cfg(feature = "std")]
derive_staticize!(Path);
#[cfg(feature = "std")]
derive_staticize!(PathBuf);
#[cfg(feature = "std")]
derive_staticize!(OsStr);
#[cfg(feature = "std")]
derive_staticize!(OsString);