use crate::ConstInitCore;
#[doc = crate::_tags!(init)]
#[doc = crate::_doc_location!("code")]
pub trait ConstInit {
const INIT: Self;
}
#[doc = crate::_tags!(code init)]
pub trait Sealed {}
impl<T: ConstInitCore + Sealed> ConstInit for T {
const INIT: Self = <T as ConstInitCore>::INIT;
}
#[rustfmt::skip]
mod impl_core {
use super::{ConstInitCore, Sealed};
use crate::{_impl_init,
NonZeroU8, NonZeroU16, NonZeroU32, NonZeroU64, NonZeroU128, NonZeroUsize,
NonZeroI8, NonZeroI16, NonZeroI32, NonZeroI64, NonZeroI128, NonZeroIsize,
Duration,
Cell, OnceCell, RefCell, UnsafeCell,
PhantomData, PhantomPinned, ManuallyDrop,
Reverse, Saturating, Wrapping,
Range, RangeFrom, RangeFull, RangeInclusive, RangeTo, RangeToInclusive,
PanicAssertUnwindSafe,
CStr,
};
_impl_init![%Sealed%ConstInitCore: tuples <T: ConstInitCore>];
_impl_init![%Sealed%ConstInitCore: arrays <T: ConstInitCore>
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32];
_impl_init!(%Sealed%:
(), bool, char,
i8, i16, i32, i64, i128, isize,
u8, u16, u32, u64, u128, usize,
f32, f64,
NonZeroU8, NonZeroU16, NonZeroU32, NonZeroU64, NonZeroU128, NonZeroUsize,
NonZeroI8, NonZeroI16, NonZeroI32, NonZeroI64, NonZeroI128, NonZeroIsize,
Duration,
RangeFull,
PhantomPinned,
&CStr, &str, &mut str,
);
_impl_init![%Sealed%: <T> *const T, *mut T, &[T]];
_impl_init![%Sealed%: <T: ConstInitCore>
RangeFrom<T>, RangeTo<T>, RangeToInclusive<T>, Range<T>, RangeInclusive<T>,
OnceCell<T>, Cell<T>, ManuallyDrop<T>, RefCell<T>, UnsafeCell<T>,
PanicAssertUnwindSafe<T>, Reverse<T>, Saturating<T>, Wrapping<T>,
PhantomData<T>,
Option<T>,
];
impl<T: ConstInitCore, E> Sealed for Result<T, E> {}
}
#[rustfmt::skip]
#[cfg(feature = "alloc")]
#[cfg_attr(nightly_doc, doc(cfg(feature = "alloc")))]
mod impl_alloc {
use super::ConstInit;
use crate::{_impl_init,
BTreeSet, BTreeMap,
LinkedList,
Vec,
BinaryHeap, VecDeque,
RcWeak,
String,
};
_impl_init![ConstInit: <T> Self::new() => BTreeSet<T>, LinkedList<T>, Vec<T>, VecDeque<T>];
impl<T: Ord> ConstInit for BinaryHeap<T> { const INIT: Self = Self::new(); }
_impl_init![ConstInit: <K, V> Self::new() => BTreeMap<K, V>];
_impl_init![ConstInit: <T: ConstInit> Self::new() => RcWeak<T>];
_impl_init![ConstInit: Self::new() => String];
}
#[cfg(feature = "std")]
#[cfg_attr(nightly_doc, doc(cfg(feature = "std")))]
mod impl_std {
use crate::_impl_init;
use std::{
cell::LazyCell,
process::ExitCode,
sync::{Condvar, LazyLock, Mutex, Once, OnceLock, RwLock, Weak as ArcWeak},
};
_impl_init![ConstInit: Self::SUCCESS => ExitCode];
_impl_init![ConstInit: Self::new() => Condvar, Once];
_impl_init![ConstInit: <T: ConstInit>
Self::new() => ArcWeak<T>, OnceLock<T>];
_impl_init![ConstInit: <T: ConstInit>
Self::new(T::INIT) => Mutex<T>, RwLock<T>];
_impl_init![ConstInit: <T: ConstInit>
Self::new(|| T::INIT) => LazyCell<T>, LazyLock<T>];
}
#[rustfmt::skip]
mod impl_devela_base_core {
use super::{ConstInitCore, Sealed};
use crate::{_impl_init, paste,
Mismatch,
ConstList,
Base,
Adler32, HasherFx,
Boundary1d, Boundary2d, Boundary3d, Orientation,
Distance, Extent, Position, Stride,
f32bits, f32bits_niche, f64bits, f64bits_niche,
Cast, Cmp,
Pcg32, XorShift128p,
Cycle, CycleCount, Interval, Sign,
CharAscii, char7, char8, char16, charu, charu_niche,
FmtNumConf, FmtNumSign,
TextFit, TextLayout, TextLayoutStep,
TextCohesion, TextLayoutSpan, TextSymbol,
TextParseError, TextParseErrorKind, TextScanner,
StringNonul, StringU8, StringU16, StringU32, StringUsize,
TextCursor, TextIndex, TextRange,
};
#[cfg(feature = "rand")]
pub use crate::{
Lcg16,
Xabc, Xoroshiro128pp, Xyza8a, Xyza8b,
XorShift8, XorShift16, XorShift32, XorShift64, XorShift128,
};
#[cfg(feature = "grapheme")]
pub use crate::{GraphemeNonul, GraphemeU8};
_impl_init![%Sealed%: <N: ConstInitCore, H: ConstInitCore> Mismatch<N, H>];
_impl_init![%Sealed%: <T> ConstList<'_, T>];
impl<const RADIX: usize, const LUT: bool, const PAD: bool, const CASE: bool, CODE>
Sealed for Base<RADIX, LUT, PAD, CASE, CODE> {}
_impl_init![%Sealed%: Adler32];
_impl_init![%Sealed%: <T> HasherFx<T>];
_impl_init![%Sealed%: Boundary1d, Boundary2d, Boundary3d];
impl<T: ConstInitCore, const D: usize> Sealed for Orientation<T, D> {}
impl<T: ConstInitCore, const D: usize> Sealed for Distance<T, D> {}
impl<T: ConstInitCore, const D: usize> Sealed for Extent<T, D> {}
impl<T: ConstInitCore, const D: usize> Sealed for Position<T, D> {}
impl<T: ConstInitCore, const D: usize> Sealed for Stride<T, D> {}
_impl_init![%Sealed%: f32bits, f32bits_niche, f64bits, f64bits_niche];
_impl_init![%Sealed%: Sign];
_impl_init![%Sealed%: <T> Cycle<T>, Interval<T>];
_impl_init![%Sealed%: <T: ConstInitCore, N: ConstInitCore> CycleCount<T, N>];
_impl_init![%Sealed%: <T: ConstInitCore> Cast<T>, Cmp<T>];
_impl_init![%Sealed%: Pcg32, XorShift128p];
#[cfg(feature = "rand")]
_impl_init![%Sealed%: Lcg16, Xabc, Xoroshiro128pp, Xyza8a, Xyza8b,
XorShift8, XorShift16, XorShift32, XorShift64, XorShift128];
_impl_init![%Sealed%: CharAscii, char7, char8, char16, charu, charu_niche];
_impl_init![%Sealed%: FmtNumConf, FmtNumSign];
_impl_init![%Sealed%: TextFit, TextLayout, TextLayoutSpan, TextLayoutStep,
TextCohesion, TextSymbol];
_impl_init![%Sealed%: TextParseError, TextParseErrorKind];
_impl_init![%Sealed%: TextScanner<'_>];
_impl_init![%Sealed%: TextCursor, TextIndex, TextRange];
impl<const CAP: usize> Sealed for StringNonul<CAP> {}
macro_rules! _stringu {
() => { _stringu![u8, u16, u32, usize]; };
($($t:ty),+ $(,)?) => { $( paste! { _stringu![@[<String $t:camel>], $t]; } )+ };
(@$name:ident, $t:ty) => { impl<const CAP: usize> Sealed for $name<CAP> {} };
} _stringu!();
#[cfg(feature = "grapheme")]
impl<const CAP: usize> Sealed for GraphemeNonul<CAP> {}
#[cfg(feature = "grapheme")]
impl<const CAP: usize> Sealed for GraphemeU8<CAP> {}
}
#[rustfmt::skip]
#[cfg(feature = "alloc")]
#[cfg_attr(nightly_doc, doc(cfg(feature = "alloc")))]
mod impl_devela_base_alloc {
#[cfg(feature = "grapheme")]
impl super::Sealed for crate::GraphemeString {}
}