#bag #multiset

purse

Rust 中的钱包数据结构实现

3 个版本

0.1.4 2023 年 12 月 30 日
0.1.3 2023 年 12 月 26 日
0.1.2 2023 年 12 月 26 日

600数据结构

MIT/Apache

17KB
153

钱包:Rust 中的钱包数据结构实现

mac linux

概述

Purse 在 Rust 中实现了一个钱包,也称为多重集,但这个名字比较无聊。钱包是非常灵活的结构,允许存储异构和非唯一的项集合,支持不同类型并允许重复。

关键特性

  • 灵活性:可以包含任何项,具有重复项和不同类型。
  • 混合集合:适用于需要混合不同类型的应用程序。
  • 重复处理:允许同一项的多个实例。

安装

cargo add purse

使用

use std::any::TypeId;
use purse::Purse;
let mut purse = purse::new();

purse.insert("hello");
purse.insert(42);
assert!(purse.contains("hello"));
assert!(purse.contains(42));
assert_eq!(purse.count::<&str>(), 1);

// Get all of type.
let strings: Vec<&&str> = purse.get_all_of_type();
assert_eq!(strings.len(), 4);
purse.insert("foo");
purse.insert("bar");
purse.insert("baz");
assert!(strings.contains(&&"foo"));
assert!(strings.contains(&&"bar"));
assert!(strings.contains(&&"baz"));

// Check the most common type.
assert_eq!(purse.most_common_type(), Some(TypeId::of::<&str>()));

// Clearing the bag.
purse.clear();
assert!(purse.is_empty());

// Add a few items again.
purse.insert(5);
purse.insert("foo");

// Iteration over all elements in the bag
let mut nums: Vec<i32> = vec![];
let mut strs: Vec<&str> = vec![];

purse.iter().for_each(|item| {
if let Some(&t) = item.downcast_ref::<i32>() {
    nums.push(t);
} else if let Some(&t) = item.downcast_ref::<&str>() {
    strs.push(t);
} else {
    panic!("unexpected type found in bag");
}
});
assert_eq!(nums.first(), Some(&5));
assert_eq!(strs.first(), Some(&"foo"));

贡献

欢迎贡献!请遵循 Rust 请求的标准约定。

许可证

本项目受以下任一许可证的许可:

  • Apache 许可证 2.0 版(licenses/Apache-2.0)
  • MIT 许可证(licenses/MIT)

任选其一。

本项目的 SPDX 许可证标识符为 MIT OR Apache-2.0。

无运行时依赖