From c5c2ee6f78b3ab9b2a0a1bbfc2ffd987fed087ec Mon Sep 17 00:00:00 2001 From: Alejandro Perea <alexpro820@gmail.com> Date: Thu, 24 Mar 2022 15:19:25 +0100 Subject: [PATCH] Fix iterator lifetimes (#201) * Fix lifetimes; Add some tests * Add remaining doctest --- src/layers/group.rs | 30 +++++++++++++++++++++++++++--- src/layers/object.rs | 32 +++++++++++++++++++++++++++++--- src/map.rs | 25 +++++++++++++++++++++++++ 3 files changed, 81 insertions(+), 6 deletions(-) diff --git a/src/layers/group.rs b/src/layers/group.rs index b0f9ede..f13de1d 100644 --- a/src/layers/group.rs +++ b/src/layers/group.rs @@ -90,10 +90,34 @@ map_wrapper!( impl<'map> GroupLayer<'map> { /// Returns an iterator over the layers present in this group in display order. - pub fn layers(&self) -> impl ExactSizeIterator<Item = Layer> { - self.layers + /// ## Example + /// ``` + /// 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() - .map(move |layer| Layer::new(self.map, layer)) + .map(move |layer| Layer::new(map, layer)) } /// Gets a specific layer from the group by index. pub fn get_layer(&self, index: usize) -> Option<Layer> { diff --git a/src/layers/object.rs b/src/layers/object.rs index 55aca66..391d7d4 100644 --- a/src/layers/object.rs +++ b/src/layers/object.rs @@ -68,10 +68,36 @@ impl<'map> ObjectLayer<'map> { /// Returns an iterator over the objects present in this layer, in the order they were declared /// 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] - pub fn objects(&self) -> impl ExactSizeIterator<Item = Object> { - self.objects + pub fn objects(&self) -> impl ExactSizeIterator<Item = Object<'map>> + 'map { + let map: &'map crate::Map = self.map; + self.data + .objects .iter() - .map(move |object| Object::new(self.map, object)) + .map(move |object| Object::new(map, object)) } } diff --git a/src/map.rs b/src/map.rs index a8903ee..2dba8fc 100644 --- a/src/map.rs +++ b/src/map.rs @@ -114,6 +114,31 @@ impl Map { } /// 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] pub fn layers(&self) -> impl ExactSizeIterator<Item = Layer> { self.layers.iter().map(move |layer| Layer::new(self, layer)) -- GitLab