simple/simple.rs
1use dynamic_pool::{DynamicPool, DynamicReset};
2
3#[derive(Default)]
4struct Person {
5 name: String,
6 age: u16,
7}
8
9impl DynamicReset for Person {
10 fn reset(&mut self) {
11 self.name.clear();
12 self.age = 0;
13 }
14}
15
16fn main() {
17 // Creates a new pool that will hold at most 10 items, starting with 1 item by default.
18 let pool = DynamicPool::new(1, 10, Person::default);
19 // Assert we have one item in the pool.
20 assert_eq!(pool.available(), 1);
21
22 // Take an item from the pool.
23 let mut person = pool.take();
24 person.name = "jake".into();
25 person.age = 99;
26
27 // Assert the pool is empty since we took the person above.
28 assert_eq!(pool.available(), 0);
29 // Dropping returns the item to the pool.
30 drop(person);
31 // We now have stuff available in the pool to take.
32 assert_eq!(pool.available(), 1);
33
34 // Take person from the pool again, it should be reset.
35 let person = pool.take();
36 assert_eq!(person.name, "");
37 assert_eq!(person.age, 0);
38
39 // Nothing is in the queue.
40 assert_eq!(pool.available(), 0);
41 // try_take returns an Option. Since the pool is empty, nothing will be created.
42 assert!(pool.try_take().is_none());
43 // Dropping again returns the person to the pool.
44 drop(person);
45 // We have stuff in the pool now!
46 assert_eq!(pool.available(), 1);
47
48 // try_take would succeed here!
49 let person = pool.try_take().unwrap();
50
51 // We can also then detach the `person` from the pool, meaning it won't get
52 // recycled.
53 let person = person.detach();
54 // We can then drop that person, and see that it's not returned to the pool.
55 drop(person);
56 assert_eq!(pool.available(), 0);
57}