#stack #heap #buffer #const-generics #data-structures #no-std

nightly no-std smart_buffer

混合栈/堆缓冲区

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 算法

MIT/Apache

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()函数仅支持具有CopyClone特质的类型,这限制了可用的类型。

幸运的是,包含了一个名为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。

无运行时依赖