7
7
// except according to those terms.
8
8
9
9
use std:: slice;
10
+ use std:: mem:: { size_of, forget} ;
10
11
11
12
use imp_prelude:: * ;
12
13
@@ -121,21 +122,65 @@ impl_arr_init!(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,);
121
122
/// a.shape() == [2, 3]
122
123
/// );
123
124
/// ```
124
- pub fn arr2 < A : Clone , V : FixedInitializer < Elem = A > > ( xs : & [ V ] ) -> Array2 < A > {
125
- let ( m, n) = ( xs. len ( ) , V :: len ( ) ) ;
126
- let dim = Ix2 ( m, n) ;
127
- let mut result = Vec :: < A > :: with_capacity ( dim. size ( ) ) ;
128
- for snd in xs {
129
- result. extend_from_slice ( snd. as_init_slice ( ) ) ;
125
+ pub fn arr2 < A : Clone , V : FixedInitializer < Elem = A > > ( xs : & [ V ] ) -> Array2 < A >
126
+ where V : Clone ,
127
+ {
128
+ Array2 :: from ( xs. to_vec ( ) )
129
+ }
130
+
131
+ impl < A > From < Vec < A > > for Array1 < A > {
132
+ fn from ( xs : Vec < A > ) -> Self {
133
+ Array1 :: from_vec ( xs)
130
134
}
131
- unsafe {
132
- ArrayBase :: from_shape_vec_unchecked ( dim, result)
135
+ }
136
+
137
+ impl < A , V > From < Vec < V > > for Array2 < A >
138
+ where V : FixedInitializer < Elem = A >
139
+ {
140
+ fn from ( mut xs : Vec < V > ) -> Self {
141
+ let ( m, n) = ( xs. len ( ) , V :: len ( ) ) ;
142
+ let dim = Ix2 ( m, n) ;
143
+ let ptr = xs. as_mut_ptr ( ) ;
144
+ let len = xs. len ( ) ;
145
+ let cap = xs. capacity ( ) ;
146
+ forget ( xs) ;
147
+ unsafe {
148
+ let v = if size_of :: < A > ( ) == 0 {
149
+ Vec :: from_raw_parts ( ptr as * mut A , len * V :: len ( ) , cap)
150
+ } else {
151
+ Vec :: from_raw_parts ( ptr as * mut A , len * V :: len ( ) , cap * V :: len ( ) )
152
+ } ;
153
+ ArrayBase :: from_shape_vec_unchecked ( dim, v)
154
+ }
155
+ }
156
+ }
157
+
158
+ impl < A , V , U > From < Vec < V > > for Array3 < A >
159
+ where V : FixedInitializer < Elem =U > ,
160
+ U : FixedInitializer < Elem =A >
161
+ {
162
+ fn from ( mut xs : Vec < V > ) -> Self {
163
+ let dim = Ix3 ( xs. len ( ) , V :: len ( ) , U :: len ( ) ) ;
164
+ let ptr = xs. as_mut_ptr ( ) ;
165
+ let len = xs. len ( ) ;
166
+ let cap = xs. capacity ( ) ;
167
+ forget ( xs) ;
168
+ unsafe {
169
+ let v = if size_of :: < A > ( ) == 0 {
170
+ Vec :: from_raw_parts ( ptr as * mut A , len * V :: len ( ) , cap)
171
+ } 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)
175
+ } ;
176
+ ArrayBase :: from_shape_vec_unchecked ( dim, v)
177
+ }
133
178
}
134
179
}
135
180
136
181
/// Create a two-dimensional array with elements from `xs`.
137
182
///
138
- pub fn rcarr2 < A : Clone , V : FixedInitializer < Elem = A > > ( xs : & [ V ] ) -> RcArray < A , Ix2 > {
183
+ pub fn rcarr2 < A : Clone , V : Clone + FixedInitializer < Elem = A > > ( xs : & [ V ] ) -> RcArray < A , Ix2 > {
139
184
arr2 ( xs) . into_shared ( )
140
185
}
141
186
@@ -158,22 +203,16 @@ pub fn rcarr2<A: Clone, V: FixedInitializer<Elem = A>>(xs: &[V]) -> RcArray<A, I
158
203
/// ```
159
204
pub fn arr3 < A : Clone , V : FixedInitializer < Elem =U > , U : FixedInitializer < Elem =A > > ( xs : & [ V ] )
160
205
-> Array3 < A >
206
+ where V : Clone ,
207
+ U : Clone ,
161
208
{
162
- let dim = Ix3 ( xs. len ( ) , V :: len ( ) , U :: len ( ) ) ;
163
- let mut result = Vec :: < A > :: with_capacity ( dim. size ( ) ) ;
164
- for snd in xs {
165
- for thr in snd. as_init_slice ( ) {
166
- result. extend_from_slice ( thr. as_init_slice ( ) ) ;
167
- }
168
- }
169
- unsafe {
170
- ArrayBase :: from_shape_vec_unchecked ( dim, result)
171
- }
209
+ Array3 :: from ( xs. to_vec ( ) )
172
210
}
173
211
174
212
/// Create a three-dimensional array with elements from `xs`.
175
213
pub fn rcarr3 < A : Clone , V : FixedInitializer < Elem =U > , U : FixedInitializer < Elem =A > > ( xs : & [ V ] )
176
214
-> RcArray < A , Ix3 >
215
+ where V : Clone , U : Clone ,
177
216
{
178
217
arr3 ( xs) . into_shared ( )
179
218
}
0 commit comments