use std::vec;
use crate::{
error::{Error, Result},
utils::IVec2,
Sprite,
};
#[derive(Default, Debug, Clone)]
pub struct UnorderedSpriteSheet {
sprites: Vec<Sprite>,
size: IVec2,
}
impl UnorderedSpriteSheet {
pub fn new(sprites: Vec<Sprite>) -> Result<Self> {
let mut sprites_iter = sprites.iter();
let size = sprites_iter
.next()
.ok_or(Error::EmptyUnorderedSpriteSheet)?
.size();
for sprite in sprites_iter {
if sprite.size() != size {
return Err(Error::MismatchedSpriteSize {
required: size,
provided: sprite.size(),
});
}
}
Ok(Self { sprites, size })
}
#[inline(always)]
pub fn len(&self) -> usize {
self.sprites.len()
}
pub fn is_empty(&self) -> bool {
self.sprites.is_empty()
}
#[inline(always)]
pub fn size(&self) -> IVec2 {
self.size
}
#[inline(always)]
pub fn inner(&self) -> &Vec<Sprite> {
&self.sprites
}
#[inline(always)]
pub fn inner_mut(&mut self) -> &mut Vec<Sprite> {
&mut self.sprites
}
pub fn into_inner(self) -> Vec<Sprite> {
self.sprites
}
}
impl IntoIterator for UnorderedSpriteSheet {
type Item = Sprite;
type IntoIter = vec::IntoIter<Sprite>;
fn into_iter(self) -> Self::IntoIter {
self.sprites.into_iter()
}
}