11个重大版本发布
0.17.0 | 2024年2月21日 |
---|---|
0.15.1 | 2023年12月12日 |
0.13.0 | 2023年10月5日 |
0.11.0 | 2023年6月5日 |
0.0.0 | 2021年6月2日 |
#857 in 数据结构
在 2 个crate中使用(通过 awint)
470KB
11K SLoC
任意宽度的整数
这个crate系统共同构成了一个具有分离的存储和功能结构的、具有手动控制位宽和位宽相关操作的库,类似于大整数库。而不是一个拥有所有分配和功能能力的结构体,这里有3种存储类型来管理分配: InlAwi
、 ExtAwi
和 Awi
。有一个共同的 Bits
引用类型,用于管理固定宽度的算术功能。大多数对 Bits
的操作都是const的,并且没有分配。由 InlAwi
支持的 Bits
可以在编译时和在 no-std
运行时执行大整数算术,而不需要任何分配器。由 ExtAwi
支持的 Bits
可以在运行时使用动态位宽。Awi
具有容量和便宜的位宽调整。如果一个函数完全用 Bits
表达,那么任何 InlAwi
、 ExtAwi
和 Awi
的混合都可以作为该函数的参数使用,这得益于它们的 Deref<Target = Bits>
实现。
还包括一个用于定点数的泛型 FP
结构,目前对其添加更多功能还在进行中。将来,Awi
也应该能够像传统的大整数库一样具有自动调整大小的函数。
Bits
和 InlAwi
由 awint_core
包提供。ExtAwi
、Awi
和 FP
由 awint_ext
包提供。这种划分的原因是为了提供最大程度的灵活性给 no-std
和 no-alloc
用例。ExtAwi
不在 awint_core
下的功能标志内,因为如果一个无 alloc
项目的依赖项是 awint_core
和 awint_macros
(这需要 ExtAwi
),那么标志将激活 awint_core
的公共编译。 awint_macros
包是一个 proc-macro 包,具有多个构建实用工具。 awint_dag
包提供了一种将 awint
类型用作组合逻辑领域特定语言的 (DSL) 方法。 awint
包将这些接口编译在一起,并启用或禁用系统的不同部分,具体取决于这些功能标志。
- "const_support" 启用许多函数需要用于
const
的夜间功能。 - "alloc" 启用需要分配器的部分。
- "std" 启用需要 std 的部分。
- "dag" 启用
awint_dag
。 - "try_support" 启用一些用于
dag::Option
和dag::Result
完全工作的功能。 - "debug" 启用一些开发者函数。
- "rand_support" 启用对
rand_core
的依赖,但不使用其默认功能。 - "serde_support" 启用对
serde
的依赖,但不使用其默认功能。 - "zeroize_support" 启用对
zeroize
的依赖,但不使用其默认功能。
注意:默认情况下,“std”和“try_support”已启用,使用 default-features = false
并选择特定功能以更具体。
注意:截至 Rust 1.70 版本,如果您尝试使用宏与 "const_support",可能会得到奇怪的 "erroneous constant used" 和 "deref_mut" 错误,除非您将这些全部添加到
#![feature(const_trait_impl)]
#![feature(const_mut_refs)]
#![feature(const_option)]
所有 使用宏的 const
上下文中的包根目录。
注意:从 Rust 1.70 版本的某些版本开始,"const_support" 不幸在夜间版本中损坏(请参阅 https://github.com/AaronKutch/awint/issues/19)。
计划中的功能
这些功能目前尚未实现,因为优先考虑其他发展和改进。如果您希望这些功能更快地实现,请提交问题或 PR。
- 我们需要一个宏来优化 2 输入,1 输出函数到我们的 in-place 风格函数。基本 in-place 赋值函数可以具有虚拟对应物(例如,
x.add_(y)
有一个替代的z = x.add(y)
或z = x + y
),该宏优化存储创建和路由。 - 向
awint_dag
中的模拟原语添加一些缺失的函数。 - 还有更多与
awint_dag
相关的事情要做。 - 向
FP
添加更多函数。 - 某种匹配宏。
- 向
Awi
添加传统的整数库函数。 - 如果可能的话,添加一个
const
Karatsuba 算法到乘法,或者向awint_ext
添加一个fast_mul
函数。 - 更好的字符串序列化和反序列化性能。大多数基本数值函数都经过了良好优化,但与可能达到的性能相比,当前的序列化性能非常糟糕。
- 将自定义分配器参数添加到
ExtAwi
- 某些格式化和序列化特质实现需要更多工作。
- 使 "const_support" 在稳定版本中编译。这些crate中几乎每个不稳定的特性都使用了某种
const
特性,并有望很快稳定下来。
依赖项
~1MB
~15K SLoC