Skip to content

Commit 516294b

Browse files
committed
Add .last() and .last_mut() methods to ArrayBase
1 parent e7600e8 commit 516294b

File tree

1 file changed

+60
-0
lines changed

1 file changed

+60
-0
lines changed

src/impl_methods.rs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,66 @@ where
280280
}
281281
}
282282

283+
/// Returns a reference to the last element of the array, or `None` if it
284+
/// is empty.
285+
///
286+
/// # Example
287+
///
288+
/// ```rust
289+
/// use ndarray::Array3;
290+
///
291+
/// let mut a = Array3::<f64>::zeros([3, 4, 2]);
292+
/// a[[2, 3, 1]] = 42.;
293+
/// assert_eq!(a.last(), Some(&42.));
294+
///
295+
/// let b = Array3::<f64>::zeros([3, 0, 5]);
296+
/// assert_eq!(b.last(), None);
297+
/// ```
298+
pub fn last(&self) -> Option<&A>
299+
where
300+
S: Data,
301+
{
302+
if self.is_empty() {
303+
None
304+
} else {
305+
let mut index = self.raw_dim();
306+
for ax in 0..index.ndim() {
307+
index[ax] -= 1;
308+
}
309+
Some(unsafe { self.uget(index) })
310+
}
311+
}
312+
313+
/// Returns a mutable reference to the last element of the array, or `None`
314+
/// if it is empty.
315+
///
316+
/// # Example
317+
///
318+
/// ```rust
319+
/// use ndarray::Array3;
320+
///
321+
/// let mut a = Array3::<f64>::zeros([3, 4, 2]);
322+
/// *a.last_mut().unwrap() = 42.;
323+
/// assert_eq!(a[[2, 3, 1]], 42.);
324+
///
325+
/// let mut b = Array3::<f64>::zeros([3, 0, 5]);
326+
/// assert_eq!(b.last_mut(), None);
327+
/// ```
328+
pub fn last_mut(&mut self) -> Option<&mut A>
329+
where
330+
S: DataMut,
331+
{
332+
if self.is_empty() {
333+
None
334+
} else {
335+
let mut index = self.raw_dim();
336+
for ax in 0..index.ndim() {
337+
index[ax] -= 1;
338+
}
339+
Some(unsafe { self.uget_mut(index) })
340+
}
341+
}
342+
283343
/// Return an iterator of references to the elements of the array.
284344
///
285345
/// Elements are visited in the *logical order* of the array, which

0 commit comments

Comments
 (0)