pub struct Slab<T: Default> { /* private fields */ }
Expand description
一个缓存对象的实现, 类似linux中的slab 将一个对象重复循环使用, 避免频繁分配数据的可能 得出的对象可能未重新初始化, 为上一次的最终值, 请按需重新初始化 默认的初始化依赖Default接口, 请实现Default
§Examples
use algorithm::Slab;
fn main() {
let mut slab = Slab::new();
for _ in 0..100 {
let k = slab.get_next();
slab[&k] = format!("{}", k);
}
assert!(slab.len() == 100);
for i in 0..100 {
let _ = slab.remove(i);
}
assert!(slab.len() == 0);
let k = slab.get_next();
assert!(k == 99);
assert!(slab[&k] == "99");
let k = slab.get_reinit_next();
assert!(k == 98);
assert!(slab[&k] == "");
}
Implementations§
source§impl<T: Default> Slab<T>
impl<T: Default> Slab<T>
pub fn new() -> Self
sourcepub fn get(&mut self, key: usize) -> &T
pub fn get(&mut self, key: usize) -> &T
获取index值相对应的value值
use algorithm::Slab;
fn main() {
let mut slab = Slab::new();
let k = slab.insert("slab");
assert!(slab.get(k) == &"slab");
}
sourcepub fn get_mut(&mut self, key: usize) -> &mut T
pub fn get_mut(&mut self, key: usize) -> &mut T
获取index值相对应的value可变值
use algorithm::Slab;
fn main() {
let mut slab = Slab::new();
let k = slab.insert("slab");
assert!(slab.get_mut(k) == &mut "slab");
}
sourcepub fn get_next_val(&mut self) -> (usize, &mut T)
pub fn get_next_val(&mut self) -> (usize, &mut T)
获取下一个的key值和val值
use algorithm::Slab;
fn main() {
let mut slab = Slab::new();
let k = slab.insert("slab");
assert!(slab.get_next_val() == (1, &mut ""));
}
sourcepub fn get_next(&mut self) -> usize
pub fn get_next(&mut self) -> usize
获取下一个的key值
use algorithm::Slab;
fn main() {
let mut slab = Slab::new();
let k = slab.insert("slab");
assert!(slab.get_next() == 1);
}
sourcepub fn insert(&mut self, val: T) -> usize
pub fn insert(&mut self, val: T) -> usize
插入一条数据进入slab缓存起来
use algorithm::Slab;
fn main() {
let mut slab = Slab::new();
let k = slab.insert("slab");
assert!(slab[&k] == "slab");
}
sourcepub fn remove(&mut self, key: usize)
pub fn remove(&mut self, key: usize)
删除某个键值数据, 不会返回内容, 因为该内容会提供给下次复用
use algorithm::Slab;
fn main() {
let mut slab = Slab::new();
let k = slab.get_next();
let k1 = slab.get_next();
slab[&k1] = "slab";
assert!(slab.len() == 2);
slab.remove(k);
assert!(slab.len() == 1);
assert!(slab[&k1] == "slab");
}
sourcepub fn try_remove(&mut self, key: usize) -> bool
pub fn try_remove(&mut self, key: usize) -> bool
试图删除某个键值数据, 不会返回内容, 因为该内容会提供给下次复用
use algorithm::Slab;
fn main() {
let mut slab = Slab::new();
let k = slab.get_next();
let k1 = slab.get_next();
slab[&k1] = "slab";
assert!(slab.len() == 2);
assert!(slab.try_remove(k) == true);
assert!(slab.try_remove(k) == false);
assert!(slab.len() == 1);
assert!(slab[&k1] == "slab");
}
sourcepub fn contains_key(&mut self, k: usize) -> bool
pub fn contains_key(&mut self, k: usize) -> bool
是否包含某个键值
use algorithm::Slab;
fn main() {
let mut slab = Slab::new();
let k = slab.get_next();
slab[&k] = "slab";
assert!(slab.contains_key(k) == true);
assert!(slab.try_remove(k) == true);
assert!(slab.contains_key(k) == false);
}
sourcepub fn iter(&self) -> Iter<'_, T>
pub fn iter(&self) -> Iter<'_, T>
遍历当前的所有值
use algorithm::Slab;
fn main() {
let mut slab = Slab::new();
slab.insert("hello");
slab.insert("this");
let mut iter = slab.iter();
assert!(iter.next() == Some((0, &"hello")));
assert!(iter.next() == Some((1, &"this")));
assert!(iter.next() == None);
}
sourcepub fn iter_mut(&mut self) -> IterMut<'_, T>
pub fn iter_mut(&mut self) -> IterMut<'_, T>
遍历当前的所有值, 可同时修改值
use algorithm::Slab;
fn main() {
let mut slab = Slab::new();
slab.insert("slab".to_string());
slab.insert("this".to_string());
for (k, v) in slab.iter_mut() {
v.push_str(" ok")
}
assert!(slab[&0] == "slab ok");
}
sourcepub fn drain(&mut self) -> Drain<'_, T>
pub fn drain(&mut self) -> Drain<'_, T>
排除当时所有的值
use algorithm::Slab;
fn main() {
let mut slab = Slab::new();
slab.insert("slab".to_string());
slab.insert("this".to_string());
{
let mut drain = slab.drain();
assert!(drain.next()==Some("slab".to_string()));
}
assert!(slab.len() == 0);
}
sourcepub fn retain<F>(&mut self, f: F)
pub fn retain<F>(&mut self, f: F)
根据保留当前的元素, 返回false则表示抛弃元素
use algorithm::Slab;
fn main() {
let mut slab = Slab::new();
slab.insert("hello");
slab.insert("this");
slab.insert("year");
slab.retain(|_, v| *v == "hello" || *v == "this");
assert!(slab.len() == 2);
assert!(slab.get(1) == &"this");
}
source§impl<T: Default + Reinit> Slab<T>
impl<T: Default + Reinit> Slab<T>
sourcepub fn get_reinit_next(&mut self) -> usize
pub fn get_reinit_next(&mut self) -> usize
获取下一个key并重新初始化
use algorithm::Slab;
fn main() {
let mut slab = Slab::new();
let k = slab.insert("hello");
let k1 = slab.insert("slab");
slab.remove(k1);
assert!(slab.get_reinit_next() == k1);
assert!(slab.get(k1) == &"");
}
sourcepub fn get_reinit_next_val(&mut self) -> (usize, &mut T)
pub fn get_reinit_next_val(&mut self) -> (usize, &mut T)
获取下一个key和val并重新初始化
use algorithm::Slab;
fn main() {
let mut slab = Slab::new();
let k = slab.insert("hello");
let k1 = slab.insert("slab");
slab.remove(k1);
assert!(slab.get_reinit_next_val() == (k1, &mut ""));
}
Trait Implementations§
source§impl<T: Default> Extend<T> for Slab<T>
impl<T: Default> Extend<T> for Slab<T>
source§fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I)
fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I)
Extends a collection with the contents of an iterator. Read more
source§fn extend_one(&mut self, item: A)
fn extend_one(&mut self, item: A)
🔬This is a nightly-only experimental API. (
extend_one
)Extends a collection with exactly one element.
source§fn extend_reserve(&mut self, additional: usize)
fn extend_reserve(&mut self, additional: usize)
🔬This is a nightly-only experimental API. (
extend_one
)Reserves capacity in a collection for the given number of additional elements. Read more
source§impl<T: Default> FromIterator<T> for Slab<T>
impl<T: Default> FromIterator<T> for Slab<T>
source§impl<T: Default> IntoIterator for Slab<T>
impl<T: Default> IntoIterator for Slab<T>
impl<T: Send + Default> Send for Slab<T>
impl<T: Sync + Default> Sync for Slab<T>
Auto Trait Implementations§
impl<T> Freeze for Slab<T>
impl<T> RefUnwindSafe for Slab<T>where
T: RefUnwindSafe,
impl<T> Unpin for Slab<T>where
T: Unpin,
impl<T> UnwindSafe for Slab<T>where
T: UnwindSafe,
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
🔬This is a nightly-only experimental API. (
clone_to_uninit
)