Skip to content

Commit aa8c081

Browse files
committed
add tests, and...
* rename `reset` → `remove` * add function `remove_by_type` * format code
1 parent 5ee53f3 commit aa8c081

File tree

10 files changed

+584
-48
lines changed

10 files changed

+584
-48
lines changed

Cargo.lock

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

egui/Cargo.toml

+3
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,6 @@ persistence = ["serde", "epaint/persistence", "ron"]
3636
# Only needed if you plan to use the same egui::Context from multiple threads.
3737
single_threaded = ["epaint/single_threaded"]
3838
multi_threaded = ["epaint/multi_threaded"]
39+
40+
[dev-dependencies]
41+
serde_json = "1"

egui/src/any/any_map.rs

+125-6
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::any::element::{AnyMapElement, AnyMapTrait};
2-
use std::hash::Hash;
32
use std::any::TypeId;
43
use 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

6780
impl<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
}

egui/src/any/mod.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,11 @@
4747
//! [`Memory`]: crate::Memory
4848
//! [`Any`]: std::any::Any
4949
50-
mod type_map;
51-
mod element;
5250
mod any_map;
51+
mod element;
52+
mod type_map;
5353

5454
/// Same structs and traits, but also can be de/serialized under `persistence` feature.
5555
pub mod serializable;
5656

57-
pub use self::{type_map::TypeMap, element::AnyMapTrait, any_map::AnyMap};
57+
pub use self::{any_map::AnyMap, element::AnyMapTrait, type_map::TypeMap};

0 commit comments

Comments
 (0)