#proc-macro #transmute #structures #assist #safely #data #loc

transmute-tools

提供进程宏和特质,以辅助安全地创建可转换的数据结构

1 个不稳定版本

0.1.0 2021年4月22日

#1300进程宏

MIT 许可证

18KB
319

transmute-tools

提供进程宏以辅助安全地创建可转换的数据结构。明确指出,这并不使使用transmute变得安全。这只是一个可能帮助您实现此目的的工具集合。具体的初始用例是帮助忠实复制来自 NVMe规范 的结构。

用法

位置断言

transmute_tools::test_structure 提供了一个属性,允许指定结构体中字段必须放置的位置

use structural_assert::test_structure;

#[test_structure(size = 20)]
#[repr(C, packed)]
pub struct Foo {
    #[loc(0:0)]
    pub a: u8,
    #[loc(1:1)]
    pub b: u8,
    #[loc(2:3)]
    pub c: u16,
    #[loc(4:19)]
    pub d: u128,
}

字节序

transmute_tools::endianness 提供了一个属性,允许指定结构体字段的具体字节序。类似于这样的结构体

#[macro_use]
extern crate transmute_tools;

#[endianness(be)]
#[repr(C, packed)]
pub struct Foo {
    pub a: u8,
    pub b: u8,
    pub c: u16,
    #[le]
    pub d: u128,
    pub e: Box<()>,
}

将生成以下内容

#[repr(C, packed)]
pub struct Convert {
    // Note the missing visbilities.
    a: u8,
    b: u8,
    c: u16,
    d: u128,
    pub e: Box<()>,
}
impl Convert {
    #[inline]
    pub fn a(&self) -> u8 {
        u8::from_be(self.a)
    }
    #[inline]
    pub fn set_a(&mut self, value: u8) {
        self.a = value.to_be();
    }
    #[inline]
    pub fn b(&self) -> u8 {
        u8::from_be(self.b)
    }
    #[inline]
    pub fn set_b(&mut self, value: u8) {
        self.b = value.to_be();
    }
    #[inline]
    pub fn c(&self) -> u16 {
        u16::from_be(self.c)
    }
    #[inline]
    pub fn set_c(&mut self, value: u16) {
        self.c = value.to_be();
    }
    #[inline]
    pub fn d(&self) -> u128 {
        u128::from_le(self.d)
    }
    #[inline]
    pub fn set_d(&mut self, value: u128) {
        self.d = value.to_le();
    }
}

注意:这必须生成函数而不是使用类似 simple_endianness 的东西,因为访问打包结构体的字段是通过值而不是引用进行的。

依赖关系

~1.5MB
~35K SLoC