4个版本
0.1.3 | 2021年1月4日 |
---|---|
0.1.2 | 2021年1月4日 |
0.1.1 | 2021年1月3日 |
0.1.0 | 2021年1月3日 |
#2411 in 算法
20KB
442 行
smart_buffer
具有const generics的栈/堆缓冲区。无需std。
此CRATE需要使用NIGHTLY RUST。
这是什么?
smart_buffer提供了一种数据类型,允许创建一个在栈和堆之间分割的内存结构。
SmartBuffer在栈上的内存大小在编译时通过const generics定义。整个SmartBuffer允许的总大小可以在运行时确定,其中任何额外的运行时需求将在堆中分配。
以下是一个这样的示例
let mut buf = SmartBuffer::<u8, 3>::new(0, 5); // 3 elements on the stack, 2 on the heap
buf.push(3); // stack
buf.push(21); // stack
buf.push(100); // stack
buf.push(65); // heap
buf.push(21); // heap
buf.push(0); // not pushed, not enough space
buf[0] = 128; // modified on the stack
buf[4] = 40; // modified on the heap
为了在使用此crate时提供灵活性,也可以像连续数据结构一样迭代所有值。
let mut buf = SmartBuffer::<f64,128>::new(0.0, 256);
// code goes here
for elem in &buf{
println!("Whoa: {}", elem);
}
然而,使用new()
函数仅支持具有Copy
和Clone
特质的类型,这限制了可用的类型。
幸运的是,包含了一个名为buf!
的宏,可以简化任何包含Clone
特质的SmartBuffer的创建!
以下是一个使用宏的示例
#[macro_use]
fn some_function(){
let mut buffer = buf!(String::new(), 2, 10); // Creates a SmartBuffer
buffer.push(String::from("Wow, look at this")); // stack
buffer.push(String::from("This is pretty nice, huh?")); // stack
buffer.push(String::from("This is one nice heap!")); // heap
buffer[1] = String::from("Yes it is!"); // heap
}
在上面的示例中,该宏要求栈的长度在编译时已知(示例中的2)。SmartBuffer的总长度可以在运行时知道!SmartBuffer的栈部分长度可以是一个const generic。