Skip to content

Commit b503059

Browse files
committed
Fix the zero inner array case for Array::from(Vec)
1 parent d6e2922 commit b503059

File tree

2 files changed

+20
-6
lines changed

2 files changed

+20
-6
lines changed

src/free_functions.rs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -143,12 +143,16 @@ impl<A, V> From<Vec<V>> for Array2<A>
143143
let ptr = xs.as_mut_ptr();
144144
let len = xs.len();
145145
let cap = xs.capacity();
146+
let expand_len = len * V::len();
146147
forget(xs);
147148
unsafe {
148149
let v = if size_of::<A>() == 0 {
149-
Vec::from_raw_parts(ptr as *mut A, len * V::len(), cap)
150+
Vec::from_raw_parts(ptr as *mut A, expand_len, expand_len)
151+
} else if V::len() == 0 {
152+
Vec::new()
150153
} else {
151-
Vec::from_raw_parts(ptr as *mut A, len * V::len(), cap * V::len())
154+
let expand_cap = cap * V::len();
155+
Vec::from_raw_parts(ptr as *mut A, expand_len, expand_cap)
152156
};
153157
ArrayBase::from_shape_vec_unchecked(dim, v)
154158
}
@@ -164,14 +168,16 @@ impl<A, V, U> From<Vec<V>> for Array3<A>
164168
let ptr = xs.as_mut_ptr();
165169
let len = xs.len();
166170
let cap = xs.capacity();
171+
let expand_len = len * V::len() * U::len();
167172
forget(xs);
168173
unsafe {
169174
let v = if size_of::<A>() == 0 {
170-
Vec::from_raw_parts(ptr as *mut A, len * V::len(), cap)
175+
Vec::from_raw_parts(ptr as *mut A, expand_len, expand_len)
176+
} else if V::len() == 0 || U::len() == 0 {
177+
Vec::new()
171178
} else {
172-
let len = len * V::len() * U::len();
173-
let cap = cap * V::len() * U::len();
174-
Vec::from_raw_parts(ptr as *mut A, len, cap)
179+
let expand_cap = cap * V::len() * U::len();
180+
Vec::from_raw_parts(ptr as *mut A, expand_len, expand_cap)
175181
};
176182
ArrayBase::from_shape_vec_unchecked(dim, v)
177183
}

tests/array.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1112,3 +1112,11 @@ fn test_array_clone_same_view() {
11121112
let b = a.clone();
11131113
assert_eq!(a, b);
11141114
}
1115+
1116+
#[test]
1117+
fn test_dimension_zero() {
1118+
let a: Array2<f32> = arr2(&[[], [], []]);
1119+
assert_eq!(vec![0.; 0], a.into_raw_vec());
1120+
let a: Array3<f32> = arr3(&[[[]], [[]], [[]]]);
1121+
assert_eq!(vec![0.; 0], a.into_raw_vec());
1122+
}

0 commit comments

Comments
 (0)