#semver #version #semantic #integer #representation #bits #i32

无std 嵌入式-SemVer

将语义版本作为i32、u32、i64或u64的紧凑表示

3个版本 (破坏性更新)

0.3.0 2022年8月26日
0.2.0 2021年10月24日
0.1.0 2021年4月19日

解析器实现中排名1787

Download history 169/week @ 2024-03-14 330/week @ 2024-03-21 77/week @ 2024-03-28 549/week @ 2024-04-04 93/week @ 2024-04-11 64/week @ 2024-04-18 19/week @ 2024-04-25 7/week @ 2024-05-02 6/week @ 2024-05-09 49/week @ 2024-05-16 15/week @ 2024-05-23 12/week @ 2024-05-30 29/week @ 2024-06-06 22/week @ 2024-06-13 298/week @ 2024-06-20 11/week @ 2024-06-27

每月下载363
2个crate中使用(通过citadel_proto

MIT/Apache

23KB
308

嵌入式-SemVer — 构建状态 最新版本 文档版本 代码行数

将语义版本作为i32、u32、i64或u64的紧凑表示

由于整数格式空间有限,根据类型(32位为0-1023,64位为0-65535)对SemVer字段(主要版本、次要版本、补丁版本)大小有限制。

示例

编码

将semver编码为整数

use embedded_semver::Semver;

let version = Semver::new(1, 0, 20);
let int_semver = version.to_i32().unwrap();

assert_eq!(int_semver, 83886081);
assert_eq!(&int_semver.to_le_bytes(), &[
  0b0000_0001,
  0b0000_0000,
  0b0000_0000,
  0b0000_0101
]);

解码

将整数解码为semver

use embedded_semver::Semver;

let int_semver: i32 = 83886081;

let version = Semver::from_i32(int_semver).unwrap();
assert_eq!(version, Semver::new(1, 0, 20));

功能标志

对于无std支持,作为依赖项添加而不启用默认功能

embedded-semver = { version = "...", default-features = false }

二进制格式

  • 字段按最高有效位优先打包(参见Msb0
  • 格式包含一个2位(32位值上)和4位(64位值上)的API版本,这允许在未来进行扩展和/或API更改

32位

i32u32的二进制格式表示如下。字段

  • version:前两个位表示API版本(打包数据格式)。当前0 = V0
  • major:接下来的10位表示范围在0-1023之间的主要版本
  • minor:接下来的10位表示范围在0-1023之间的次要版本
  • patch:接下来的10位表示范围在0-1023之间的补丁版本
0         2        12        22        32
├────┴────┼┴┴┴┴┴┴┴┴┴┼┴┴┴┴┴┴┴┴┴┼┴┴┴┴┴┴┴┴┴┤
│ API ver │ Major   │ Minor   │ Patch   │
│ u2      │ u10     │ u10     │ u10     │
└─────────┴─────────┴─────────┴─────────┘

64位

i64u64 的二进制格式表示如下。字段

  • version:前四个位表示 API 版本(打包数据格式)。当前 0 = V0
  • major:接下来的 16 位表示范围在 0-65535 之间的主要版本
  • minor:接下来的 16 位表示范围在 0-65535 之间的次要版本
  • patch:接下来的 16 位表示范围在 0-65535 之间的修补版本
  • 剩余的 12 位未使用
0         4              20                36                52          64
├─┴──┴─┴──┼┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┼┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┼┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┼┴┴┴┴┴┴┴┴┴┴┴┤
│ API ver │ Major         │ Minor           │ Patch           | (unused)  │
│ u4      │ u16           │ u16             │ u16             | u12       │
└─────────┴───────────────┴─────────────────┴─────────────────┴───────────┘

关于转换的说明

注意 i32 和 i64 中的二进制表示不相同

use embedded_semver::{Semver, Error, Magic};

let value: i32 = 16904511;
assert_eq!(Semver::from_i32(value).unwrap(), Semver::new(1023, 1, 5));
assert_eq!(
    Semver::from_i64(value as i64).unwrap_err(),
    Error::UnsupportedMagic(Magic::V3)
);

然而,u32 和 i32 的底层位表示相同的值

use embedded_semver::{Semver, Error};

let value: i32 = 16843009;
let bytes = value.to_le_bytes();
let i32_value = i32::from_le_bytes(bytes.clone());
let u32_value = u32::from_le_bytes(bytes);
assert_eq!(Semver::from_i32(i32_value).unwrap(), Semver::new(1, 1, 5));
assert_eq!(Semver::from_u32(u32_value).unwrap(), Semver::new(1, 1, 5));

性能

无需担心 :)

test bench_from_i32 ... bench:          51 ns/iter (+/- 1)
test bench_from_i64 ... bench:          54 ns/iter (+/- 1)
test bench_to_i32   ... bench:          75 ns/iter (+/- 1)
test bench_to_i64   ... bench:          84 ns/iter (+/- 2)

Rust 版本支持

最低支持的 Rust 版本是 1.51

未来计划

目前没有

许可

紧凑语义版本表示

由您选择。

贡献

除非您明确表示,否则任何有意提交以包含在软件中的贡献,根据 Apache-2.0 许可协议定义,将如上双许可,不附加任何额外条款或条件。

依赖项

~1MB
~23K SLoC