@@ -43,6 +43,8 @@ pub enum ItemType {
4343 F64 ,
4444 I32 ,
4545 I64 ,
46+ U32 ,
47+ U64 ,
4648}
4749
4850pub enum PyArrayError {
@@ -51,6 +53,13 @@ pub enum PyArrayError {
5153 UnsupportedDataType ,
5254}
5355
56+ // >>> arr = numpy.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]], numpy.int32)
57+ // >>> arr.ndim
58+ // 3
59+ // >>> arr.shape
60+ // (2, 2, 2)
61+ // >>> arr.strides
62+ // (16, 8, 4)
5463pub struct PyArray {
5564 array : * mut PyArrayInterface ,
5665 position : Vec < isize > ,
@@ -60,7 +69,7 @@ pub struct PyArray {
6069}
6170
6271impl < ' a > PyArray {
63- #[ inline ( never ) ]
72+ #[ cold ]
6473 pub fn new ( ptr : * mut PyObject ) -> Result < Self , PyArrayError > {
6574 let capsule = ffi ! ( PyObject_GetAttr ( ptr, ARRAY_STRUCT_STR ) ) ;
6675 let array = unsafe { ( * ( capsule as * mut PyCapsule ) ) . pointer as * mut PyArrayInterface } ;
@@ -82,64 +91,63 @@ impl<'a> PyArray {
8291 if pyarray. kind ( ) . is_none ( ) {
8392 Err ( PyArrayError :: UnsupportedDataType )
8493 } else {
85- pyarray. build ( ) ;
94+ if pyarray. dimensions ( ) > 1 {
95+ pyarray. build ( ) ;
96+ }
8697 Ok ( pyarray)
8798 }
8899 }
89100 }
90101
91- fn from_parent ( & self , position : Vec < isize > ) -> Self {
102+ fn from_parent ( & self , position : Vec < isize > , num_children : usize ) -> Self {
92103 let mut arr = PyArray {
93104 array : self . array ,
94105 position : position,
95- children : Vec :: new ( ) ,
106+ children : Vec :: with_capacity ( num_children ) ,
96107 depth : self . depth + 1 ,
97108 capsule : self . capsule ,
98109 } ;
99110 arr. build ( ) ;
100111 arr
101112 }
102113
103- // iterator()?
104- fn build ( & mut self ) {
105- // >>> arr = numpy.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]], numpy.int32)
106- // >>> arr.ndim
107- // 3
108- // >>> arr.shape
109- // (2, 2, 2)
110- // >>> arr.strides
111- // (16, 8, 4)
112- if self . dimensions ( ) > 1 && self . depth < self . dimensions ( ) - 1 {
113- for i in 0 ..=self . shape ( ) [ self . depth ] - 1 {
114- let mut position: Vec < isize > = self . position . iter ( ) . copied ( ) . collect ( ) ;
115- position[ self . depth ] = i;
116- self . children . push ( self . from_parent ( position) )
117- }
118- }
119- }
120-
121114 fn kind ( & self ) -> Option < ItemType > {
122115 match unsafe { ( ( * self . array ) . typekind , ( * self . array ) . itemsize ) } {
123116 ( 098 , 1 ) => Some ( ItemType :: BOOL ) ,
124117 ( 102 , 4 ) => Some ( ItemType :: F32 ) ,
125118 ( 102 , 8 ) => Some ( ItemType :: F64 ) ,
126119 ( 105 , 4 ) => Some ( ItemType :: I32 ) ,
127120 ( 105 , 8 ) => Some ( ItemType :: I64 ) ,
121+ ( 117 , 4 ) => Some ( ItemType :: U32 ) ,
122+ ( 117 , 8 ) => Some ( ItemType :: U64 ) ,
128123 _ => None ,
129124 }
130125 }
131126
127+ fn build ( & mut self ) {
128+ if self . depth < self . dimensions ( ) - 1 {
129+ for i in 0 ..=self . shape ( ) [ self . depth ] - 1 {
130+ let mut position: Vec < isize > = self . position . iter ( ) . copied ( ) . collect ( ) ;
131+ position[ self . depth ] = i;
132+ let num_children: usize ;
133+ if self . depth < self . dimensions ( ) - 2 {
134+ num_children = self . shape ( ) [ self . depth + 1 ] as usize ;
135+ } else {
136+ num_children = 0 ;
137+ }
138+ self . children . push ( self . from_parent ( position, num_children) )
139+ }
140+ }
141+ }
142+
132143 fn data ( & self ) -> * mut c_void {
133- let mut offset = self
144+ let offset = self
134145 . strides ( )
135146 . iter ( )
136147 . zip ( self . position . iter ( ) . copied ( ) )
137148 . take ( self . depth )
138149 . map ( |( a, b) | a * b)
139150 . sum :: < isize > ( ) ;
140- if self . depth != self . dimensions ( ) - 1 {
141- offset += self . position [ self . depth ] * self . strides ( ) [ self . depth ] ;
142- }
143151 unsafe { ( * self . array ) . data . offset ( offset) }
144152 }
145153
@@ -169,7 +177,6 @@ impl Drop for PyArray {
169177}
170178
171179impl < ' p > Serialize for PyArray {
172- #[ inline( never) ]
173180 fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
174181 where
175182 S : Serializer ,
@@ -207,6 +214,18 @@ impl<'p> Serialize for PyArray {
207214 seq. serialize_element ( & DataTypeI32 { obj : each } ) . unwrap ( ) ;
208215 }
209216 }
217+ ItemType :: U64 => {
218+ let slice: & [ u64 ] = slice ! ( data_ptr as * const u64 , num_items) ;
219+ for & each in slice. iter ( ) {
220+ seq. serialize_element ( & DataTypeU64 { obj : each } ) . unwrap ( ) ;
221+ }
222+ }
223+ ItemType :: U32 => {
224+ let slice: & [ u32 ] = slice ! ( data_ptr as * const u32 , num_items) ;
225+ for & each in slice. iter ( ) {
226+ seq. serialize_element ( & DataTypeU32 { obj : each } ) . unwrap ( ) ;
227+ }
228+ }
210229 ItemType :: BOOL => {
211230 let slice: & [ u8 ] = slice ! ( data_ptr as * const u8 , num_items) ;
212231 for & each in slice. iter ( ) {
@@ -219,6 +238,20 @@ impl<'p> Serialize for PyArray {
219238 }
220239}
221240
241+ #[ repr( transparent) ]
242+ struct DataTypeF32 {
243+ pub obj : f32 ,
244+ }
245+
246+ impl < ' p > Serialize for DataTypeF32 {
247+ fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
248+ where
249+ S : Serializer ,
250+ {
251+ serializer. serialize_f32 ( self . obj )
252+ }
253+ }
254+
222255#[ repr( transparent) ]
223256struct DataTypeF64 {
224257 pub obj : f64 ,
@@ -234,16 +267,16 @@ impl<'p> Serialize for DataTypeF64 {
234267}
235268
236269#[ repr( transparent) ]
237- struct DataTypeF32 {
238- pub obj : f32 ,
270+ struct DataTypeI32 {
271+ pub obj : i32 ,
239272}
240273
241- impl < ' p > Serialize for DataTypeF32 {
274+ impl < ' p > Serialize for DataTypeI32 {
242275 fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
243276 where
244277 S : Serializer ,
245278 {
246- serializer. serialize_f32 ( self . obj )
279+ serializer. serialize_i32 ( self . obj )
247280 }
248281}
249282
@@ -262,16 +295,30 @@ impl<'p> Serialize for DataTypeI64 {
262295}
263296
264297#[ repr( transparent) ]
265- struct DataTypeI32 {
266- pub obj : i32 ,
298+ struct DataTypeU32 {
299+ pub obj : u32 ,
267300}
268301
269- impl < ' p > Serialize for DataTypeI32 {
302+ impl < ' p > Serialize for DataTypeU32 {
270303 fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
271304 where
272305 S : Serializer ,
273306 {
274- serializer. serialize_i32 ( self . obj )
307+ serializer. serialize_u32 ( self . obj )
308+ }
309+ }
310+
311+ #[ repr( transparent) ]
312+ struct DataTypeU64 {
313+ pub obj : u64 ,
314+ }
315+
316+ impl < ' p > Serialize for DataTypeU64 {
317+ fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
318+ where
319+ S : Serializer ,
320+ {
321+ serializer. serialize_u64 ( self . obj )
275322 }
276323}
277324
0 commit comments