pub trait RecyclingItemPool<T: PoolItem>: ItemPool<T> {
// Required method
fn get_discard_pool(&mut self) -> &mut Vec<T>;
// Provided methods
fn discard_one(&mut self, item: T) { ... }
fn recycle_discarded(&mut self) { ... }
fn get_set(&mut self, size: usize) -> HashSet<T> { ... }
}Expand description
Trait for managing item pools with discard and recycling capabilities.
This trait extends ItemPool to add support for temporarily discarding items
and later recycling them back into the main pool. This is useful for scenarios
where items need to be temporarily unavailable but should be reused later.
§Examples
use itempool::{ItemPool, RecyclingItemPool};
use std::collections::HashSet;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
struct Card(u32);
struct Deck {
draw_pile: Vec<Card>,
discard_pile: Vec<Card>,
}
impl ItemPool<Card> for Deck {
fn pool(&mut self) -> &mut Vec<Card> {
&mut self.draw_pile
}
}
impl RecyclingItemPool<Card> for Deck {
fn get_discard_pool(&mut self) -> &mut Vec<Card> {
&mut self.discard_pile
}
}Required Methods§
Sourcefn get_discard_pool(&mut self) -> &mut Vec<T>
fn get_discard_pool(&mut self) -> &mut Vec<T>
Returns a mutable reference to the pool of discarded items.
A temporary storage area for items that have been removed from the main pool but might be needed again later. This allows for recycling of items without needing to re-allocate or re-initialize them.
Provided Methods§
Sourcefn discard_one(&mut self, item: T)
fn discard_one(&mut self, item: T)
Adds an item to the discard pool.
Note: This method only adds the item to the discard pool. It does not remove it from the main pool. If you need to move an item from the main pool to the discard pool, you must remove it from the main pool separately.
§Arguments
item- The item to discard
§Examples
pool.discard_one(Item(1));Examples found in repository?
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}Sourcefn recycle_discarded(&mut self)
fn recycle_discarded(&mut self)
Moves all items from the discard pool back into the main pool.
After this operation, the discard pool will be empty and all previously discarded items will be available again in the main pool.
§Examples
pool.recycle_discarded();
assert_eq!(pool.pool().len(), 2);
assert_eq!(pool.get_discard_pool().len(), 0);Examples found in repository?
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}Sourcefn get_set(&mut self, size: usize) -> HashSet<T>
fn get_set(&mut self, size: usize) -> HashSet<T>
Retrieves a set of unique items, automatically recycling discarded items first.
This method first calls recycle_discarded to ensure
all discarded items are available, then retrieves the requested number of unique
items using ItemPool::remove_set.
§Arguments
size- The number of unique items to retrieve
§Returns
A HashSet containing the unique items
§Panics
Panics in debug mode if:
- The combined pool (main + discarded) is empty after recycling
sizeexceeds the total number of available items after recycling
§Examples
let items = pool.get_set(7);
assert_eq!(items.len(), 7);Examples found in repository?
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}