1 个不稳定版本

0.1.0 2023 年 7 月 13 日

#10#可派生


用于 derivable-object-pool

MIT/Apache

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-APACHELICENSE-MIT


lib.rs:

可推导对象池宏

derivable-object-pool存储库提供的内部存储库。它为ObjectPool特质提供了推导宏。

依赖项

~265–720KB
~17K SLoC