15次重大发布

0.17.0 2024年2月21日
0.14.0 2023年12月5日
0.13.0 2023年10月5日
0.11.0 2023年6月5日
0.1.0 2021年7月6日

#2415 in 数据结构

Download history 52/week @ 2024-03-11 13/week @ 2024-03-18 30/week @ 2024-04-01 6/week @ 2024-04-22 20/week @ 2024-04-29 39/week @ 2024-05-06 28/week @ 2024-05-13 30/week @ 2024-05-20 66/week @ 2024-05-27 38/week @ 2024-06-03 59/week @ 2024-06-10 39/week @ 2024-06-17 17/week @ 2024-06-24

154 每月下载量
用于 5 个crate(2直接使用)

MIT/Apache

210KB
3.5K SLoC

任意宽度整数

这些crate组合形成了一种具有分离存储和功能结构、手动控制位宽和位宽相关操作的大整数库。而不是一个包含所有分配和功能能力的单一结构,有3种存储类型来管理分配: InlAwiExtAwiAwi。存在一个通用的 Bits 引用类型,它管理固定宽度的算术功能。大多数对 Bits 的操作都是const且没有分配。由 InlAwi 支持的 Bits 可在编译时以及在 no-std 运行时执行大整数算术,而不需要任何分配器。由 ExtAwi 支持的 Bits 可在运行时使用动态位宽。Awi 具有容量和廉价的位宽调整。如果一个函数完全用 Bits 表达,那么可以使用它们的 Deref<Target = Bits> 实现将任何 InlAwiExtAwiAwi 的混合用作该函数的参数。

还包括一个用于定点数的泛型 FP 结构,目前对其添加更多功能仍在进行中。将来,Awi 也应该能够像传统的大整数库一样拥有自动调整大小的函数。

awint_core 包提供 BitsInlAwi,而 ExtAwiAwiFPawint_ext 包提供。这种分割的原因是为了给 no-stdno-alloc 用例提供最大的灵活性。ExtAwi 并不在 awint_core 的特性标志下,因为如果无 alloc 的项目同时依赖于 awint_coreawint_macros(这需要 ExtAwi),则特性标志会被激活,以进行 awint_core 的通用编译。awint_macros 包是一个进程宏包,包含多个构造工具。 awint_dag 包提供了一种将 awint 类型作为组合逻辑的领域特定语言(DSL)使用的方法。 awint 包将这些接口一起编译,并根据这些特性标志启用或禁用系统的不同部分。

  • "const_support" 打开夜间特性,这对于许多函数需要 const
  • "alloc" 打开需要分配器的部分
  • "std" 打开需要 std 的部分
  • "dag" 打开 awint_dag
  • "try_support" 打开一些特性,这些特性对于 dag::Optiondag::Result 完全工作所必需的
  • "debug" 打开一些开发者函数
  • "rand_support" 打开对 rand_core 的依赖,而不打开其默认特性
  • "serde_support" 打开对 serde 的依赖,而不打开其默认特性
  • "zeroize_support" 打开对 zeroize 的依赖,而不打开其默认特性

注意:默认情况下,“std”和“try_support”是开启的,使用 default-features = false 并选择特定的特性以更加明确。

注意:截至 Rust 1.70 版本,如果您尝试使用宏与 "const_support" 一起使用,可能会遇到奇怪的“错误常量使用”和“deref_mut”错误,除非您在所有使用宏的 const 上下文中的包根目录中添加所有以下内容:

#![feature(const_trait_impl)]
#![feature(const_mut_refs)]
#![feature(const_option)]

所有 的包根目录。

注意:从一些版本的 Rust 开始,大约是 1.70 版本,"const_support" 在夜间版本中不幸地出现了问题(见 https://github.com/AaronKutch/awint/issues/19)。

计划中的特性

这些目前尚未实现,因为其他发展和改进被优先考虑。如果您希望这些特性更快地实现,请提出问题或 PR。

  • 我们需要一个宏来优化我们的原地风格函数的 2 输入、1 输出函数。基本的原地赋值函数可以有虚拟对应物(例如,x.add_(y) 有一个替代的 z = x.add(y)z = x + y),宏优化存储创建和路由。
  • awint_dag 中的模拟原语添加一些缺失的函数
  • 还有许多事情可以用 awint_dag 来做
  • FP 添加更多函数
  • 一种匹配宏
  • 将传统的大整数库函数添加到 Awi
  • 如果可能,添加一个 const Karatsuba 算法到乘法,或者添加一个 fast_mul 函数到 awint_ext
  • 更好的字符串序列化和反序列化性能。大多数基本数值函数都经过了良好的优化,但与可能的性能相比,序列化性能目前非常差。
  • ExtAwi 添加自定义分配器参数
  • 某些格式化和序列化特质的实现需要更多工作。
  • 使 "const_support" 在稳定版本中可编译。这些 crate 中使用的几乎所有不稳定特性都是某种 const 特性,并有望很快稳定下来。

依赖项

~1MB
~14K SLoC