Skip to content

Commit b912ad5

Browse files
committed
add zset
1 parent 0b3f4b7 commit b912ad5

File tree

2 files changed

+86
-23
lines changed

2 files changed

+86
-23
lines changed

examples/zset.rs

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,25 @@
1+
// use algorithm::ZSet;
2+
// fn main() {
3+
// let mut val = ZSet::new();
4+
// val.add_or_update("aa", 10);
5+
// val.add_or_update("bb", 12);
6+
// assert_eq!(val.score(&"bb"), 12);
7+
// assert_eq!(val.len(), 2);
8+
// assert_eq!(val.rank(&"bb"), 2);
9+
// val.add_or_update("bb", 9);
10+
// assert_eq!(val.rank(&"bb"), 1);
11+
// assert_eq!(val.len(), 2);
12+
13+
// }
14+
15+
116
use algorithm::ZSet;
217
fn main() {
318
let mut val = ZSet::new();
419
val.add_or_update("aa", 10);
520
val.add_or_update("bb", 12);
6-
assert_eq!(val.score(&"bb"), 12);
7-
assert_eq!(val.len(), 2);
8-
assert_eq!(val.rank(&"bb"), 2);
9-
val.add_or_update("bb", 9);
10-
assert_eq!(val.rank(&"bb"), 1);
11-
assert_eq!(val.len(), 2);
12-
13-
}
21+
let mut iter = val.iter();
22+
assert_eq!(iter.next(), Some((&"aa", 0, 10)));
23+
assert_eq!(iter.next(), Some((&"bb", 1, 12)));
24+
assert_eq!(iter.next(), None);
25+
}

src/map/zset.rs

Lines changed: 66 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::collections::HashMap;
22
use std::marker::PhantomData;
3+
use std::time::{SystemTime, UNIX_EPOCH};
34
use std::{borrow::Borrow, hash::Hash, mem, usize};
45

56
use 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

256276
impl<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

Comments
 (0)