diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e7dbff..0841cfa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,14 @@ # 1.0.0 (unreleased) -- **Breaking change:** `anymap::any` flattened out of existence: - `anymap::any::{Any, CloneAny}` are now found at `anymap::{Any, CloneAny}`. +- Removed `anymap::any::Any` in favour of just plain `std::any::Any`, since its + `Send`/`Sync` story is now long stable. + + - This loses `Any + Sync`. `CloneAny + Sync` is also removed for consistency. + (So `Any + Sync` is gone, but `Any`, `Any + Send` and `Any + Send + Sync` + remain, plus the same set for `CloneAny`.) + +- `anymap::any::CloneAny` moved to `anymap::CloneAny`. + With nothing public left in `anymap::any`, it is removed. - Relicensed from MIT/Apache-2.0 to BlueOak-1.0.0/MIT/Apache-2.0. diff --git a/src/any.rs b/src/any.rs index 8404cd4..453d7dd 100644 --- a/src/any.rs +++ b/src/any.rs @@ -4,7 +4,7 @@ //! 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 std::any::Any; #[doc(hidden)] pub trait CloneToAny { @@ -40,6 +40,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 +66,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 +92,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. +/// [`Any`], but 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. -/// -/// 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 [`std::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); diff --git a/src/lib.rs b/src/lib.rs index 3f656e3..a53a2d8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,12 +2,12 @@ #![warn(missing_docs, unused_results)] -use std::any::TypeId; +use std::any::{Any, TypeId}; use std::marker::PhantomData; use raw::RawMap; use any::{UncheckedAnyExt, IntoBox}; -pub use any::{Any, CloneAny}; +pub use any::CloneAny; macro_rules! impl_common_methods { ( @@ -93,10 +93,10 @@ pub mod raw; /// type-safe access to those values. /// /// The type parameter `A` allows you to use a different value type; normally you will want it to -/// be `anymap::any::Any`, but there are other choices: +/// be `std::any::Any`, but there are other choices: /// /// - If you want the entire map to be cloneable, use `CloneAny` instead of `Any`. -/// - You can add on `+ Send` and/or `+ Sync` (e.g. `Map`) to add those bounds. +/// - You can add on `+ Send` or `+ Send + Sync` (e.g. `Map`) to add those bounds. /// /// ```rust /// # use anymap::AnyMap; @@ -312,8 +312,7 @@ impl<'a, A: ?Sized + UncheckedAnyExt, V: IntoBox> VacantEntry<'a, A, V> { #[cfg(test)] mod tests { - use {Map, AnyMap, Entry}; - use any::{Any, CloneAny}; + use super::*; #[derive(Clone, Debug, PartialEq)] struct A(i32); #[derive(Clone, Debug, PartialEq)] struct B(i32); @@ -431,23 +430,18 @@ mod tests { fn assert_debug() { } assert_send::>(); assert_send::>(); - assert_sync::>(); assert_sync::>(); assert_debug::>(); assert_debug::>(); - assert_debug::>(); assert_debug::>(); assert_send::>(); assert_send::>(); - assert_sync::>(); assert_sync::>(); assert_clone::>(); assert_clone::>(); - assert_clone::>(); assert_clone::>(); assert_debug::>(); assert_debug::>(); - assert_debug::>(); assert_debug::>(); } } diff --git a/src/raw.rs b/src/raw.rs index 73c20e2..5720086 100644 --- a/src/raw.rs +++ b/src/raw.rs @@ -2,7 +2,7 @@ //! //! All relevant details are in the `RawMap` struct. -use std::any::TypeId; +use std::any::{Any, TypeId}; use std::borrow::Borrow; use std::collections::hash_map::{self, HashMap}; use std::convert::TryInto; @@ -12,7 +12,7 @@ use std::hash::{Hasher, BuildHasherDefault}; use std::mem; use std::ops::{Index, IndexMut}; -use any::{Any, UncheckedAnyExt}; +use any::UncheckedAnyExt; #[derive(Default)] struct TypeIdHasher {