2个版本
使用旧的Rust 2015
0.1.1 | 2017年11月5日 |
---|---|
0.1.0 | 2017年11月4日 |
253 在 #bit
每月23次下载
在 extended-rational 中使用
17KB
323 行
为BitStore
在bit 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