winsafe 0.0.27

Windows API and GUI in safe, idiomatic Rust.
Documentation
use crate::decl::*;
use crate::guard::*;
use crate::kernel::privs::*;

pub(in crate::comctl) struct HimagelistIter<'a> {
	himagelist: &'a HIMAGELIST,
	double_idx: DoubleIterIndex,
}

impl<'a> Iterator for HimagelistIter<'a> {
	type Item = HrResult<DestroyIconGuard>;

	fn next(&mut self) -> Option<Self::Item> {
		self.grab(true)
	}
}
impl<'a> DoubleEndedIterator for HimagelistIter<'a> {
	fn next_back(&mut self) -> Option<Self::Item> {
		self.grab(false)
	}
}

impl<'a> HimagelistIter<'a> {
	#[must_use]
	pub(in crate::comctl) fn new(himagelist: &'a HIMAGELIST) -> Self {
		Self {
			himagelist,
			double_idx: DoubleIterIndex::new(himagelist.GetImageCount()),
		}
	}

	fn grab(&mut self, is_front: bool) -> Option<HrResult<DestroyIconGuard>> {
		self.double_idx
			.grab(is_front, |cur_idx| match self.himagelist.ExtractIcon(cur_idx) {
				Ok(ico) => DoubleIter::Yield(Ok(ico)),
				Err(e) => DoubleIter::YieldLast(Err(e)),
			})
	}
}