1 个不稳定版本
| 0.1.0 | 2023 年 7 月 13 日 |
|---|
#10 在 #可派生
6KB
可派生对象池
此 crate 提供一个可以派生的 trait,以单行代码实现类型对象池。允许用户忘记 ObjectPool 的实现细节,专注于代码的重要部分
与其它对象池 crate 相比,此 crate 具有以下特性
- 可派生:池子易于使用,可以与任何类型一起使用。可以通过使用
#[derive(ObjectPool)]属性宏进行派生。 - 可复用:用户可以使用
ObjectPool::new函数从池中创建对象,如果可能的话,将复用池中的对象。这些项目被封装在一个Reusable结构体中,当它们被丢弃时将返回到池中。 - 线程安全:池是线程安全的(通过使用
Mutex),可以在多线程环境中使用。 - 简单:用户不需要为每个类型手动创建池,可以使用
ObjectPool::new函数从池中创建对象。 - 灵活:用户可以配置池以使用自定义的生成器函数(见
#[derive(ObjectPool)]中的属性)或仅使用Default特质来创建新对象。
安装
将以下内容添加到您的Cargo.toml文件中
[dependencies]
derivable-object-pool = "0.1.1"
用法
如果不指定任何属性,池将使用Default特质来创建新对象
use derivable_object_pool::prelude::*;
#[derive(Default, ObjectPool)]
struct Test(i32);
fn main() {
let mut obj = Test::new();
obj.0 += 1;
assert_eq!(obj.0, 1);
drop(obj); // obj is returned to the pool
assert_eq!(Test::pool().len(), 1);
let mut obj = Test::new();
assert_eq!(Test::pool().len(), 0);
assert_eq!(obj.0, 1);
}
或者您可以使用#[generator]属性指定一个自定义的生成器函数
use derivable_object_pool::prelude::*;
#[derive(ObjectPool)]
#[generator(Test::new_item)]
struct Test(i32);
impl Test {
fn new_item() -> Self {
Test(10)
}
}
fn main() {
let mut obj = Test::new();
obj.0 += 1;
assert_eq!(obj.0, 11);
drop(obj); // obj is returned to the pool
assert_eq!(Test::pool().len(), 1);
let mut obj = Test::new();
assert_eq!(Test::pool().len(), 0);
assert_eq!(obj.0, 11);
}
文档
文档可以在这里找到。
许可
本项目采用双MIT/Apache-2.0许可。更多信息,请参阅LICENSE-APACHE和LICENSE-MIT。
lib.rs:
可推导对象池宏
为derivable-object-pool存储库提供的内部存储库。它为ObjectPool特质提供了推导宏。
依赖项
~265–720KB
~17K SLoC