Skip to content
Snippets Groups Projects
Unverified Commit c5c2ee6f authored by Alejandro Perea's avatar Alejandro Perea Committed by GitHub
Browse files

Fix iterator lifetimes (#201)

* Fix lifetimes; Add some tests

* Add remaining doctest
parent 5e5f7086
No related branches found
No related tags found
No related merge requests found
...@@ -90,10 +90,34 @@ map_wrapper!( ...@@ -90,10 +90,34 @@ map_wrapper!(
impl<'map> GroupLayer<'map> { impl<'map> GroupLayer<'map> {
/// Returns an iterator over the layers present in this group in display order. /// Returns an iterator over the layers present in this group in display order.
pub fn layers(&self) -> impl ExactSizeIterator<Item = Layer> { /// ## Example
self.layers /// ```
/// use tiled::Layer;
/// # use tiled::Loader;
///
/// # fn main() {
/// # let map = Loader::new()
/// # .load_tmx_map("assets/tiled_group_layers.tmx")
/// # .unwrap();
/// #
/// let nested_layers: Vec<Layer> = map
/// .layers()
/// .filter_map(|layer| match layer.layer_type() {
/// tiled::LayerType::GroupLayer(layer) => Some(layer),
/// _ => None,
/// })
/// .flat_map(|layer| layer.layers())
/// .collect();
///
/// dbg!(nested_layers);
/// # }
/// ```
pub fn layers(&self) -> impl ExactSizeIterator<Item = Layer<'map>> + 'map {
let map: &'map crate::Map = self.map;
self.data
.layers
.iter() .iter()
.map(move |layer| Layer::new(self.map, layer)) .map(move |layer| Layer::new(map, layer))
} }
/// Gets a specific layer from the group by index. /// Gets a specific layer from the group by index.
pub fn get_layer(&self, index: usize) -> Option<Layer> { pub fn get_layer(&self, index: usize) -> Option<Layer> {
......
...@@ -68,10 +68,36 @@ impl<'map> ObjectLayer<'map> { ...@@ -68,10 +68,36 @@ impl<'map> ObjectLayer<'map> {
/// Returns an iterator over the objects present in this layer, in the order they were declared /// Returns an iterator over the objects present in this layer, in the order they were declared
/// in in the TMX file. /// in in the TMX file.
///
/// ## Example
/// ```
/// # use tiled::Loader;
/// use tiled::Object;
///
/// # fn main() {
/// # let map = Loader::new()
/// # .load_tmx_map("assets/tiled_group_layers.tmx")
/// # .unwrap();
/// #
/// let spawnpoints: Vec<Object> = map
/// .layers()
/// .filter_map(|layer| match layer.layer_type() {
/// tiled::LayerType::ObjectLayer(layer) => Some(layer),
/// _ => None,
/// })
/// .flat_map(|layer| layer.objects())
/// .filter(|object| object.obj_type == "spawn")
/// .collect();
///
/// dbg!(spawnpoints);
/// # }
/// ```
#[inline] #[inline]
pub fn objects(&self) -> impl ExactSizeIterator<Item = Object> { pub fn objects(&self) -> impl ExactSizeIterator<Item = Object<'map>> + 'map {
self.objects let map: &'map crate::Map = self.map;
self.data
.objects
.iter() .iter()
.map(move |object| Object::new(self.map, object)) .map(move |object| Object::new(map, object))
} }
} }
...@@ -114,6 +114,31 @@ impl Map { ...@@ -114,6 +114,31 @@ impl Map {
} }
/// Get an iterator over all the layers in the map in ascending order of their layer index. /// Get an iterator over all the layers in the map in ascending order of their layer index.
///
/// ## Example
/// ```
/// # use tiled::Loader;
/// #
/// # fn main() {
/// # struct Renderer;
/// # impl Renderer {
/// # fn render(&self, _: tiled::TileLayer) {}
/// # }
/// # let my_renderer = Renderer;
/// # let map = Loader::new()
/// # .load_tmx_map("assets/tiled_group_layers.tmx")
/// # .unwrap();
/// #
/// let tile_layers = map.layers().filter_map(|layer| match layer.layer_type() {
/// tiled::LayerType::TileLayer(layer) => Some(layer),
/// _ => None,
/// });
///
/// for layer in tile_layers {
/// my_renderer.render(layer);
/// }
/// # }
/// ```
#[inline] #[inline]
pub fn layers(&self) -> impl ExactSizeIterator<Item = Layer> { pub fn layers(&self) -> impl ExactSizeIterator<Item = Layer> {
self.layers.iter().map(move |layer| Layer::new(self, layer)) self.layers.iter().map(move |layer| Layer::new(self, layer))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment