#conversion #utf-8 #stream #iterator #convert

已删除 chisel-charstream

简单且相对快速的 u8 -> char 流实现

0.1.3 2023年3月17日
0.1.2 2023年3月17日
0.1.1 2023年3月17日
0.1.0 2023年3月17日

#23#utf8

每月下载量 33 次

MIT/Apache 协议

4MB
261 行代码(不包括注释)

Chisel - CharStream

Rust

概述

该仓库包含一个非常简单、精简的转码器实现,它将从给定的 Read 实现中消费 u8 字节,并将其转换为 Rust 内部 char 类型。这是从正在进行的一个玩具解析器项目中衍生出来的库,用作解析器扫描/词法分析阶段的初始阶段,以避免在 u8 序列 -> char 转换期间进行不必要的分配。

请注意,实现相当快速且宽松,并在底层利用一些位操作与 unsafe transmute 函数一起进行转换。 转换过程中不使用任何字符串分配。对输入字节的最小检查(除了位掩码之外)——它并不打算成为一个 UTF8 验证库。

用法

用法非常简单,只要你有一个实现 Read 的东西来提供一些字节

从切片创建

只需将您的数组包装在一个读取器中,然后将其插入到新的 CharStream 实例中

    let buffer: &[u8] = &[0x10, 0x12, 0x23, 0x12];
    let mut reader = BufReader::new(buffer);
    let _stream = CharStream::new(&mut reader);

从文件创建

只需打开您的文件,包装在 Read 实例中,然后将其插入到新的 CharStream 实例中

    let path = PathBuf::from("somefile.txt");
    let f = File::open(path);
    let mut reader = BufReader::new(f.unwrap());
    let _stream = CharStream::new(&mut reader);

消费 char

您可以从包装在 Result 类型中的读取器中拉出新 char

    loop {
        let result = stream.next_char();
        if result.is_err() {
            break;
        }
    }

或者,您可以直接使用 CharStream 作为 Iterator

    let stream = CharStream::new(&mut reader);
    for c in stream {
        match c {
            Some(c) => ...
            None => ...
        }       
    }

无运行时依赖项