11use std:: collections:: HashMap ;
22use std:: marker:: PhantomData ;
3+ use std:: time:: { SystemTime , UNIX_EPOCH } ;
34use std:: { borrow:: Borrow , hash:: Hash , mem, usize} ;
45
56use crate :: arr:: SkipIter ;
@@ -38,7 +39,7 @@ impl<K: Hash> PartialOrd for Context<K> {
3839 }
3940}
4041
41- /// 一种可排序的Set类型
42+ /// 一种可排序的Set类型, 可以高效的对评分进行排序,
4243///
4344/// # Examples
4445///
@@ -81,12 +82,11 @@ impl<K: Hash + Eq> ZSet<K> {
8182 }
8283 }
8384
84- pub fn len ( & mut self ) -> usize {
85+ pub fn len ( & self ) -> usize {
8586 assert ! ( self . dict. len( ) == self . zsl. len( ) ) ;
8687 self . dict . len ( )
8788 }
8889
89-
9090 /// 清除集合
9191 ///
9292 /// # Examples
@@ -102,7 +102,7 @@ impl<K: Hash + Eq> ZSet<K> {
102102 /// assert_eq!(val.len(), 0);
103103 /// }
104104 /// ```
105- ///
105+ ///
106106 pub fn clear ( & mut self ) {
107107 self . dict . clear ( ) ;
108108 self . zsl . clear ( ) ;
@@ -121,7 +121,7 @@ impl<K: Hash + Eq> ZSet<K> {
121121 /// assert_eq!(val.contains_key(&"aa"), true);
122122 /// }
123123 /// ```
124- ///
124+ ///
125125 pub fn contains_key < Q > ( & mut self , k : & Q ) -> bool
126126 where
127127 K : Borrow < Q > ,
@@ -130,7 +130,6 @@ impl<K: Hash + Eq> ZSet<K> {
130130 self . dict . contains_key ( KeyWrapper :: from_ref ( k) )
131131 }
132132
133-
134133 /// 获取排序值
135134 ///
136135 /// # Examples
@@ -142,7 +141,7 @@ impl<K: Hash + Eq> ZSet<K> {
142141 /// val.add_or_update("aa", 10);
143142 /// val.add_or_update("bb", 12);
144143 /// assert_eq!(val.len(), 2);
145- ///
144+ ///
146145 /// }
147146 /// ```
148147 pub fn rank < Q > ( & mut self , k : & Q ) -> usize
@@ -197,7 +196,7 @@ impl<K: Hash + Eq> ZSet<K> {
197196 /// val.add_or_update("bb", 14);
198197 /// assert_eq!(val.len(), 2);
199198 /// assert_eq!(val.score(&"bb"), 14);
200- ///
199+ ///
201200 /// }
202201 /// ```
203202 pub fn add_or_update ( & mut self , key : K , mut score : isize ) {
@@ -209,10 +208,11 @@ impl<K: Hash + Eq> ZSet<K> {
209208 score = -score;
210209 }
211210
211+ let now = SystemTime :: now ( ) . duration_since ( UNIX_EPOCH ) . unwrap ( ) ;
212212 let context = Context {
213213 key : mem:: MaybeUninit :: new ( key) ,
214214 score,
215- timestamp : 0 ,
215+ timestamp : now . as_millis ( ) as usize ,
216216 } ;
217217
218218 let key_ref = KeyRef :: new ( context. key . as_ptr ( ) ) ;
@@ -238,7 +238,7 @@ impl<K: Hash + Eq> ZSet<K> {
238238 /// val.add_or_update("aa", 10);
239239 /// val.add_or_update("bb", 12);
240240 /// assert_eq!(val.score(&"bb"), 12);
241- ///
241+ ///
242242 /// }
243243 /// ```
244244 pub fn score < Q > ( & mut self , k : & Q ) -> isize
@@ -251,6 +251,26 @@ impl<K: Hash + Eq> ZSet<K> {
251251 }
252252 0
253253 }
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+ }
254274}
255275
256276impl < K : Hash + Eq > Drop for ZSet < K > {
@@ -259,9 +279,40 @@ impl<K: Hash + Eq> Drop for ZSet<K> {
259279 }
260280}
261281
282+ pub struct ZSetIter < ' a , K : ' a + Hash + Eq > {
283+ iter : SkipIter < ' a , Context < K > > ,
284+ data : PhantomData < & ' a ( ) > ,
285+ }
262286
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