use crate::generator::{BlockPosition, Generator};
use std::mem::{transmute, MaybeUninit};
#[doc = include_str!("../../examples/generate_strongholds.rs")]
#[derive(Debug)]
pub struct StrongholdIter<'generator> {
generator: &'generator Generator,
inner: cubiomes_sys::StrongholdIter,
strongholds_left: usize,
}
impl<'generator> Generator {
#[must_use]
pub fn strongholds(&'generator self) -> StrongholdIter<'generator> {
let mut sh_iter: MaybeUninit<cubiomes_sys::StrongholdIter> = MaybeUninit::uninit();
unsafe {
cubiomes_sys::initFirstStronghold(
sh_iter.as_mut_ptr(),
self.minecraft_version() as i32,
transmute::<i64, u64>(self.seed()),
);
}
let strongholds_left =
unsafe { cubiomes_sys::nextStronghold(sh_iter.as_mut_ptr(), self.as_ptr()) } as usize
- 1;
StrongholdIter {
generator: self,
inner: unsafe { sh_iter.assume_init() },
strongholds_left,
}
}
}
impl Iterator for StrongholdIter<'_> {
type Item = BlockPosition;
fn next(&mut self) -> Option<Self::Item> {
if 0 == self.strongholds_left {
return None;
}
self.strongholds_left =
unsafe { cubiomes_sys::nextStronghold(&mut self.inner, self.generator.as_ptr()) }
as usize
- 1;
Some(self.inner.pos.into())
}
fn size_hint(&self) -> (usize, Option<usize>) {
(self.strongholds_left, Some(self.strongholds_left))
}
}