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 嵌入式开发
每月104,678次下载
在 97 个crate中(直接13个) 使用
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
包启用对 Box
、Vec
和 BTreeMap
的使用。
功能 alloc
alloc
功能通过依赖 alloc
包启用对 Box
、Vec
和 BTreeMap
的使用。它需要使用 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>)
}
Managed
和 ManagedSlice
枚举具有对应类型的 From
实现,以及到类型 T
的 Deref
/DerefMut
实现,还包括其他辅助方法,而 ManagedMap
则使用 B-tree 映射或键值对排序切片实现。
有关详细信息,请参阅完整文档。
许可证
managed 在 0-clause BSD 许可证的条款下分发。
有关详细信息,请参阅LICENSE-0BSD。