diff --git a/Cargo.toml b/Cargo.toml index 653ca6d..a53e0be 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "trait-bound-typemap" -version = "0.3.0" +version = "0.3.1" edition = "2021" license = "Apache-2.0" readme = "README.md" diff --git a/src/macros.rs b/src/macros.rs index 2c3ae05..d97caa7 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -80,6 +80,17 @@ macro_rules! impl_typemap { $map($crate::type_indexed::TypeIndexedMap(map)) } } + + impl, M: 'static $(+ $trt )+> Extend<$crate::TypeMapEntry> for $map { + fn extend>>(&mut self, iter: T) { + let iter = iter + .into_iter() + .map(|e: $crate::TypeMapEntry| (e.type_id, e.mto)) + .collect::>(); + self.0.extend(iter) + } + } + }; } diff --git a/src/tests.rs b/src/tests.rs index e2ea714..d941583 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -97,8 +97,23 @@ fn it_converts() { 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::()); } + +#[test] +fn it_can_be_extended() { + let mut clone_send_sync_map = CloneSendSyncTypeMap::new(); + clone_send_sync_map.insert::(TestStruct::default()); + assert!(clone_send_sync_map.contains_key::()); + + let mut clone_map = CloneTypeMap::new(); + clone_map.insert::(TestStruct2::default()); + clone_map.extend(clone_send_sync_map); + assert!(clone_map.contains_key::()); + assert!(clone_map.contains_key::()); +} diff --git a/src/type_indexed.rs b/src/type_indexed.rs index 306a932..54ba1e9 100644 --- a/src/type_indexed.rs +++ b/src/type_indexed.rs @@ -1,4 +1,5 @@ use std::any::TypeId; +use std::collections::hash_map::IntoIter; use std::collections::HashMap; /// Base typemap used for implementation but not elsewhere @@ -45,3 +46,18 @@ impl TypeIndexedMap { self.0.contains_key(&TypeId::of::()) } } + +impl IntoIterator for TypeIndexedMap { + type Item = (TypeId, T); + type IntoIter = IntoIter; + + fn into_iter(self) -> Self::IntoIter { + self.0.into_iter() + } +} + +impl Extend<(TypeId, T)> for TypeIndexedMap { + fn extend>(&mut self, iter: I) { + self.0.extend(iter) + } +}