mirror of
https://github.com/neocturne/MinedMap.git
synced 2025-03-04 17:23:33 +01:00
minedmap/region_group: add RegionGroup type
A generic array of 3x3 elements.
This commit is contained in:
parent
e39f48d8fe
commit
5a765c3862
2 changed files with 81 additions and 0 deletions
|
@ -1,5 +1,6 @@
|
|||
mod common;
|
||||
mod metadata_writer;
|
||||
mod region_group;
|
||||
mod region_processor;
|
||||
mod tile_mipmapper;
|
||||
mod tile_renderer;
|
||||
|
|
80
src/bin/minedmap/region_group.rs
Normal file
80
src/bin/minedmap/region_group.rs
Normal file
|
@ -0,0 +1,80 @@
|
|||
use std::iter;
|
||||
|
||||
use anyhow::Result;
|
||||
|
||||
/// A generic array of 3x3 elements
|
||||
///
|
||||
/// A RegionGroup is used to store information about a 3x3 neighbourhood of
|
||||
/// regions.
|
||||
///
|
||||
/// The center element is always populated, while the 8 adjacent elements may be None.
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
pub struct RegionGroup<T> {
|
||||
center: T,
|
||||
neighs: [Option<T>; 8],
|
||||
}
|
||||
|
||||
impl<T> RegionGroup<T> {
|
||||
pub fn new<F>(f: F) -> Result<Self>
|
||||
where
|
||||
F: Fn(i8, i8) -> Result<T>,
|
||||
{
|
||||
RegionGroup {
|
||||
center: (0, 0),
|
||||
neighs: [
|
||||
Some((-1, -1)),
|
||||
Some((-1, 0)),
|
||||
Some((-1, 1)),
|
||||
Some((0, -1)),
|
||||
Some((0, 1)),
|
||||
Some((1, -1)),
|
||||
Some((1, 0)),
|
||||
Some((1, 1)),
|
||||
],
|
||||
}
|
||||
.try_map(|(x, z)| f(x, z))
|
||||
}
|
||||
|
||||
pub fn center(&self) -> &T {
|
||||
&self.center
|
||||
}
|
||||
|
||||
pub fn get(&self, x: i8, z: i8) -> Option<&T> {
|
||||
match (x, z) {
|
||||
(0, 0) => Some(&self.center),
|
||||
(-1, -1) => self.neighs[0].as_ref(),
|
||||
(-1, 0) => self.neighs[1].as_ref(),
|
||||
(-1, 1) => self.neighs[2].as_ref(),
|
||||
(0, -1) => self.neighs[3].as_ref(),
|
||||
(0, 1) => self.neighs[4].as_ref(),
|
||||
(1, -1) => self.neighs[5].as_ref(),
|
||||
(1, 0) => self.neighs[6].as_ref(),
|
||||
(1, 1) => self.neighs[7].as_ref(),
|
||||
_ => panic!("index out of bounds"),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn map<U, F>(self, mut f: F) -> RegionGroup<U>
|
||||
where
|
||||
F: FnMut(T) -> U,
|
||||
{
|
||||
RegionGroup {
|
||||
center: f(self.center),
|
||||
neighs: self.neighs.map(|entry| entry.map(|v| f(v))),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn try_map<U, F>(self, mut f: F) -> Result<RegionGroup<U>>
|
||||
where
|
||||
F: FnMut(T) -> Result<U>,
|
||||
{
|
||||
let RegionGroup { center, neighs } = self;
|
||||
let center = f(center)?;
|
||||
let neighs = neighs.map(|entry| entry.map(|value| f(value).ok()).flatten());
|
||||
Ok(RegionGroup { center, neighs })
|
||||
}
|
||||
|
||||
pub fn iter(&self) -> impl Iterator<Item = &T> {
|
||||
iter::once(&self.center).chain(self.neighs.iter().filter_map(Option::as_ref))
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue