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() } }