1
1
use std:: collections:: HashMap ;
2
2
use std:: marker:: PhantomData ;
3
+ use std:: time:: { SystemTime , UNIX_EPOCH } ;
3
4
use std:: { borrow:: Borrow , hash:: Hash , mem, usize} ;
4
5
5
6
use crate :: arr:: SkipIter ;
@@ -38,7 +39,7 @@ impl<K: Hash> PartialOrd for Context<K> {
38
39
}
39
40
}
40
41
41
- /// 一种可排序的Set类型
42
+ /// 一种可排序的Set类型, 可以高效的对评分进行排序,
42
43
///
43
44
/// # Examples
44
45
///
@@ -81,12 +82,11 @@ impl<K: Hash + Eq> ZSet<K> {
81
82
}
82
83
}
83
84
84
- pub fn len ( & mut self ) -> usize {
85
+ pub fn len ( & self ) -> usize {
85
86
assert ! ( self . dict. len( ) == self . zsl. len( ) ) ;
86
87
self . dict . len ( )
87
88
}
88
89
89
-
90
90
/// 清除集合
91
91
///
92
92
/// # Examples
@@ -102,7 +102,7 @@ impl<K: Hash + Eq> ZSet<K> {
102
102
/// assert_eq!(val.len(), 0);
103
103
/// }
104
104
/// ```
105
- ///
105
+ ///
106
106
pub fn clear ( & mut self ) {
107
107
self . dict . clear ( ) ;
108
108
self . zsl . clear ( ) ;
@@ -121,7 +121,7 @@ impl<K: Hash + Eq> ZSet<K> {
121
121
/// assert_eq!(val.contains_key(&"aa"), true);
122
122
/// }
123
123
/// ```
124
- ///
124
+ ///
125
125
pub fn contains_key < Q > ( & mut self , k : & Q ) -> bool
126
126
where
127
127
K : Borrow < Q > ,
@@ -130,7 +130,6 @@ impl<K: Hash + Eq> ZSet<K> {
130
130
self . dict . contains_key ( KeyWrapper :: from_ref ( k) )
131
131
}
132
132
133
-
134
133
/// 获取排序值
135
134
///
136
135
/// # Examples
@@ -142,7 +141,7 @@ impl<K: Hash + Eq> ZSet<K> {
142
141
/// val.add_or_update("aa", 10);
143
142
/// val.add_or_update("bb", 12);
144
143
/// assert_eq!(val.len(), 2);
145
- ///
144
+ ///
146
145
/// }
147
146
/// ```
148
147
pub fn rank < Q > ( & mut self , k : & Q ) -> usize
@@ -197,7 +196,7 @@ impl<K: Hash + Eq> ZSet<K> {
197
196
/// val.add_or_update("bb", 14);
198
197
/// assert_eq!(val.len(), 2);
199
198
/// assert_eq!(val.score(&"bb"), 14);
200
- ///
199
+ ///
201
200
/// }
202
201
/// ```
203
202
pub fn add_or_update ( & mut self , key : K , mut score : isize ) {
@@ -209,10 +208,11 @@ impl<K: Hash + Eq> ZSet<K> {
209
208
score = -score;
210
209
}
211
210
211
+ let now = SystemTime :: now ( ) . duration_since ( UNIX_EPOCH ) . unwrap ( ) ;
212
212
let context = Context {
213
213
key : mem:: MaybeUninit :: new ( key) ,
214
214
score,
215
- timestamp : 0 ,
215
+ timestamp : now . as_millis ( ) as usize ,
216
216
} ;
217
217
218
218
let key_ref = KeyRef :: new ( context. key . as_ptr ( ) ) ;
@@ -238,7 +238,7 @@ impl<K: Hash + Eq> ZSet<K> {
238
238
/// val.add_or_update("aa", 10);
239
239
/// val.add_or_update("bb", 12);
240
240
/// assert_eq!(val.score(&"bb"), 12);
241
- ///
241
+ ///
242
242
/// }
243
243
/// ```
244
244
pub fn score < Q > ( & mut self , k : & Q ) -> isize
@@ -251,6 +251,26 @@ impl<K: Hash + Eq> ZSet<K> {
251
251
}
252
252
0
253
253
}
254
+
255
+ /// 遍历值
256
+ ///
257
+ /// # Examples
258
+ ///
259
+ /// ```
260
+ /// use algorithm::ZSet;
261
+ /// fn main() {
262
+ /// let mut val = ZSet::new();
263
+ /// val.add_or_update("aa", 10);
264
+ /// val.add_or_update("bb", 12);
265
+ /// let mut iter = val.iter();
266
+ /// assert_eq!(iter.next(), Some((&"aa", 0, 10)));
267
+ /// assert_eq!(iter.next(), Some((&"bb", 1, 12)));
268
+ /// assert_eq!(iter.next(), None);
269
+ /// }
270
+ /// ```
271
+ pub fn iter ( & self ) -> ZSetIter < K > {
272
+ ZSetIter :: new ( self . zsl . iter ( ) )
273
+ }
254
274
}
255
275
256
276
impl < K : Hash + Eq > Drop for ZSet < K > {
@@ -259,9 +279,40 @@ impl<K: Hash + Eq> Drop for ZSet<K> {
259
279
}
260
280
}
261
281
282
+ pub struct ZSetIter < ' a , K : ' a + Hash + Eq > {
283
+ iter : SkipIter < ' a , Context < K > > ,
284
+ data : PhantomData < & ' a ( ) > ,
285
+ }
262
286
263
- // pub struct Iter<'a, K: 'a + Default + PartialEq + PartialOrd> {
264
- // len: usize,
265
- // iter: SkipIter<&'a K>,
266
- // data: PhantomData<&'a ()>,
267
- // }
287
+ impl < ' a , T : Hash + Eq > ZSetIter < ' a , T > {
288
+ fn new ( iter : SkipIter < ' a , Context < T > > ) -> Self {
289
+ Self {
290
+ iter,
291
+ data : PhantomData ,
292
+ }
293
+ }
294
+ }
295
+
296
+ impl < ' a , T : Hash + Eq > Iterator for ZSetIter < ' a , T > {
297
+ type Item = ( & ' a T , usize , isize ) ;
298
+
299
+ fn next ( & mut self ) -> Option < Self :: Item > {
300
+ match self . iter . next ( ) {
301
+ None => return None ,
302
+ Some ( ( v, s) ) => return Some ( ( unsafe { v. key . assume_init_ref ( ) } , s, v. score ) ) ,
303
+ }
304
+ }
305
+
306
+ fn size_hint ( & self ) -> ( usize , Option < usize > ) {
307
+ self . iter . size_hint ( )
308
+ }
309
+ }
310
+
311
+ impl < ' a , T : Hash + Eq > DoubleEndedIterator for ZSetIter < ' a , T > {
312
+ fn next_back ( & mut self ) -> Option < Self :: Item > {
313
+ match self . iter . next_back ( ) {
314
+ None => return None ,
315
+ Some ( ( v, s) ) => return Some ( ( unsafe { v. key . assume_init_ref ( ) } , s, v. score ) ) ,
316
+ }
317
+ }
318
+ }
0 commit comments