#bit #manager #derive #bit-store

bit_manager_derive

为bit_manager包提供派生宏

2个版本

使用旧的Rust 2015

0.1.1 2017年11月5日
0.1.0 2017年11月4日

253#bit

每月23次下载
extended-rational 中使用

MIT 许可证

17KB
323

BitStorebit manager包中提供派生宏。

用法

#[macro_use]
extern crate bit_manager_derive;
extern crate bit_manager;

use bit_manager::*;

#[derive(BitStore, PartialEq, Debug)]
struct Point {
    x: f64,
    y: f64,
}

派生后,Point可以像这样存储和读取

let point = Point {
    x: 6.28318531,
    y: 2.5,
};

let mut writer = BitWriter::new(Vec::new());
writer.write(&point)?;
let vec = writer.into_inner()?;

let mut reader = BitReader::new(&vec[..]);
assert_eq!(reader.read::<Point>()?, point);

属性

  • #[bit(align_enum="8")] 使用提供的数字的整数倍作为存储枚举变体索引的字节数,允许未来添加项。默认值为零。#[bit(align_enum)] 使用8位数字。最大为32位。
  • #[bit(verbose)] 打印派生实现和已使用的属性记录。

实现

结构和枚举的实现类似,但略有不同。

枚举

枚举变体按其索引存储。索引使用最少的位数存储(默认)或使用最少的字节数(使用align_enum)。然后,逐个存储每个变体的字段,就像结构一样。在读取时,如果索引不匹配任何变体,则返回Error::ConversionFailed。没有字段的枚举不能存储,因为它们不能实例化。

结构

结构体逐个字段存储其内容。单元结构体是一个无操作。读取项目失败将立即停止读取并返回错误。

当简化后,实际实现的 Point 看起来是这样的

impl bit_manager::data::BitStore for Point {
    fn read_from<R: bit_manager::BitRead>(reader: &mut R) -> bit_manager::Result<Self> {
        Ok(
            Point {
                x: reader.read()?,
                y: reader.read()?,
            }
        )
    }
    fn write_to<W: bit_manager::BitWrite>(&self, writer: &mut W) -> bit_manager::Result<()> {
        writer.write(&self.x)?;
        writer.write(&self.y)
    }
}

依赖关系

~1.5MB
~42K SLoC