veloren_world/util/
gen_cache.rs

1use hashbrown::HashMap;
2use vek::Vec2;
3
4use super::{Sampler, StructureGen2d};
5
6pub struct StructureGenCache<T> {
7    gen: StructureGen2d,
8    // TODO: Compare performance of using binary search instead of hashmap
9    cache: HashMap<Vec2<i32>, Option<T>>,
10}
11
12impl<T> StructureGenCache<T> {
13    pub fn new(gen: StructureGen2d) -> Self {
14        Self {
15            gen,
16            cache: HashMap::new(),
17        }
18    }
19
20    pub fn get(
21        &mut self,
22        index: Vec2<i32>,
23        mut generate: impl FnMut(Vec2<i32>, u32) -> Option<T>,
24    ) -> Vec<&T> {
25        let close = self.gen.get(index);
26        for (wpos, seed) in close {
27            self.cache
28                .entry(wpos)
29                .or_insert_with(|| generate(wpos, seed));
30        }
31
32        close
33            .iter()
34            .filter_map(|(wpos, _)| self.cache.get(wpos).unwrap().as_ref())
35            .collect()
36    }
37
38    pub fn generated(&self) -> impl Iterator<Item = &T> {
39        self.cache.values().filter_map(|v| v.as_ref())
40    }
41}