11use crate :: any:: element:: { AnyMapElement , AnyMapTrait } ;
2- use std:: hash:: Hash ;
32use std:: any:: TypeId ;
43use std:: collections:: HashMap ;
4+ use std:: hash:: Hash ;
55
66/// Stores any object by `Key`.
77#[ derive( Clone , Debug ) ]
@@ -62,6 +62,19 @@ impl<Key: Hash + Eq> AnyMap<Key> {
6262 pub fn insert < T : AnyMapTrait > ( & mut self , key : Key , element : T ) {
6363 self . 0 . insert ( key, AnyMapElement :: new ( element) ) ;
6464 }
65+
66+ pub fn remove ( & mut self , key : & Key ) {
67+ self . 0 . remove ( key) ;
68+ }
69+
70+ pub fn remove_by_type < T : AnyMapTrait > ( & mut self ) {
71+ let key = TypeId :: of :: < T > ( ) ;
72+ self . 0 . retain ( |_, v| v. type_id ( ) != key) ;
73+ }
74+
75+ pub fn clear ( & mut self ) {
76+ self . 0 . clear ( ) ;
77+ }
6578}
6679
6780impl < Key : Hash + Eq > AnyMap < Key > {
@@ -74,13 +87,119 @@ impl<Key: Hash + Eq> AnyMap<Key> {
7487 pub fn count_all ( & mut self ) -> usize {
7588 self . 0 . len ( )
7689 }
90+ }
7791
78- pub fn reset < T : AnyMapTrait > ( & mut self ) {
79- let key = TypeId :: of :: < T > ( ) ;
80- self . 0 . retain ( |_, v| v. type_id ( ) != key) ;
92+ // ----------------------------------------------------------------------------
93+
94+ #[ cfg( test) ]
95+ #[ test]
96+ fn basic_usage ( ) {
97+ #[ derive( Debug , Clone , Eq , PartialEq , Default ) ]
98+ struct State {
99+ a : i32 ,
81100 }
82101
83- pub fn reset_all ( & mut self ) {
84- self . 0 . clear ( ) ;
102+ let mut map: AnyMap < i32 > = Default :: default ( ) ;
103+
104+ assert ! ( map. get:: <State >( & 0 ) . is_none( ) ) ;
105+ map. insert ( 0 , State { a : 42 } ) ;
106+
107+ assert_eq ! ( * map. get:: <State >( & 0 ) . unwrap( ) , State { a: 42 } ) ;
108+ assert ! ( map. get:: <State >( & 1 ) . is_none( ) ) ;
109+ map. get_mut :: < State > ( & 0 ) . unwrap ( ) . a = 43 ;
110+ assert_eq ! ( * map. get:: <State >( & 0 ) . unwrap( ) , State { a: 43 } ) ;
111+
112+ map. remove ( & 0 ) ;
113+ assert ! ( map. get:: <State >( & 0 ) . is_none( ) ) ;
114+
115+ assert_eq ! (
116+ * map. get_or_insert_with( 0 , || State { a: 55 } ) ,
117+ State { a: 55 }
118+ ) ;
119+ map. remove ( & 0 ) ;
120+ assert_eq ! (
121+ * map. get_mut_or_insert_with( 0 , || State { a: 56 } ) ,
122+ State { a: 56 }
123+ ) ;
124+ map. remove ( & 0 ) ;
125+ assert_eq ! ( * map. get_or_default:: <State >( 0 ) , State { a: 0 } ) ;
126+ map. remove ( & 0 ) ;
127+ assert_eq ! ( * map. get_mut_or_default:: <State >( 0 ) , State { a: 0 } ) ;
128+ }
129+
130+ #[ cfg( test) ]
131+ #[ test]
132+ fn different_type_same_id ( ) {
133+ #[ derive( Debug , Clone , Eq , PartialEq , Default ) ]
134+ struct State {
135+ a : i32 ,
85136 }
137+
138+ let mut map: AnyMap < i32 > = Default :: default ( ) ;
139+
140+ map. insert ( 0 , State { a : 42 } ) ;
141+
142+ assert_eq ! ( * map. get:: <State >( & 0 ) . unwrap( ) , State { a: 42 } ) ;
143+ assert ! ( map. get:: <i32 >( & 0 ) . is_none( ) ) ;
144+
145+ map. insert ( 0 , 255i32 ) ;
146+
147+ assert_eq ! ( * map. get:: <i32 >( & 0 ) . unwrap( ) , 255 ) ;
148+ assert ! ( map. get:: <State >( & 0 ) . is_none( ) ) ;
149+ }
150+
151+ #[ cfg( test) ]
152+ #[ test]
153+ fn cloning ( ) {
154+ #[ derive( Debug , Clone , Eq , PartialEq , Default ) ]
155+ struct State {
156+ a : i32 ,
157+ }
158+
159+ let mut map: AnyMap < i32 > = Default :: default ( ) ;
160+
161+ map. insert ( 0 , State :: default ( ) ) ;
162+ map. insert ( 10 , 10i32 ) ;
163+ map. insert ( 11 , 11i32 ) ;
164+
165+ let cloned_map = map. clone ( ) ;
166+
167+ map. insert ( 12 , 12i32 ) ;
168+ map. insert ( 1 , State { a : 10 } ) ;
169+
170+ assert_eq ! ( * cloned_map. get:: <State >( & 0 ) . unwrap( ) , State { a: 0 } ) ;
171+ assert ! ( cloned_map. get:: <State >( & 1 ) . is_none( ) ) ;
172+ assert_eq ! ( * cloned_map. get:: <i32 >( & 10 ) . unwrap( ) , 10i32 ) ;
173+ assert_eq ! ( * cloned_map. get:: <i32 >( & 11 ) . unwrap( ) , 11i32 ) ;
174+ assert ! ( cloned_map. get:: <i32 >( & 12 ) . is_none( ) ) ;
175+ }
176+
177+ #[ cfg( test) ]
178+ #[ test]
179+ fn counting ( ) {
180+ #[ derive( Debug , Clone , Eq , PartialEq , Default ) ]
181+ struct State {
182+ a : i32 ,
183+ }
184+
185+ let mut map: AnyMap < i32 > = Default :: default ( ) ;
186+
187+ map. insert ( 0 , State :: default ( ) ) ;
188+ map. insert ( 1 , State { a : 10 } ) ;
189+ map. insert ( 10 , 10i32 ) ;
190+ map. insert ( 11 , 11i32 ) ;
191+ map. insert ( 12 , 12i32 ) ;
192+
193+ assert_eq ! ( map. count:: <State >( ) , 2 ) ;
194+ assert_eq ! ( map. count:: <i32 >( ) , 3 ) ;
195+
196+ map. remove_by_type :: < State > ( ) ;
197+
198+ assert_eq ! ( map. count:: <State >( ) , 0 ) ;
199+ assert_eq ! ( map. count:: <i32 >( ) , 3 ) ;
200+
201+ map. clear ( ) ;
202+
203+ assert_eq ! ( map. count:: <State >( ) , 0 ) ;
204+ assert_eq ! ( map. count:: <i32 >( ) , 0 ) ;
86205}
0 commit comments