@@ -99,74 +99,8 @@ impl<A> Array<A, Ix2> {
99
99
where
100
100
A : Clone ,
101
101
{
102
- let row_len = row. len ( ) ;
103
- if row_len != self . len_of ( Axis ( 1 ) ) {
104
- return Err ( ShapeError :: from_kind ( ErrorKind :: IncompatibleShape ) ) ;
105
- }
106
- let mut res_dim = self . raw_dim ( ) ;
107
- res_dim[ 0 ] += 1 ;
108
- let new_len = dimension:: size_of_shape_checked ( & res_dim) ?;
109
-
110
- // array must be c-contiguous and be "full" (have no exterior holes)
111
- if !self . is_standard_layout ( ) || self . len ( ) != self . data . len ( ) {
112
- return Err ( ShapeError :: from_kind ( ErrorKind :: IncompatibleLayout ) ) ;
113
- }
114
-
115
- unsafe {
116
- // grow backing storage and update head ptr
117
- debug_assert_eq ! ( self . data. as_ptr( ) , self . as_ptr( ) ) ;
118
- self . data . reserve ( row_len) ;
119
- self . ptr = self . data . as_nonnull_mut ( ) ; // because we are standard order
120
-
121
- // recompute strides - if the array was previously empty, it could have
122
- // zeros in strides.
123
- let strides = res_dim. default_strides ( ) ;
124
-
125
- // copy elements from view to the array now
126
- //
127
- // make a raw view with the new row
128
- // safe because the data was "full"
129
- let tail_ptr = self . data . as_end_nonnull ( ) ;
130
- let tail_view = RawArrayViewMut :: new ( tail_ptr, Ix1 ( row_len) , Ix1 ( 1 ) ) ;
131
-
132
- struct SetLenOnDrop < ' a , A : ' a > {
133
- len : usize ,
134
- data : & ' a mut OwnedRepr < A > ,
135
- }
136
-
137
- let mut length_guard = SetLenOnDrop {
138
- len : self . data . len ( ) ,
139
- data : & mut self . data ,
140
- } ;
141
-
142
- impl < A > Drop for SetLenOnDrop < ' _ , A > {
143
- fn drop ( & mut self ) {
144
- unsafe {
145
- self . data . set_len ( self . len ) ;
146
- }
147
- }
148
- }
149
-
150
- // assign the new elements
151
- Zip :: from ( tail_view) . and ( row)
152
- . for_each ( |to, from| {
153
- to. write ( from. clone ( ) ) ;
154
- length_guard. len += 1 ;
155
- } ) ;
156
-
157
- drop ( length_guard) ;
158
-
159
- // update array dimension
160
- self . strides = strides;
161
- self . dim [ 0 ] += 1 ;
162
-
163
- }
164
- // multiple assertions after pointer & dimension update
165
- debug_assert_eq ! ( self . data. len( ) , self . len( ) ) ;
166
- debug_assert_eq ! ( self . len( ) , new_len) ;
167
- debug_assert ! ( self . is_standard_layout( ) ) ;
168
-
169
- Ok ( ( ) )
102
+ let row2 = row. insert_axis ( Axis ( 0 ) ) ;
103
+ self . try_append_array ( Axis ( 0 ) , row2)
170
104
}
171
105
172
106
/// Append a column to an array with column major memory layout.
0 commit comments