From 51dd8a5c09bc1ac26a4500f5ea2c055824ec02e6 Mon Sep 17 00:00:00 2001 From: trivernis Date: Tue, 15 Mar 2022 19:20:27 +0100 Subject: [PATCH] Change typemap base to be generic Signed-off-by: trivernis --- src/lib.rs | 2 +- src/macros.rs | 4 ++-- src/trait_maps/clone_typemap.rs | 4 ++-- src/{base.rs => type_indexed.rs} | 21 +++++++++++++-------- 4 files changed, 18 insertions(+), 13 deletions(-) rename src/{base.rs => type_indexed.rs} (60%) diff --git a/src/lib.rs b/src/lib.rs index fc05940..362b030 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,10 +1,10 @@ #![doc=include_str!("../README.md")] -mod base; mod macros; #[cfg(test)] mod tests; mod trait_maps; +mod type_indexed; mod typemap_trait; pub use trait_maps::*; diff --git a/src/macros.rs b/src/macros.rs index bf9a127..6f30469 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -6,7 +6,7 @@ macro_rules! impl_typemap { $map:ident, $key:ident, $($trt:ident), +) => { $( #[$outer] )* #[derive(Debug)] - pub struct $map($crate::base::TypeMapBase); + pub struct $map($crate::type_indexed::TypeIndexedMap); $crate::impl_typekey!($key, $( $trt )+); impl $crate::TypeMapTrait for $map { @@ -14,7 +14,7 @@ macro_rules! impl_typemap { #[inline] fn new() -> Self { - Self($crate::base::TypeMapBase::new()) + Self($crate::type_indexed::TypeIndexedMap::new()) } #[inline] diff --git a/src/trait_maps/clone_typemap.rs b/src/trait_maps/clone_typemap.rs index 1aa0b45..b9a0c0f 100644 --- a/src/trait_maps/clone_typemap.rs +++ b/src/trait_maps/clone_typemap.rs @@ -1,5 +1,5 @@ -use crate::base::TypeMapBase; use crate::impl_typemap; +use crate::type_indexed::TypeIndexedMap; use multi_trait_object::{RawClone, TryClone}; impl_typemap!( @@ -18,6 +18,6 @@ impl Clone for CloneTypeMap { .iter() .map(|(t, o)| (t.clone(), o.try_clone().unwrap())) .collect(); - CloneTypeMap(TypeMapBase(map)) + CloneTypeMap(TypeIndexedMap(map)) } } diff --git a/src/base.rs b/src/type_indexed.rs similarity index 60% rename from src/base.rs rename to src/type_indexed.rs index bf7f08b..306a932 100644 --- a/src/base.rs +++ b/src/type_indexed.rs @@ -1,4 +1,3 @@ -use multi_trait_object::MultitraitObject; use std::any::TypeId; use std::collections::HashMap; @@ -6,32 +5,38 @@ use std::collections::HashMap; /// Each other typemap is just a newtype of this base type with /// additional implementation. #[doc(hidden)] -#[derive(Debug, Default)] -pub(crate) struct TypeMapBase(pub(crate) HashMap); +#[derive(Debug)] +pub(crate) struct TypeIndexedMap(pub(crate) HashMap); -impl TypeMapBase { +impl Default for TypeIndexedMap { + fn default() -> Self { + Self(HashMap::default()) + } +} + +impl TypeIndexedMap { #[inline] pub fn new() -> Self { Self::default() } #[inline] - pub fn insert(&mut self, value: MultitraitObject) { + pub fn insert(&mut self, value: T) { self.0.insert(TypeId::of::(), value); } #[inline] - pub fn get(&self) -> Option<&MultitraitObject> { + pub fn get(&self) -> Option<&T> { self.0.get(&TypeId::of::()) } #[inline] - pub fn get_mut(&mut self) -> Option<&mut MultitraitObject> { + pub fn get_mut(&mut self) -> Option<&mut T> { self.0.get_mut(&TypeId::of::()) } #[inline] - pub fn remove(&mut self) -> Option { + pub fn remove(&mut self) -> Option { self.0.remove(&TypeId::of::()) }