#unique-identifier #human-readable #string #numbers #editor #gamedev #immutability

stringid

轻量级系统,用于管理作为人类可读字符串和唯一数字的标识符

3 个不稳定版本

0.1.0 2023 年 12 月 9 日
0.0.2 2023 年 11 月 28 日
0.0.1 2023 年 11 月 28 日

#814 in 游戏开发

LGPL-3.0-only

29KB
499 代码行

stringid

《stringid》包是一组助手(宏、结构体、特质),用于高效地管理作为人类可读字符串和唯一数字的标识符。它可以用于使用直到应用程序结束才存在的不可变字符串。

唯一标识符允许轻量存储 + 快速比较和复制操作。而人类可读字符串则方便在 UI、序列化、调试等方面使用。

为什么使用 StringId ?

您可以在希望使用不可变 String(或 [str]) 作为标识符的地方使用 StringId。尤其是如果这个标识符在数据中使用了多个地方。使用 StringId 的两个优点是:

  • 它不会复制字符串数据。
  • 它不使用字符串进行比较、分配、复制 Id。

警告

使用 StringIdStaticStrStore 可以(安全地)泄漏内存。为 str 分配的内存将不会在程序结束前释放,就像一个 'static 变量。因此,如果您预计标识符(String/str)将经常更改,则可能应避免使用 StringId 与非不可变 String,或者有意识地这样做。

典型用途可以是:

  • 标签。
  • 跨资源引用,特别是如果您需要序列化/反序列化数据。

技术设计

《StringId》变量仅存储标识符(一个唯一的数字)。而 [str] 存储在单独的位置,每个 Id 的所有副本只占用内存一次,并通过专用类型进行访问。

《stringid》组件设计用于与新类型模式一起使用。因此,通过模块 macros 提供了一些宏,以帮助定义自定义类型。

为了存储 StringId 与相应的 [str] 之间的对应关系,可以使用 StrLookup 的实现。 StrLookupHashMap 使用 std::collections::HashMapStaticStrStore 实现 StrLookup

更多详细信息,请参阅相关文档。

快速入门

use std::{mem::size_of, str::FromStr};
use stringid::macros::{strlookup_hashmap, StringIdImpl};
use stringid::{create_hash_map, BufferStrStore, StringId};

// Create a struct type `CustomIdLookup`
// as a `str` lookup with `BufferStrStore` as StrStore.
#[strlookup_hashmap(key = u32, store = BufferStrStore)]
struct CustomIdLookup;

// Create a `StringId` type who use the type `CustomIdLookup`
// as `StrLookup`.
#[derive(Debug, Clone, Copy, StringIdImpl)]
struct CustomId(StringId<u32, CustomIdLookup>);

// Create instances of CustomId from str
let id_1 = CustomId::from_str("Id1").unwrap();
let id_2 = CustomId::from_str("Id2").unwrap();
let id_1_bis = id_1;
let id_1_ter = CustomId::from_str("Id1").unwrap();

// CustomId size is the size of the Id (u32 here)
assert_eq!(size_of::<u32>(), size_of::<CustomId>());

// The Id1 and Id2 are not equal
assert_ne!(id_1,id_2);
// But the id_1 and id_1_bis are
assert_eq!(id_1,id_1_bis);
// as well as id_1 and id_1_ter
assert_eq!(id_1,id_1_ter);

许可证:LGPL-3.0-only

依赖项

~190–320KB