Skip to content
This repository was archived by the owner on Jul 15, 2023. It is now read-only.

Commit 584e9a2

Browse files
authored
Merge branch 'rust' into rust-work
2 parents 6d2c557 + c1cf17c commit 584e9a2

File tree

4 files changed

+127
-21
lines changed

4 files changed

+127
-21
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,4 @@ bitmaps = "3.2.0"
1515
tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] }
1616

1717
[build-dependencies]
18-
tonic-build = "0.8"
18+
tonic-build = "0.8"

src/id.rs

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
use std::collections::HashSet;
2+
3+
pub trait IdPool {
4+
fn is_empty(&self) -> bool;
5+
fn len(&self) -> usize;
6+
fn clear(&mut self);
7+
fn get_id(&mut self) -> Option<u16>;
8+
fn return_id(&mut self, id: u16) -> bool;
9+
}
10+
11+
#[derive(Clone, Debug)]
12+
pub struct MemoryIdPool {
13+
available_ids: HashSet<u16>,
14+
}
15+
16+
impl MemoryIdPool {
17+
pub fn new() -> Self {
18+
let available_ids: HashSet<u16> = (0..=u16::MAX).collect();
19+
Self { available_ids }
20+
}
21+
}
22+
23+
impl IdPool for MemoryIdPool {
24+
fn is_empty(&self) -> bool {
25+
self.available_ids.is_empty()
26+
}
27+
28+
fn len(&self) -> usize {
29+
self.available_ids.len()
30+
}
31+
32+
fn clear(&mut self) {
33+
self.available_ids.clear();
34+
for i in 0..=u16::MAX {
35+
self.available_ids.insert(i);
36+
}
37+
}
38+
39+
fn get_id(&mut self) -> Option<u16> {
40+
let id = self.available_ids.iter().next().cloned();
41+
if let Some(id) = id {
42+
self.available_ids.remove(&id);
43+
}
44+
id
45+
}
46+
47+
fn return_id(&mut self, id: u16) -> bool {
48+
self.available_ids.insert(id)
49+
}
50+
}
51+
52+
#[cfg(test)]
53+
pub mod tests {
54+
use super::*;
55+
56+
#[test]
57+
fn memory_id_pool_new() {
58+
let pool = MemoryIdPool::new();
59+
assert_eq!(pool.available_ids.len(), 65536);
60+
for i in 0..=65535 {
61+
assert!(pool.available_ids.contains(&i));
62+
}
63+
}
64+
65+
#[test]
66+
fn memory_id_pool_is_empty() {
67+
let pool = MemoryIdPool {
68+
available_ids: [0].into(),
69+
};
70+
assert!(!pool.is_empty());
71+
let pool = MemoryIdPool {
72+
available_ids: Default::default(),
73+
};
74+
assert!(pool.is_empty());
75+
}
76+
77+
#[test]
78+
fn memory_id_pool_len() {
79+
let mut pool = MemoryIdPool::new();
80+
assert_eq!(pool.len(), 65536);
81+
assert!(pool.get_id().is_some());
82+
assert_eq!(pool.len(), 65535);
83+
assert!(pool.get_id().is_some());
84+
assert_eq!(pool.len(), 65534);
85+
pool.available_ids.clear();
86+
assert_eq!(pool.len(), 0);
87+
}
88+
89+
#[test]
90+
fn memory_id_pool_clear() {
91+
let mut pool = MemoryIdPool {
92+
available_ids: Default::default(),
93+
};
94+
assert_eq!(pool.available_ids.len(), 0);
95+
pool.clear();
96+
assert_eq!(pool.available_ids.len(), 65536);
97+
}
98+
99+
#[test]
100+
fn memory_id_pool_get_id() {
101+
let mut pool = MemoryIdPool::new();
102+
for _ in 0..=u16::MAX {
103+
let id = pool.get_id().unwrap();
104+
assert!(!pool.available_ids.contains(&id));
105+
}
106+
assert!(pool.get_id().is_none());
107+
}
108+
109+
#[test]
110+
fn memory_id_pool_return_id() {
111+
let mut pool = MemoryIdPool {
112+
available_ids: Default::default(),
113+
};
114+
for id in 0..=u16::MAX {
115+
assert!(!pool.available_ids.contains(&id));
116+
assert!(pool.return_id(id));
117+
assert!(pool.available_ids.contains(&id));
118+
}
119+
for id in 0..=u16::MAX {
120+
assert!(pool.available_ids.contains(&id));
121+
assert!(!pool.return_id(id));
122+
assert!(pool.available_ids.contains(&id));
123+
}
124+
}
125+
}

src/id_generator.rs

Lines changed: 0 additions & 19 deletions
This file was deleted.

src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::store::MemoryStore;
22

3-
mod id_generator;
3+
mod id;
44
mod store;
55

66
fn main() {

0 commit comments

Comments
 (0)