use std::slice;
use imp_prelude::*;
pub fn arr0<A>(x: A) -> OwnedArray<A, ()>
{
unsafe { ArrayBase::from_shape_vec_unchecked((), vec![x]) }
}
pub fn arr1<A: Clone>(xs: &[A]) -> OwnedArray<A, Ix> {
ArrayBase::from_vec(xs.to_vec())
}
pub fn rcarr1<A: Clone>(xs: &[A]) -> RcArray<A, Ix> {
arr1(xs).into_shared()
}
pub fn aview0<A>(x: &A) -> ArrayView<A, ()> {
unsafe { ArrayView::new_(x, (), ()) }
}
pub fn aview1<A>(xs: &[A]) -> ArrayView<A, Ix> {
ArrayView::from(xs)
}
pub fn aview2<A, V: FixedInitializer<Elem=A>>(xs: &[V]) -> ArrayView<A, (Ix, Ix)> {
let cols = V::len();
let rows = xs.len();
let data = unsafe {
slice::from_raw_parts(xs.as_ptr() as *const A, cols * rows)
};
let dim = (rows as Ix, cols as Ix);
unsafe {
let strides = dim.default_strides();
ArrayView::new_(data.as_ptr(), dim, strides)
}
}
pub fn aview_mut1<A>(xs: &mut [A]) -> ArrayViewMut<A, Ix> {
ArrayViewMut::from(xs)
}
pub unsafe trait FixedInitializer {
type Elem;
fn as_init_slice(&self) -> &[Self::Elem];
fn len() -> usize;
}
macro_rules! impl_arr_init {
(__impl $n: expr) => (
unsafe impl<T> FixedInitializer for [T; $n] {
type Elem = T;
fn as_init_slice(&self) -> &[T] { self }
fn len() -> usize { $n }
}
);
() => ();
($n: expr, $($m:expr,)*) => (
impl_arr_init!(__impl $n);
impl_arr_init!($($m,)*);
)
}
impl_arr_init!(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,);
pub fn arr2<A: Clone, V: FixedInitializer<Elem = A>>(xs: &[V]) -> OwnedArray<A, (Ix, Ix)> {
let (m, n) = (xs.len() as Ix, V::len() as Ix);
let dim = (m, n);
let mut result = Vec::<A>::with_capacity(dim.size());
for snd in xs {
result.extend_from_slice(snd.as_init_slice());
}
unsafe {
ArrayBase::from_shape_vec_unchecked(dim, result)
}
}
pub fn rcarr2<A: Clone, V: FixedInitializer<Elem = A>>(xs: &[V]) -> RcArray<A, (Ix, Ix)> {
arr2(xs).into_shared()
}
pub fn arr3<A: Clone, V: FixedInitializer<Elem=U>, U: FixedInitializer<Elem=A>>(xs: &[V])
-> OwnedArray<A, (Ix, Ix, Ix)>
{
let dim = (xs.len() as Ix, V::len() as Ix, U::len() as Ix);
let mut result = Vec::<A>::with_capacity(dim.size());
for snd in xs {
for thr in snd.as_init_slice() {
result.extend_from_slice(thr.as_init_slice());
}
}
unsafe {
ArrayBase::from_shape_vec_unchecked(dim, result)
}
}
pub fn rcarr3<A: Clone, V: FixedInitializer<Elem=U>, U: FixedInitializer<Elem=A>>(xs: &[V])
-> RcArray<A, (Ix, Ix, Ix)>
{
arr3(xs).into_shared()
}