1
- use std:: {
2
- borrow:: Borrow ,
3
- hash:: { Hash , Hasher } ,
4
- mem, usize,
5
- } ;
6
-
7
1
use std:: collections:: HashMap ;
2
+ use std:: marker:: PhantomData ;
3
+ use std:: { borrow:: Borrow , hash:: Hash , mem, usize} ;
8
4
5
+ use crate :: arr:: SkipIter ;
9
6
use crate :: { KeyRef , KeyWrapper , SkipList , SkipNode } ;
10
7
11
8
struct Context < K : Hash > {
@@ -52,7 +49,7 @@ impl<K: Hash> PartialOrd for Context<K> {
52
49
/// val.add_or_update("aa", 10);
53
50
/// val.add_or_update("bb", 12);
54
51
/// assert_eq!(val.len(), 2);
55
- /// assert_eq!(val.rank(&"bb"), 0 );
52
+ /// assert_eq!(val.rank(&"bb"), 2 );
56
53
/// val.add_or_update("bb", 9);
57
54
/// assert_eq!(val.rank(&"bb"), 1);
58
55
/// assert_eq!(val.len(), 2);
@@ -89,11 +86,42 @@ impl<K: Hash + Eq> ZSet<K> {
89
86
self . dict . len ( )
90
87
}
91
88
89
+
90
+ /// 清除集合
91
+ ///
92
+ /// # Examples
93
+ ///
94
+ /// ```
95
+ /// use algorithm::ZSet;
96
+ /// fn main() {
97
+ /// let mut val = ZSet::new();
98
+ /// val.add_or_update("aa", 10);
99
+ /// val.add_or_update("bb", 12);
100
+ /// assert_eq!(val.len(), 2);
101
+ /// val.clear();
102
+ /// assert_eq!(val.len(), 0);
103
+ /// }
104
+ /// ```
105
+ ///
92
106
pub fn clear ( & mut self ) {
93
107
self . dict . clear ( ) ;
94
108
self . zsl . clear ( ) ;
95
109
}
96
110
111
+ /// 包含键值
112
+ ///
113
+ /// # Examples
114
+ ///
115
+ /// ```
116
+ /// use algorithm::ZSet;
117
+ /// fn main() {
118
+ /// let mut val = ZSet::new();
119
+ /// val.add_or_update("aa", 10);
120
+ /// val.add_or_update("bb", 12);
121
+ /// assert_eq!(val.contains_key(&"aa"), true);
122
+ /// }
123
+ /// ```
124
+ ///
97
125
pub fn contains_key < Q > ( & mut self , k : & Q ) -> bool
98
126
where
99
127
K : Borrow < Q > ,
@@ -102,6 +130,21 @@ impl<K: Hash + Eq> ZSet<K> {
102
130
self . dict . contains_key ( KeyWrapper :: from_ref ( k) )
103
131
}
104
132
133
+
134
+ /// 获取排序值
135
+ ///
136
+ /// # Examples
137
+ ///
138
+ /// ```
139
+ /// use algorithm::ZSet;
140
+ /// fn main() {
141
+ /// let mut val = ZSet::new();
142
+ /// val.add_or_update("aa", 10);
143
+ /// val.add_or_update("bb", 12);
144
+ /// assert_eq!(val.len(), 2);
145
+ ///
146
+ /// }
147
+ /// ```
105
148
pub fn rank < Q > ( & mut self , k : & Q ) -> usize
106
149
where
107
150
K : Borrow < Q > ,
@@ -113,7 +156,22 @@ impl<K: Hash + Eq> ZSet<K> {
113
156
0
114
157
}
115
158
116
- pub fn erase < Q > ( & mut self , k : & Q ) -> bool
159
+ /// 删除元素
160
+ ///
161
+ /// # Examples
162
+ ///
163
+ /// ```
164
+ /// use algorithm::ZSet;
165
+ /// fn main() {
166
+ /// let mut val = ZSet::new();
167
+ /// val.add_or_update("aa", 10);
168
+ /// val.add_or_update("bb", 12);
169
+ /// assert_eq!(val.len(), 2);
170
+ /// assert!(val.remove(&"bb"));
171
+ /// assert_eq!(val.len(), 1);
172
+ /// }
173
+ /// ```
174
+ pub fn remove < Q > ( & mut self , k : & Q ) -> bool
117
175
where
118
176
K : Borrow < Q > ,
119
177
Q : Hash + Eq + ?Sized ,
@@ -125,6 +183,23 @@ impl<K: Hash + Eq> ZSet<K> {
125
183
}
126
184
}
127
185
186
+ /// 添加或者更新值
187
+ ///
188
+ /// # Examples
189
+ ///
190
+ /// ```
191
+ /// use algorithm::ZSet;
192
+ /// fn main() {
193
+ /// let mut val = ZSet::new();
194
+ /// val.add_or_update("aa", 10);
195
+ /// val.add_or_update("bb", 12);
196
+ /// assert_eq!(val.len(), 2);
197
+ /// val.add_or_update("bb", 14);
198
+ /// assert_eq!(val.len(), 2);
199
+ /// assert_eq!(val.score(&"bb"), 14);
200
+ ///
201
+ /// }
202
+ /// ```
128
203
pub fn add_or_update ( & mut self , key : K , mut score : isize ) {
129
204
if self . max_count == 0 || self . max_count == self . dict . len ( ) {
130
205
return ;
@@ -140,18 +215,32 @@ impl<K: Hash + Eq> ZSet<K> {
140
215
timestamp : 0 ,
141
216
} ;
142
217
143
- let key_ref = KeyRef :: new ( unsafe { & * context. key . as_ptr ( ) } ) ;
144
-
145
-
218
+ let key_ref = KeyRef :: new ( context. key . as_ptr ( ) ) ;
146
219
if let Some ( v) = self . dict . remove ( & key_ref) {
147
220
let ret = self . zsl . update ( unsafe { & ( * v) . score } , context) ;
221
+ let key_ref = KeyRef :: new ( unsafe { ( * ret) . score . key . as_ptr ( ) } ) ;
148
222
self . dict . insert ( key_ref, ret) ;
149
223
} else {
150
224
let ret = self . zsl . insert ( context) ;
225
+ let key_ref = KeyRef :: new ( unsafe { ( * ret) . score . key . as_ptr ( ) } ) ;
151
226
self . dict . insert ( key_ref, ret) ;
152
227
}
153
228
}
154
229
230
+ /// 获取score值
231
+ ///
232
+ /// # Examples
233
+ ///
234
+ /// ```
235
+ /// use algorithm::ZSet;
236
+ /// fn main() {
237
+ /// let mut val = ZSet::new();
238
+ /// val.add_or_update("aa", 10);
239
+ /// val.add_or_update("bb", 12);
240
+ /// assert_eq!(val.score(&"bb"), 12);
241
+ ///
242
+ /// }
243
+ /// ```
155
244
pub fn score < Q > ( & mut self , k : & Q ) -> isize
156
245
where
157
246
K : Borrow < Q > ,
@@ -169,3 +258,10 @@ impl<K: Hash + Eq> Drop for ZSet<K> {
169
258
self . clear ( ) ;
170
259
}
171
260
}
261
+
262
+
263
+ // pub struct Iter<'a, K: 'a + Default + PartialEq + PartialOrd> {
264
+ // len: usize,
265
+ // iter: SkipIter<&'a K>,
266
+ // data: PhantomData<&'a ()>,
267
+ // }
0 commit comments