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