#arc-mutex #mutex #attributes #arc #async #macro

warcmutex

一个Rust包,提供了为模块、结构和实现提供属性的宏。使用底层的异步引用(Arc)和异步变异(Mutex)控制元素来重写代码。

3个稳定版本

1.0.2 2023年7月19日

#665过程宏

MIT 许可证

30KB
504

WarcMutex

Crates.io License: MIT

描述

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