3个稳定版本
1.0.2 | 2023年7月19日 |
---|
#665 在 过程宏
30KB
504 行
WarcMutex
描述
WarcMutex包是Rust库,提供模块、结构和实现的宏属性。该库的目的是生成一个包装器,允许结构使用异步引用控制Arc和Mutex异步变异控制。
安装
要使用WarcMutex包,请在您的Cargo.toml
中添加以下依赖项
[dependencies]
warcmutex = "1.0.0"
示例用法
以下是使用WarcMutex的一个简单示例
#[warcmutex]
pub struct MyStruct {
value: usize,
}
#[warcmutex]
impl MyStruct {
pub fn new() -> Self {
Self {
value: 0,
}
}
pub fn reset(&mut self) {
self.value = 0;
}
pub fn value_mut(&mut self) -> &mut usize {
&mut self.value
}
pub fn get_value(&self) -> usize {
self.value
}
}
应用#[warcmutex]
属性后,代码被转换成
pub struct MyStructBase {
value: usize,
}
impl MyStructBase {
pub fn new() -> Self {
Self {
value: 0,
}
}
fn reset(&mut self) {
self.value = 0;
}
pub fn value_mut(&mut self) -> &mut usize {
&mut self.value
}
fn get_value(&self) -> usize {
self.value
}
}
pub struct MyStruct {
base: Arc<Mutex<MyStructBase>>,
}
impl MyStruct {
pub fn new() -> Self {
Self {
base: Arc::new(Mutex::new(MyStructBase::new())),
}
}
pub fn reset(&mut self) {
self.base.lock().unwrap().reset();
}
pub fn get_value(&self) -> usize {
self.base.lock().unwrap().get_value()
}
}
impl MyStruct {
pub fn lock(&mut self) -> LockResult<MutexGuard<'_, MyStructBase>> {
self.base.lock()
}
}
impl Clone for MyStruct {
fn clone(&self) -> Self {
Self {
base: self.base.clone(),
}
}
}
unsafe impl Send for MyStruct {}
unsafe impl Sync for MyStruct {}
使用#[warcmutex]
属性后,MyStruct
将自动重写,增加一个包含Arc<Mutex<MyStructBase>>
的base
字段。然后实现MyStruct
的功能,以安全地访问base
字段。
锁定方法
类似于Mutex<T>
中的方法,此函数用于锁定使用并访问如以下示例中所示返回引用的功能
fn main() {
use my_module::MyStruct;
let mut a = MyStruct::new();
*a.lock().unwrap().value_mut() = 10;
assert_eq!(a.get_value(), 10);
}
模块
您可以通过将#[warcmutex]
作为模块的属性来简化#[warcmutex]
的使用,它将在上一个示例中产生相同的效果
use warcmutex::warcmutex;
#[warcmutex]
mod my_module {
/// other mods, structs, and/or impls...
}
当应用于模块时,所有结构体、实现和模块都将被包括,但有例外。
属性的用法可能与其他属性不兼容。
贡献
WarcMutex项目主要由一个名为PFP的开发者维护,但欢迎社区贡献。然而,贡献必须保持在项目主要功能的范围内。
许可
此项目采用MIT许可证。有关更多详细信息,请参阅LICENSE文件。
依赖关系
~0.4–0.9MB
~19K SLoC