1- use std:: { iter:: FromIterator , vec :: IntoIter } ;
1+ use std:: iter:: FromIterator ;
22
33use super :: Value ;
4+ use indexmap:: map:: { IndexMap , IntoIter } ;
45
56/// A Object value
6- #[ derive( Debug , Clone , PartialEq ) ]
7+ #[ derive( Debug , Clone ) ]
78pub struct Object < S > {
8- key_value_list : Vec < ( String , Value < S > ) > ,
9+ key_value_list : IndexMap < String , Value < S > > ,
10+ }
11+
12+ impl < S : PartialEq > PartialEq for Object < S > {
13+ fn eq ( & self , _: & Object < S > ) -> bool {
14+ match self {
15+ Object { key_value_list } => self . key_value_list == * key_value_list,
16+ }
17+ }
918}
1019
1120impl < S > Object < S > {
1221 /// Create a new Object value with a fixed number of
1322 /// preallocated slots for field-value pairs
1423 pub fn with_capacity ( size : usize ) -> Self {
1524 Object {
16- key_value_list : Vec :: with_capacity ( size) ,
25+ key_value_list : IndexMap :: with_capacity ( size) ,
1726 }
1827 }
1928
@@ -26,39 +35,26 @@ impl<S> Object<S> {
2635 K : Into < String > ,
2736 for < ' a > & ' a str : PartialEq < K > ,
2837 {
29- if let Some ( item) = self
30- . key_value_list
31- . iter_mut ( )
32- . find ( |& & mut ( ref key, _) | ( key as & str ) == k)
33- {
34- return Some ( :: std:: mem:: replace ( & mut item. 1 , value) ) ;
35- }
36- self . key_value_list . push ( ( k. into ( ) , value) ) ;
37- None
38+ self . key_value_list . insert ( k. into ( ) , value)
3839 }
3940
4041 /// Check if the object already contains a field with the given name
4142 pub fn contains_field < K > ( & self , f : K ) -> bool
4243 where
44+ K : Into < String > ,
4345 for < ' a > & ' a str : PartialEq < K > ,
4446 {
45- self . key_value_list
46- . iter ( )
47- . any ( |& ( ref key, _) | ( key as & str ) == f)
47+ self . key_value_list . contains_key ( & f. into ( ) )
4848 }
4949
5050 /// Get a iterator over all field value pairs
51- pub fn iter ( & self ) -> impl Iterator < Item = & ( String , Value < S > ) > {
52- FieldIter {
53- inner : self . key_value_list . iter ( ) ,
54- }
51+ pub fn iter ( & self ) -> impl Iterator < Item = ( & String , & Value < S > ) > {
52+ self . key_value_list . iter ( )
5553 }
5654
5755 /// Get a iterator over all mutable field value pairs
58- pub fn iter_mut ( & mut self ) -> impl Iterator < Item = & mut ( String , Value < S > ) > {
59- FieldIterMut {
60- inner : self . key_value_list . iter_mut ( ) ,
61- }
56+ pub fn iter_mut ( & mut self ) -> impl Iterator < Item = ( & String , & mut Value < S > ) > {
57+ self . key_value_list . iter_mut ( )
6258 }
6359
6460 /// Get the current number of fields
@@ -69,29 +65,16 @@ impl<S> Object<S> {
6965 /// Get the value for a given field
7066 pub fn get_field_value < K > ( & self , key : K ) -> Option < & Value < S > >
7167 where
68+ K : Into < String > ,
7269 for < ' a > & ' a str : PartialEq < K > ,
7370 {
74- self . key_value_list
75- . iter ( )
76- . find ( |& & ( ref k, _) | ( k as & str ) == key)
77- . map ( |& ( _, ref value) | value)
78- }
79-
80- /// Recursively sort all keys by field.
81- pub fn sort_by_field ( & mut self ) {
82- self . key_value_list
83- . sort_by ( |( key1, _) , ( key2, _) | key1. cmp ( key2) ) ;
84- for ( _, ref mut value) in & mut self . key_value_list {
85- if let Value :: Object ( ref mut o) = value {
86- o. sort_by_field ( ) ;
87- }
88- }
71+ self . key_value_list . get ( & key. into ( ) )
8972 }
9073}
9174
9275impl < S > IntoIterator for Object < S > {
9376 type Item = ( String , Value < S > ) ;
94- type IntoIter = IntoIter < Self :: Item > ;
77+ type IntoIter = IntoIter < String , Value < S > > ;
9578
9679 fn into_iter ( self ) -> Self :: IntoIter {
9780 self . key_value_list . into_iter ( )
@@ -115,37 +98,11 @@ where
11598 {
11699 let iter = iter. into_iter ( ) ;
117100 let mut ret = Self {
118- key_value_list : Vec :: with_capacity ( iter. size_hint ( ) . 0 ) ,
101+ key_value_list : IndexMap :: with_capacity ( iter. size_hint ( ) . 0 ) ,
119102 } ;
120103 for ( k, v) in iter {
121104 ret. add_field ( k, v) ;
122105 }
123106 ret
124107 }
125108}
126-
127- #[ doc( hidden) ]
128- pub struct FieldIter < ' a , S : ' a > {
129- inner : :: std:: slice:: Iter < ' a , ( String , Value < S > ) > ,
130- }
131-
132- impl < ' a , S > Iterator for FieldIter < ' a , S > {
133- type Item = & ' a ( String , Value < S > ) ;
134-
135- fn next ( & mut self ) -> Option < Self :: Item > {
136- self . inner . next ( )
137- }
138- }
139-
140- #[ doc( hidden) ]
141- pub struct FieldIterMut < ' a , S : ' a > {
142- inner : :: std:: slice:: IterMut < ' a , ( String , Value < S > ) > ,
143- }
144-
145- impl < ' a , S > Iterator for FieldIterMut < ' a , S > {
146- type Item = & ' a mut ( String , Value < S > ) ;
147-
148- fn next ( & mut self ) -> Option < Self :: Item > {
149- self . inner . next ( )
150- }
151- }
0 commit comments