#dst #stack #fixed-size #inline #allocation #storing #unsized

no-std stack_dst

一个包装器,允许在行内(不使用装箱)存储最大固定大小的非大小类型值

18 个版本

使用旧的 Rust 2015

0.8.1 2023 年 6 月 25 日
0.7.2 2022 年 7 月 20 日
0.7.1 2022 年 2 月 26 日
0.6.1 2021 年 3 月 3 日
0.0.1 2015 年 6 月 2 日

Rust 模式 中排名 #257

Download history 224/week @ 2024-03-13 211/week @ 2024-03-20 215/week @ 2024-03-27 236/week @ 2024-04-03 162/week @ 2024-04-10 171/week @ 2024-04-17 130/week @ 2024-04-24 107/week @ 2024-05-01 100/week @ 2024-05-08 115/week @ 2024-05-15 129/week @ 2024-05-22 191/week @ 2024-05-29 182/week @ 2024-06-05 181/week @ 2024-06-12 192/week @ 2024-06-19 156/week @ 2024-06-26

每月下载量 737
用于 8 个 crate(通过 stylish-core

MIT/Apache 许可证

70KB
1.5K SLoC

stack_dst

行内(即堆栈分配)的动态大小类型,以及使用相同逻辑的动态大小类型的集合

概述

该软件包提供直接在分配中存储 DST 的方法。

基本用法

该软件包涵盖两个主要用例

  • Value 允许在固定大小分配中存储(和返回)单个 DST
  • StackFifo 允许异构集合,无需为每个对象装箱。

示例

无装箱闭包

最明显的用途之一是允许返回捕获的闭包,而无需装箱。在下面的示例中,闭包拥有 value 的所有权,然后使用 Value 返回

use stack_dst::Value;

// The closure is stored in two 64-bit integers (one for the vtable, the other for the value)
fn make_closure(value: u64) -> Value<dyn Fn()->String, ::stack_dst::buffers::U64_2> {
    if value < 0x10000 {
        ValueA::new_stable(move || format!("Hello there! value={}", value), |v| v as _).ok().expect("Closure doesn't fit")
    }
    else {
        ValueA::new_stable(move || format!("Hello there! value={:#x}", value), |v| v as _).ok().expect("Closure doesn't fit")
    }
}
let closure = make_closure(12);
assert_eq!( closure(), "Hello there! value=12" );

状态

  • 适用于大多数测试用例
  • miri 对其感到满意
  • 没有在各个平台上进行严格测试

最低 rust 版本

  • 使用 MaybeUninit,因此需要至少 1.36

许可证

许可证为以下之一

任选其一。

贡献

除非你明确说明,否则任何有意提交以包含在你的作品中并由 Apache-2.0 许可证定义的贡献,将按上述方式双许可,不附加任何额外条款或条件。

依赖项

~235KB