Skip to content

Commit f569af6

Browse files
committed
FEAT: Port concatenate to append_to_array, allow A: Clone
1 parent 1b4894c commit f569af6

File tree

1 file changed

+17
-16
lines changed

1 file changed

+17
-16
lines changed

src/stacking.rs

+17-16
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
// option. This file may not be copied, modified, or distributed
77
// except according to those terms.
88

9+
use alloc::vec::Vec;
10+
11+
use crate::dimension;
912
use crate::error::{from_kind, ErrorKind, ShapeError};
1013
use crate::imp_prelude::*;
1114

@@ -68,7 +71,7 @@ where
6871
/// ```
6972
pub fn concatenate<A, D>(axis: Axis, arrays: &[ArrayView<A, D>]) -> Result<Array<A, D>, ShapeError>
7073
where
71-
A: Copy,
74+
A: Clone,
7275
D: RemoveAxis,
7376
{
7477
if arrays.is_empty() {
@@ -88,24 +91,22 @@ where
8891

8992
let stacked_dim = arrays.iter().fold(0, |acc, a| acc + a.len_of(axis));
9093
res_dim.set_axis(axis, stacked_dim);
94+
let new_len = dimension::size_of_shape_checked(&res_dim)?;
9195

92-
// we can safely use uninitialized values here because we will
93-
// overwrite every one of them.
94-
let mut res = Array::uninit(res_dim);
95-
96-
{
97-
let mut assign_view = res.view_mut();
98-
for array in arrays {
99-
let len = array.len_of(axis);
100-
let (front, rest) = assign_view.split_at(axis, len);
101-
array.assign_to(front);
102-
assign_view = rest;
103-
}
104-
debug_assert_eq!(assign_view.len(), 0);
105-
}
96+
// start with empty array with precomputed capacity
97+
res_dim.set_axis(axis, 0);
98+
let mut res;
10699
unsafe {
107-
Ok(res.assume_init())
100+
res_dim.slice_mut().swap(axis.index(), 0);
101+
res = Array::from_shape_vec_unchecked(res_dim, Vec::with_capacity(new_len));
102+
res.swap_axes(axis.index(), 0);
103+
}
104+
105+
for array in arrays {
106+
res.try_append_array(axis, array.clone())?;
108107
}
108+
debug_assert_eq!(res.len_of(axis), stacked_dim);
109+
Ok(res)
109110
}
110111

111112
#[deprecated(note="Use under the name stack instead.", since="0.15.0")]

0 commit comments

Comments
 (0)