1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
use crate::imp_prelude::*;
/// Methods specific to `Array0`.
///
/// ***See also all methods for [`ArrayBase`]***
///
/// [`ArrayBase`]: struct.ArrayBase.html
impl<A> Array<A, Ix0> {
/// Returns the single element in the array without cloning it.
///
/// ```
/// use ndarray::{arr0, Array0};
///
/// // `Foo` doesn't implement `Clone`.
/// #[derive(Debug, Eq, PartialEq)]
/// struct Foo;
///
/// let array: Array0<Foo> = arr0(Foo);
/// let scalar: Foo = array.into_scalar();
/// assert_eq!(scalar, Foo);
/// ```
pub fn into_scalar(self) -> A {
let size = ::std::mem::size_of::<A>();
if size == 0 {
// Any index in the `Vec` is fine since all elements are identical.
self.data.into_vec().remove(0)
} else {
// Find the index in the `Vec` corresponding to `self.ptr`.
// (This is necessary because the element in the array might not be
// the first element in the `Vec`, such as if the array was created
// by `array![1, 2, 3, 4].slice_move(s![2])`.)
let first = self.ptr.as_ptr() as usize;
let base = self.data.as_ptr() as usize;
let index = (first - base) / size;
debug_assert_eq!((first - base) % size, 0);
// Remove the element at the index and return it.
self.data.into_vec().remove(index)
}
}
}
/// Methods specific to `Array`.
///
/// ***See also all methods for [`ArrayBase`]***
///
/// [`ArrayBase`]: struct.ArrayBase.html
impl<A, D> Array<A, D>
where
D: Dimension,
{
/// Return a vector of the elements in the array, in the way they are
/// stored internally.
///
/// If the array is in standard memory layout, the logical element order
/// of the array (`.iter()` order) and of the returned vector will be the same.
pub fn into_raw_vec(self) -> Vec<A> {
self.data.into_vec()
}
}