Skip to content

Commit b2cb6c8

Browse files
committed
shape: Factor out common layout check
1 parent b4688b4 commit b2cb6c8

File tree

1 file changed

+22
-26
lines changed

1 file changed

+22
-26
lines changed

src/impl_methods.rs

+22-26
Original file line numberDiff line numberDiff line change
@@ -1642,14 +1642,8 @@ where
16421642
A: Clone,
16431643
S: Data,
16441644
{
1645-
if size_of_shape_checked(&shape) != Ok(self.dim.size()) {
1646-
return Err(error::incompatible_shapes(&self.dim, &shape));
1647-
}
1648-
let layout = self.layout_impl();
1649-
if order == Order::Automatic {
1650-
order = preferred_order_for_layout(layout);
1651-
}
1652-
1645+
let layout = self.layout_and_order(&shape, &mut order)?;
1646+
// safe because: the number of elements is preserved and it's contiguous
16531647
unsafe {
16541648
if layout.is(Layout::CORDER) && order == Order::RowMajor {
16551649
let strides = shape.default_strides();
@@ -1672,6 +1666,24 @@ where
16721666
}
16731667
}
16741668

1669+
/// Check if `shape` is valid for reshaping the array (in terms of number of elements),
1670+
/// and also compute the Layout of self and resolve Order if it is Automatic.
1671+
///
1672+
/// After returning successfully, `order` is either RowMajor or ColumnMajor.
1673+
fn layout_and_order<E>(&self, shape: &E, order: &mut Order) -> Result<Layout, ShapeError>
1674+
where
1675+
E: Dimension,
1676+
{
1677+
if size_of_shape_checked(shape) != Ok(self.dim.size()) {
1678+
return Err(error::incompatible_shapes(&self.dim, shape));
1679+
}
1680+
let layout = self.layout_impl();
1681+
if *order == Order::Automatic {
1682+
*order = preferred_order_for_layout(layout);
1683+
}
1684+
Ok(layout)
1685+
}
1686+
16751687
/// Transform the array into `shape`; any shape with the same number of elements is accepted,
16761688
/// but the source array or view must be in contiguous and stored in standard row-major (C) or
16771689
/// column-major (Fortran) memory order.
@@ -1707,15 +1719,7 @@ where
17071719
where
17081720
E: Dimension,
17091721
{
1710-
if size_of_shape_checked(&shape) != Ok(self.dim.size()) {
1711-
return Err(error::incompatible_shapes(&self.dim, &shape));
1712-
}
1713-
1714-
let layout = self.layout_impl();
1715-
if order == Order::Automatic {
1716-
order = preferred_order_for_layout(layout);
1717-
}
1718-
1722+
let layout = self.layout_and_order(&shape, &mut order)?;
17191723
// safe because: the number of elements is preserved and it's contiguous
17201724
unsafe {
17211725
if layout.is(Layout::CORDER) && order == Order::RowMajor {
@@ -1769,15 +1773,7 @@ where
17691773
where
17701774
E: Dimension,
17711775
{
1772-
if size_of_shape_checked(&shape) != Ok(self.dim.size()) {
1773-
return Err(error::incompatible_shapes(&self.dim, &shape));
1774-
}
1775-
1776-
let layout = self.layout_impl();
1777-
if order == Order::Automatic {
1778-
order = preferred_order_for_layout(layout);
1779-
}
1780-
1776+
let layout = self.layout_and_order(&shape, &mut order)?;
17811777
// safe because: the number of elements is preserved and it's contiguous
17821778
unsafe {
17831779
if layout.is(Layout::CORDER) && order == Order::RowMajor {

0 commit comments

Comments
 (0)