Skip to content

Commit

Permalink
Fix iterator lifetimes (#201)
Browse files Browse the repository at this point in the history
* Fix lifetimes; Add some tests

* Add remaining doctest
  • Loading branch information
aleokdev authored Mar 24, 2022
1 parent 5e5f708 commit c5c2ee6
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 6 deletions.
30 changes: 27 additions & 3 deletions src/layers/group.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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> {
Expand Down
32 changes: 29 additions & 3 deletions src/layers/object.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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))
}
}
25 changes: 25 additions & 0 deletions src/map.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down

0 comments on commit c5c2ee6

Please sign in to comment.