From b353b82e61426671f93dc4e64468fcdcd065d4ed Mon Sep 17 00:00:00 2001 From: trivernis Date: Tue, 15 Mar 2022 20:52:16 +0100 Subject: [PATCH] Add typemap that can be cloned and is Send + Sync Signed-off-by: trivernis --- src/macros.rs | 2 +- src/tests.rs | 20 +++++++++++++--- src/trait_maps/clone_send_sync_typemap.rs | 29 +++++++++++++++++++++++ src/trait_maps/mod.rs | 2 ++ src/typemap_trait.rs | 4 ---- 5 files changed, 49 insertions(+), 8 deletions(-) create mode 100644 src/trait_maps/clone_send_sync_typemap.rs diff --git a/src/macros.rs b/src/macros.rs index 462ca06..7bbd1a3 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -8,7 +8,7 @@ macro_rules! impl_typemap { #[derive(Debug)] pub struct $map($crate::type_indexed::TypeIndexedMap); - $crate::impl_typekey!($key, $( $trt )+); + $crate::impl_typekey!($key $(, $trt )+); impl $crate::MapKey for $key { type Map = $map; diff --git a/src/tests.rs b/src/tests.rs index 35dc60a..0bb2235 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -1,4 +1,6 @@ -use crate::{AnyTypeMap, CloneTypeMap, PartialEqTypeMap, TypeMapKey, TypeMapTrait}; +use crate::{ + AnyTypeMap, CloneSendSyncTypeMap, CloneTypeMap, PartialEqTypeMap, TypeMapKey, TypeMapTrait, +}; pub struct TestStructKey; #[derive(Clone, Debug, PartialEq)] @@ -71,6 +73,16 @@ fn it_creates_clonable_maps() { assert_eq!(map.contains_key::(), false); } +#[test] +fn it_creates_clonable_send_sync_maps() { + let mut map = CloneSendSyncTypeMap::new(); + map.insert::(TestStruct::default()); + map.insert::(TestStruct2::default()); + assert!(map.contains_key::()); + assert!(map.contains_key::()); + assert_eq!(map.contains_key::(), false); +} + #[test] fn it_creates_partial_eq_maps() { let mut map = PartialEqTypeMap::new(); @@ -82,8 +94,10 @@ fn it_creates_partial_eq_maps() { #[test] fn it_converts() { - let mut clone_map = CloneTypeMap::new(); - clone_map.insert::(TestStruct::default()); + let mut clone_send_sync_map = CloneSendSyncTypeMap::new(); + clone_send_sync_map.insert::(TestStruct::default()); + assert!(clone_send_sync_map.contains_key::()); + let clone_map = CloneTypeMap::from_iter(clone_send_sync_map); assert!(clone_map.contains_key::()); let any_map = AnyTypeMap::from_iter(clone_map); assert!(any_map.contains_key::()); diff --git a/src/trait_maps/clone_send_sync_typemap.rs b/src/trait_maps/clone_send_sync_typemap.rs new file mode 100644 index 0000000..835b2ae --- /dev/null +++ b/src/trait_maps/clone_send_sync_typemap.rs @@ -0,0 +1,29 @@ +use crate::impl_typemap; +use multi_trait_object::{MultitraitObject, RawClone, TryClone}; +use std::any::TypeId; +use std::collections::HashMap; + +impl_typemap!( + /// A typemap that implements Clone and is Send + Sync + CloneSendSyncTypeMap, + CloneSendSyncTypeMapKey, + RawClone, + Send, + Sync +); + +impl Clone for CloneSendSyncTypeMap { + fn clone(&self) -> Self { + let map = self + .0 + .0 + .iter() + .map(|(tid, mto)| (tid.clone(), mto.try_clone().unwrap())) + .collect::>(); + + Self(crate::type_indexed::TypeIndexedMap(map)) + } +} + +unsafe impl Send for CloneSendSyncTypeMap {} +unsafe impl Sync for CloneSendSyncTypeMap {} diff --git a/src/trait_maps/mod.rs b/src/trait_maps/mod.rs index 8c8b47b..77dc0cd 100644 --- a/src/trait_maps/mod.rs +++ b/src/trait_maps/mod.rs @@ -1,7 +1,9 @@ +mod clone_send_sync_typemap; mod clone_typemap; mod partialeq_typemap; mod typemap; +pub use clone_send_sync_typemap::*; pub use clone_typemap::*; pub use partialeq_typemap::*; pub use typemap::*; diff --git a/src/typemap_trait.rs b/src/typemap_trait.rs index ff2635c..43f60a8 100644 --- a/src/typemap_trait.rs +++ b/src/typemap_trait.rs @@ -27,10 +27,6 @@ pub trait MapKey { type Map: TypeMapTrait; } -/// A marker trait to transfer trait information -#[doc(hidden)] -pub trait TraitCarrier {} - /// A trait implemented by all typemaps that provides /// all basic typemap functions pub trait TypeMapTrait {