RecyclingItemPool

Trait RecyclingItemPool 

Source
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§

Source

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§

Source

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?
examples/enemy_example.rs (line 65)
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}
Source

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?
examples/enemy_example.rs (line 95)
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}
Source

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
  • size exceeds the total number of available items after recycling
§Examples
let items = pool.get_set(7);
assert_eq!(items.len(), 7);
Examples found in repository?
examples/enemy_example.rs (line 76)
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}

Implementors§