1
- use std:: { iter:: FromIterator , vec :: IntoIter } ;
1
+ use std:: iter:: FromIterator ;
2
2
3
3
use super :: Value ;
4
+ use indexmap:: map:: { IndexMap , IntoIter } ;
4
5
5
6
/// A Object value
6
- #[ derive( Debug , Clone , PartialEq ) ]
7
+ #[ derive( Debug , Clone ) ]
7
8
pub 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
+ }
9
18
}
10
19
11
20
impl < S > Object < S > {
12
21
/// Create a new Object value with a fixed number of
13
22
/// preallocated slots for field-value pairs
14
23
pub fn with_capacity ( size : usize ) -> Self {
15
24
Object {
16
- key_value_list : Vec :: with_capacity ( size) ,
25
+ key_value_list : IndexMap :: with_capacity ( size) ,
17
26
}
18
27
}
19
28
@@ -26,39 +35,26 @@ impl<S> Object<S> {
26
35
K : Into < String > ,
27
36
for < ' a > & ' a str : PartialEq < K > ,
28
37
{
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)
38
39
}
39
40
40
41
/// Check if the object already contains a field with the given name
41
42
pub fn contains_field < K > ( & self , f : K ) -> bool
42
43
where
44
+ K : Into < String > ,
43
45
for < ' a > & ' a str : PartialEq < K > ,
44
46
{
45
- self . key_value_list
46
- . iter ( )
47
- . any ( |& ( ref key, _) | ( key as & str ) == f)
47
+ self . key_value_list . contains_key ( & f. into ( ) )
48
48
}
49
49
50
50
/// 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 ( )
55
53
}
56
54
57
55
/// 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 ( )
62
58
}
63
59
64
60
/// Get the current number of fields
@@ -69,29 +65,16 @@ impl<S> Object<S> {
69
65
/// Get the value for a given field
70
66
pub fn get_field_value < K > ( & self , key : K ) -> Option < & Value < S > >
71
67
where
68
+ K : Into < String > ,
72
69
for < ' a > & ' a str : PartialEq < K > ,
73
70
{
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 ( ) )
89
72
}
90
73
}
91
74
92
75
impl < S > IntoIterator for Object < S > {
93
76
type Item = ( String , Value < S > ) ;
94
- type IntoIter = IntoIter < Self :: Item > ;
77
+ type IntoIter = IntoIter < String , Value < S > > ;
95
78
96
79
fn into_iter ( self ) -> Self :: IntoIter {
97
80
self . key_value_list . into_iter ( )
@@ -115,37 +98,11 @@ where
115
98
{
116
99
let iter = iter. into_iter ( ) ;
117
100
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 ) ,
119
102
} ;
120
103
for ( k, v) in iter {
121
104
ret. add_field ( k, v) ;
122
105
}
123
106
ret
124
107
}
125
108
}
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