2 个不稳定版本

0.2.0 2021 年 7 月 4 日
0.1.0 2021 年 6 月 27 日

#916 in Rust 模式

MIT/Apache

260KB
5K SLoC

memtable - Rust 中的内存表

Build Status Crates.io Docs.rs memtable Minimum Supported Rust Version memtable-macros Minimum Supported Rust Version

概述

memtable 为内存使用提供了表格式功能的集合。

此包充当所有子包(如 memtable-corememtable-macros)的聚合器,在使用任何功能时应只导入此包。

安装

在其核心中,您可以通过将以下内容添加到您的 Cargo.toml 中来导入依赖项

[dependencies]
memtable = "0.2"

如果您想基于用户定义的结构体派生类型化的表格,您可以包含 macros 功能

[dependencies]
memtable = { version = "0.2", features = ["macros"] }

无 std 支持

此外,此库支持 no_std,包括和不含 alloc。这是通过关闭默认功能(std 是唯一的默认功能)来实现的。从那里,如果您想包含 alloc 支持,请添加该功能

[dependencies]
# For no_std without alloc support
memtable = { version = "0.2", default-features = false }

# For no_std with alloc support
memtable = { version = "0.2", default-features = false, features = ["alloc"] }

请注意,仅依赖默认提供的 core 将限制您的表格选项为 FixedTable。您仍然可以使用 macros 功能派生类型化的表格,但您必须显式设置模式为 fixed

使用方法

通常,您会想要导入 prelude 以引入相关的特性和结构体

use memtable::prelude::*;

// Create a 2x3 (row x column) table of integers
let mut table = FixedTable::from([
    [1, 2, 3],
    [4, 5, 6],
]);

// Examine one of the values, replace it, and examine again
assert_eq!(table[(1, 2)], 6);
table[(1, 2)] = 999;
assert_eq!(table[(1, 2)], 999);

表格

在核心库中,您将找到四个主要表格

  • DynamicTable:具有动态行和列容量的表格
  • FixedTable:具有固定行和列容量的表格
  • FixedRowTable:具有固定行容量和动态列容量的表格
  • FixedColumnTable:具有动态行容量和固定列容量的表格

特性

  • Table:主要特性,公开了在表格上执行的大部分常见操作
  • CellIter:一个常用的特质,针对单个单元格的表格迭代器,允许与单元格的位置进行配对,并获取迭代器的当前行和列

功能特性

除了基本功能外,该库还提供了一些扩展功能,丰富了表格工具集

  • alloc:当启用no_std时,加入alloc
  • csv:启用FromCsv(将CSV转换为内存中的表格)和ToCsv(将内存中的表格转换为CSV)
  • cell:启用Cell2Cell26,这些表示泛型枚举,可以用作表格的数据类型,以在表格中启用多种数据类型(例如:DynamicTable<Cell2<String, bool>>
  • macros:启用Table宏,以便派生新的结构体,该结构体实现了Table特质,能够将某些结构体存储到专门的内存表格中
  • serde:为所有表格和单元格实现启用serde支持
  • sled:启用SledTable,通过sled数据库在表格之上提供持久存储
  • std默认启用加入std库;如果移除,则启用no_std

目前,有一个Table宏,用于派生一个表格,该表格包含零个或多个特定的结构体。

use memtable::Table;

#[derive(Table)]
struct User {
    name: &'static str,
    age: u8,
}

// Derives a new struct, User{Table}, that can contain instances of User
// that are broken up into their individual fields
let mut table = UserTable::new();

// Inserting is straightforward as a User is considered a singular row
table.push_row(User {
    name: "Fred Flintstone",
    age: 51,
});

// You can also pass in a tuple of the fields in order of declaration
table.push_row(("Wilma Flintstone", 47));

// Retrieval by row will provide the fields by ref as a tuple
let (name, age) = table.row(0).unwrap();
assert_eq!(*name, "Fred Flintstone");
assert_eq!(*age, 51);

// Tables of course provide a variety of other methods to inspect data
let mut names = table.name_column();
assert_eq!(names.next(), Some(&"Fred Flintstone"));
assert_eq!(names.next(), Some(&"Wilma Flintstone"));
assert_eq!(names.next(), None);

许可证

根据您的选择,许可协议为Apache License, Version 2.0MIT许可证
除非您明确表示,否则根据Apache-2.0许可证定义的,您有意提交给vimvar的任何贡献,都将按上述方式双重许可,不附加任何其他条款或条件。

依赖项

~0–2.3MB
~42K SLoC