#codec #decoding

finite_repr

将数据类型与数字进行同构编码/解码

4个版本

0.1.4 2020年7月5日
0.1.3 2020年7月5日
0.1.1 2020年7月5日
0.1.0 2020年7月5日

#1115编码


用于 finite_repr_derive

自定义许可协议

16KB
372

Finite Repr

这个库的存在是为了将具有有限表示形式的数据类型进行编码和解码。 英文请! 好的,好的,这个crate允许您将数据类型转换为数字并回转换(或任何实现了FiniteValue的其他数据类型),假设该数据类型的可能表示形式数量可以用您编码的类型来计数。

你应该使用这个吗?

可能不需要,可能只需坚持使用serde。

在您使用此之前

此crate具有alpha级别的可靠性,并且不太可能是将数据编码到您应用程序中的最有效方法。

在某些情况下,如果您将大型类型编码到小型数据类型中,它将引发panic。虽然我打算解决这些问题,但我鼓励您现在使用它。

好吧,但如何使用这个...

我建议推导实现,而不是手动编写,以确保它们是同构且正确的。

// If you choose to import it, this is how you would do so.
use finite_repr::{FiniteRepr, FiniteDecoding, FiniteEncoding};

#[derive(FiniteRepr, FiniteDecoding, FiniteEncoding)]
struct Character(pub RpgClass, pub Faction);

#[derive(FiniteRepr, FiniteDecoding, FiniteEncoding)]
enum RpgClass { Mage, Knight }

#[derive(FiniteRepr, FiniteDecoding, FiniteEncoding)]
enum Faction {
  GoodGuys,
  ComicallyEvilBadGuys,
  AntagonistWhoMakesYouQuestionYourOwnSenseOfMoralityByTheEndOfThePlot,
}

impl PartialEq for Character { /* ... */ }

fn main() {
  let my_character = Character(RpgClass::Mage, Faction::GoodGuys);
  let encoded = my_character.into_finite::<u16>();
  let decoded = encoded.and_then(Character::from_finite);

  // This assertion will be true.
  assert_eq!(Some(my_character), decoded);
}

为什么存在这个?

这个crate是一个副项目的副产品,该项目完成是可选的。我将其部署到crates.io的主要原因是简化我在自己的项目之间的重用。

此外,我认为这将很有趣,但我还想在我的游戏中将一些具有非常有限可能表示形式的数据类型编码为数字,因为我正在通过特例对象传递它们,而且无法使其泛化。

此crate的缺点

  • 宏的代码可以改进。

  • 此crate很可能在usize中滥用,并可能需要用大小不变的类型替换。我最终会替换它,但目前在代码中使用这个crate。

  • 不支持联合类型,它可能可以添加,但在此刻还不存在。

  • 它不总是优雅地处理整数溢出事件中的失败。

  • 此crate可能不适合编码具有大量表示的数据,例如u128或甚至(u32, u32)

依赖关系

~220KB