4个版本 (2个破坏性更新)

0.3.1 2023年12月15日
0.3.0 2022年2月5日
0.2.0 2022年1月10日
0.1.0 2022年1月3日

算法中排名925

每月下载39
dotnetdll中使用

MIT许可协议

15KB
208

scroll-buffer

Cargo Crates.io

为使用Scroll提供的附加Pwrite缓冲区。

文档

文档可在docs.rs找到。

概述

由于Scroll的写入特性对其目标缓冲区是通用的,如果你觉得默认的可变字节切片太受限,你可以使用这个crate中的类型来获得更强大的功能,如动态分配。

目前,这个crate只定义了一个这样的缓冲区:当写入类型时,会按需增长的DynamicBuffer类型。

使用方法

添加到你的Cargo.toml

[dependencies]
scroll-buffer = "0.3.0"

你现在可以更改你的TryIntoCtx实现并开始编写!

use scroll::{LE, Pwrite, ctx::TryIntoCtx};
use scroll_buffer::DynamicBuffer;

fn main() -> Result<(), scroll::Error> {
    let mut buf = DynamicBuffer::new();
    
    // works with regular ints, of course...
    buf.pwrite_with(0xbeefu16, 0, LE)?;
    assert_eq!(buf.get(), [0xef, 0xbe]);
    
    // ...but also custom types!
    struct MyCoolStruct(bool, u32);
    impl TryIntoCtx<(), DynamicBuffer> for MyCoolStruct {
        type Error = scroll::Error;

        fn try_into_ctx(self, buf: &mut DynamicBuffer, _: ()) -> Result<usize, Self::Error> {
            let offset = &mut 0;
            
            if self.0 {
                buf.gwrite_with(0xffu8, offset, LE)?;
            } else {
                buf.gwrite_with(self.1, offset, LE)?;
            }
            
            Ok(*offset)
        }
    }
    
    buf.clear();
    buf.pwrite(MyCoolStruct(false, 1), 0)?;
    assert_eq!(buf.get(), [0x01, 0x00, 0x00, 0x00]);
    
    buf.pwrite(MyCoolStruct(true, 0), 4)?;
    assert_eq!(buf.get(), [0x01, 0x00, 0x00, 0x00, 0xff]);
    
    Ok(())
}

依赖

~95KB