#heap-allocation #ownership #collection #generic #object #heap-memory #environments

无std 管理的

一个逻辑拥有对象的接口,无论是否提供堆分配

14个版本 (8个破坏性)

使用旧的Rust 2015

0.8.0 2020年7月4日
0.7.1 2018年7月11日
0.6.1 2018年3月24日
0.4.0 2017年9月22日
0.0.0 2016年12月17日

#40 in 嵌入式开发

Download history 22572/week @ 2024-03-14 26921/week @ 2024-03-21 25301/week @ 2024-03-28 29026/week @ 2024-04-04 26703/week @ 2024-04-11 26958/week @ 2024-04-18 26423/week @ 2024-04-25 25224/week @ 2024-05-02 27867/week @ 2024-05-09 24346/week @ 2024-05-16 21862/week @ 2024-05-23 26838/week @ 2024-05-30 26382/week @ 2024-06-06 25065/week @ 2024-06-13 26243/week @ 2024-06-20 22224/week @ 2024-06-27

每月104,678次下载
97 个crate中(直接13个) 使用

0BSD 许可证

66KB
1.5K SLoC

管理

管理是一个库,提供了一种逻辑上拥有对象的方式,无论是否提供堆分配。它与rustc 1.26或更高版本一起工作。

动机

管理》库存在于三个概念交汇处:《无堆环境》、《集合》和《泛型代码》。考虑这个表示网络接口的结构

pub struct Interface<'a, 'b: 'a,
    DeviceT:        Device,
    ProtocolAddrsT: BorrowMut<[IpAddress]>,
    SocketsT:       BorrowMut<[Socket<'a, 'b>]>
> {
    device:         DeviceT,
    hardware_addr:  EthernetAddress,
    protocol_addrs: ProtocolAddrsT,
    sockets:        SocketsT,
    phantom:        PhantomData<Socket<'a, 'b>>
}

结构体Interface有三种类型参数

  • 实现trait DeviceT的对象,它拥有它;
  • 一个IPAddress的切片,它要么拥有它,要么可变借用;
  • 一个Socket的切片,它要么拥有它,要么可变借用,并且它进一步要么拥有或借用一些内存。

使用BorrowMut的动机在于,在具有堆的环境中,结构体应该拥有一个Vec;另一方面,在没有堆的情况下,既没有Vec也没有Box,并且只能使用&mut。这两者都实现了BorrowMut。

请注意,以这种方式拥有一个BorrowMut不会隐藏在BorrowMut内部的具体类型;如果切片由一个Vec支持,那么即使不是Interface的实现,Vec仍然可以被外部代码调整大小。

独立来看,这个结构体很容易使用。然而,当与其他代码库结合使用时,例如嵌入到调度程序中时,会出现问题。类型参数需要有一个去处!有两种选择

  • 要么这些类型参数,一大堆,感染调度程序并推动所有权在调用堆栈中更高(self-mutably-borrowed structs在safe Rust中不可用,因此调度程序不能轻易拥有切片);
  • 或者接口作为一个boxed trait对象拥有,排除了无堆系统。

显然,这两种选择都不令人满意。因此,出现了管理

安装

要在项目中使用托管库,请将以下内容添加到Cargo.toml

[dependencies]
managed = "0.6"

默认配置假设为托管环境,以方便评估。您可能希望禁用默认功能并逐个配置它们

[dependencies]
managed = { version = "...", default-features = false, features = ["..."] }

功能 std

std 功能通过依赖 std 包启用对 BoxVecBTreeMap 的使用。

功能 alloc

alloc 功能通过依赖 alloc 包启用对 BoxVecBTreeMap 的使用。它需要使用 nightly rustc。

功能 map

map 功能默认禁用,启用后可使用 ManagedMap 枚举。其接口尚不稳定,可能会更改。它还需要使用 rustc 1.28 或更高版本。

用法

managed 是一个互操作性包:它不包含复杂的功能,而是定义了一个许多下游包都可能使用的接口。它包含三个枚举

pub enum Managed<'a, T: 'a + ?Sized> {
    Borrowed(&'a mut T),
    #[cfg(/* Box available */)]
    Owned(Box<T>),
}

pub enum ManagedSlice<'a, T: 'a> {
    Borrow(&'a mut [T]),
    #[cfg(/* Vec available */)]
    Owned(Vec<T>)
}

// The implementation of ManagedMap is not yet stable, beware!
pub enum ManagedMap<'a, K: Hash + 'a, V: 'a> {
    Borrowed(&'a mut [Option<(K, V)>]),
    #[cfg(/* BTreeMap available */)]
    Owned(BTreeMap<K, V>)
}

ManagedManagedSlice 枚举具有对应类型的 From 实现,以及到类型 TDeref/DerefMut 实现,还包括其他辅助方法,而 ManagedMap 则使用 B-tree 映射或键值对排序切片实现。

有关详细信息,请参阅完整文档

许可证

managed 在 0-clause BSD 许可证的条款下分发。

有关详细信息,请参阅LICENSE-0BSD

无运行时依赖

功能