X-Git-Url: https://git.chrismorgan.info/anymap/blobdiff_plain/521fbfe6bcbf60e7abc8d8ab33bf73349fc4b38d..0a1c85f8655a71b995d228ed0c9496f732268c5b:/src/any.rs diff --git a/src/any.rs b/src/any.rs index 8404cd4..15b535b 100644 --- a/src/any.rs +++ b/src/any.rs @@ -1,10 +1,7 @@ -//! The different types of `Any` for use in a map. -//! -//! This stuff is all based on `std::any`, but goes a little further, with `CloneAny` being a -//! cloneable `Any` and with the `Send` and `Sync` bounds possible on both `Any` and `CloneAny`. - -use std::fmt; -use std::any::Any as StdAny; +use core::fmt; +use core::any::Any; +#[cfg(not(feature = "std"))] +use alloc::boxed::Box; #[doc(hidden)] pub trait CloneToAny { @@ -31,7 +28,7 @@ macro_rules! impl_clone { // your bin crate needs a corresponding allow!). Although I explained my plight¹ // and it was all explained and agreed upon, no action has been taken. So I finally // caved and worked around it by doing it this way, which matches what’s done for - // std::any², so it’s probably not *too* bad. + // core::any², so it’s probably not *too* bad. // // ¹ https://github.com/rust-lang/rust/issues/51443#issuecomment-421988013 // ² https://github.com/rust-lang/rust/blob/e7825f2b690c9a0d21b6f6d84c404bb53b151b38/library/alloc/src/boxed.rs#L1613-L1616 @@ -40,6 +37,13 @@ macro_rules! impl_clone { unsafe { Box::from_raw(raw as *mut $t) } } } + + impl fmt::Debug for $t { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.pad(stringify!($t)) + } + } } } @@ -59,13 +63,6 @@ pub trait IntoBox: Any { macro_rules! implement { ($base:ident, $(+ $bounds:ident)*) => { - impl fmt::Debug for dyn $base $(+ $bounds)* { - #[inline] - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.pad(stringify!(dyn $base $(+ $bounds)*)) - } - } - impl UncheckedAnyExt for dyn $base $(+ $bounds)* { #[inline] unsafe fn downcast_ref_unchecked(&self) -> &T { @@ -92,48 +89,19 @@ macro_rules! implement { } } -/// A type to emulate dynamic typing. -/// -/// Every type with no non-`'static` references implements `Any`. -/// See the [`std::any` documentation](https://doc.rust-lang.org/std/any/index.html) for -/// more details on `Any` in general. -/// -/// This trait is not `std::any::Any` but rather a type extending that for this library’s -/// purposes so that it can be combined with marker traits like -/// Send and -/// Sync. -/// -/// See also [`CloneAny`](trait.CloneAny.html) for a cloneable version of this trait. -pub trait Any: StdAny { } -impl Any for T { } implement!(Any,); implement!(Any, + Send); -implement!(Any, + Sync); implement!(Any, + Send + Sync); -/// A type to emulate dynamic typing with cloning. -/// -/// Every type with no non-`'static` references that implements `Clone` implements `Any`. -/// See the [`std::any` documentation](https://doc.rust-lang.org/std/any/index.html) for -/// more details on `Any` in general. -/// -/// This trait is not `std::any::Any` but rather a type extending that for this library’s -/// purposes so that it can be combined with marker traits like -/// Send and -/// Sync. +/// [`Any`], but with cloning. /// -/// See also [`Any`](trait.Any.html) for a version without the `Clone` requirement. +/// Every type with no non-`'static` references that implements `Clone` implements `CloneAny`. +/// See [`core::any`] for more details on `Any` in general. pub trait CloneAny: Any + CloneToAny { } -impl CloneAny for T { } +impl CloneAny for T { } implement!(CloneAny,); implement!(CloneAny, + Send); -implement!(CloneAny, + Sync); implement!(CloneAny, + Send + Sync); impl_clone!(dyn CloneAny); impl_clone!(dyn CloneAny + Send); -impl_clone!(dyn CloneAny + Sync); impl_clone!(dyn CloneAny + Send + Sync);