enemy_example/
enemy_example.rs

1use itempool::{ItemPool, RecyclingItemPool};
2
3// Define your item type (must satisfy PoolItem requirements)
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
5struct EntityId(u32);
6
7// Create a struct to hold your pool data
8#[derive(Debug)]
9struct EnemyPool {
10    available_enemies: Vec<EntityId>,
11    temporarily_disabled: Vec<EntityId>,
12}
13
14impl EnemyPool {
15    fn new(count: u32) -> Self {
16        EnemyPool {
17            available_enemies: (0..count).map(EntityId).collect(),
18            temporarily_disabled: Vec::new(),
19        }
20    }
21}
22
23// Implement the ItemPool trait for your pool struct
24impl ItemPool<EntityId> for EnemyPool {
25    fn pool(&mut self) -> &mut Vec<EntityId> {
26        &mut self.available_enemies
27    }
28}
29
30// Implement the RecyclingItemPool trait
31impl RecyclingItemPool<EntityId> for EnemyPool {
32    fn get_discard_pool(&mut self) -> &mut Vec<EntityId> {
33        &mut self.temporarily_disabled
34    }
35}
36
37fn main() {
38    let mut enemy_pool = EnemyPool::new(10); // Pool contains EntityId(0) to EntityId(9)
39    println!("Initial Pool: {:?}", enemy_pool.pool()); // [EntityId(0), ..., EntityId(9)]
40    println!("Initial Discard: {:?}", enemy_pool.get_discard_pool()); // []
41    println!("---");
42
43    // Get a single enemy
44    let enemy1 = enemy_pool.remove_one();
45    println!("Got one enemy: {:?}", enemy1);
46    println!("Pool after remove_one: {:?}", enemy_pool.pool());
47    println!(
48        "Discard after remove_one: {:?}",
49        enemy_pool.get_discard_pool()
50    );
51    println!("---");
52
53    // Get a set of enemies
54    let enemy_squad = enemy_pool.remove_set(3);
55    println!("Got enemy squad: {:?}", enemy_squad);
56    println!("Pool after remove_set: {:?}", enemy_pool.pool());
57    println!(
58        "Discard after remove_set: {:?}",
59        enemy_pool.get_discard_pool()
60    );
61    println!("---");
62
63    // Manually discard an enemy
64    let enemy_to_disable = EntityId(5);
65    enemy_pool.discard_one(enemy_to_disable);
66    println!("Discarded enemy ID: {:?}", enemy_to_disable);
67    println!("Pool after discard_one: {:?}", enemy_pool.pool());
68    println!(
69        "Discard after discard_one: {:?}",
70        enemy_pool.get_discard_pool()
71    ); // Contains EntityId(5)
72    println!("---");
73
74    // Get another enemy using get_set - this will trigger recycling first
75    println!("Calling get_set, which will recycle first...");
76    let enemy2 = enemy_pool.get_set(1);
77    println!("Got another enemy: {:?}", enemy2);
78    println!("Pool after recycle + get_set: {:?}", enemy_pool.pool());
79    println!(
80        "Discard after recycle + get_set: {:?}",
81        enemy_pool.get_discard_pool()
82    ); // Empty now
83    println!("---");
84
85    // Demonstrate manual recycling
86    enemy_pool.discard_one(EntityId(7));
87    enemy_pool.discard_one(EntityId(8));
88    println!("Discarded 2 more enemies");
89    println!("Pool before recycle: {:?}", enemy_pool.pool());
90    println!(
91        "Discard before recycle: {:?}",
92        enemy_pool.get_discard_pool()
93    );
94
95    enemy_pool.recycle_discarded();
96    println!("Pool after manual recycle: {:?}", enemy_pool.pool());
97    println!(
98        "Discard after manual recycle: {:?}",
99        enemy_pool.get_discard_pool()
100    );
101}