@@ -313,35 +313,33 @@ impl<T: SetVal> SetVal for Vec<T> {
313313/// order of array is not guarantee.
314314impl < K : AsRef < str > , V : SetVal > SetVal for HashMap < K , V > {
315315 fn set_val ( self , val : & mut Val ) {
316- unsafe {
317- phper_array_init ( val. as_mut_ptr ( ) ) ;
318- for ( k, v) in self {
319- let k = k. as_ref ( ) ;
320- zend_hash_str_update (
321- ( * val. as_mut_ptr ( ) ) . value . arr ,
322- k. as_ptr ( ) . cast ( ) ,
323- k. len ( ) ,
324- Val :: new ( v) . as_mut_ptr ( ) ,
325- ) ;
326- }
327- }
316+ map_set_val ( self , val) ;
328317 }
329318}
330319
331320/// Setting the val to an array, which preserves item order.
332321impl < K : AsRef < str > , V : SetVal > SetVal for IndexMap < K , V > {
333322 fn set_val ( self , val : & mut Val ) {
334- unsafe {
335- phper_array_init ( val. as_mut_ptr ( ) ) ;
336- for ( k, v) in self {
337- let k = k. as_ref ( ) ;
338- zend_hash_str_update (
339- ( * val. as_mut_ptr ( ) ) . value . arr ,
340- k. as_ptr ( ) . cast ( ) ,
341- k. len ( ) ,
342- Val :: new ( v) . as_mut_ptr ( ) ,
343- ) ;
344- }
323+ map_set_val ( self , val) ;
324+ }
325+ }
326+
327+ fn map_set_val < K , V , I > ( iterator : I , val : & mut Val )
328+ where
329+ I : IntoIterator < Item = ( K , V ) > ,
330+ K : AsRef < str > ,
331+ V : SetVal ,
332+ {
333+ unsafe {
334+ phper_array_init ( val. as_mut_ptr ( ) ) ;
335+ for ( k, v) in iterator. into_iter ( ) {
336+ let k = k. as_ref ( ) ;
337+ zend_hash_str_update (
338+ ( * val. as_mut_ptr ( ) ) . value . arr ,
339+ k. as_ptr ( ) . cast ( ) ,
340+ k. len ( ) ,
341+ Val :: new ( v) . as_mut_ptr ( ) ,
342+ ) ;
345343 }
346344 }
347345}
0 commit comments