10个稳定版本
1.5.3 | 2022年9月2日 |
---|---|
1.5.1 | 2021年10月2日 |
1.4.1 | 2021年9月12日 |
1.4.0 | 2021年5月2日 |
1.3.0 | 2021年4月17日 |
在 过程宏 中排名第802
每月下载量26,737
在 29 个库中使用(通过 core_extensions)
120KB
3.5K SLoC
许多标准/核心库类型/特质的扩展特质,以及其他杂项类型/特质/函数/宏。
添加依赖项
此库需要 cargo 特性以启用项目,要获取所有特性,可以使用
[dependencies.core_extensions]
version = "1.5"
features = [
# enables items that use anything from the standard `std` or `alloc` crates.
"std",
# Requires the latest stable release, enables all the rust-version-dependent features
"rust_latest_stable",
# enables all the item features
"all_items",
]
"std"
特性是启用 impl 和使用 std
类型的项所必需的,否则仅支持 core
库。
"rust_latest_stable"
启用所有 "rust_1_*"
库特性以使用最新的稳定语言特性,这里列出了所有 "rust_1_*"
特性,
"all_items"
启用此库中所有项的启用特性(在此处文档化)
以下是上述配置的展开版本
[dependencies.core_extensions]
version = "1.5"
features = [
"std",
"rust_latest_stable"
# all of the features below are what "all_items" enables
"derive"
"bools",
"callable",
"collections",
"const_default",
"const_val",
"generics_parsing",
"integers",
"item_parsing",
"iterators",
"macro_utils",
"marker_type",
"on_drop",
"option_result",
"phantom",
"self_ops",
"slices",
"strings",
"transparent_newtype",
"type_asserts",
"type_identity",
"type_level_bool",
"void",
]
示例
展示此库的一些特性。
quasiconst
,泛型常量。
quasiconst
宏允许通过生成一个实现了 ConstVal
特性的零大小泛型类型来模拟泛型常量,获取其值的首选方法是使用 getconst
宏。
以下示例展示了如何使用这些宏来声明一个泛型 VTABLE 常量。
use core_extensions::{getconst, quasiconst};
use std::fmt::{self, Debug};
quasiconst!{
pub const VTABLE<T: Debug>: &'static Vtable = &Vtable {
size: std::mem::size_of::<T>(),
align: std::mem::align_of::<T>(),
drop: drop_erased::<T>,
fmt: debug_fmt_erased::<T>,
};
}
fn main() {
const VTABLE_U8: &'static Vtable = getconst!(VTABLE<u8>);
assert_eq!(VTABLE_U8.size, 1);
assert_eq!(VTABLE_U8.align, 1);
const VTABLE_USIZE: &'static Vtable = getconst!(VTABLE<usize>);
assert_eq!(VTABLE_USIZE.size, std::mem::size_of::<usize>());
assert_eq!(VTABLE_USIZE.align, std::mem::align_of::<usize>());
const VTABLE_STRING: &'static Vtable = getconst!(VTABLE<&str>);
assert_eq!(VTABLE_STRING.size, std::mem::size_of::<usize>() * 2);
assert_eq!(VTABLE_STRING.align, std::mem::align_of::<usize>());
}
pub struct Vtable {
pub size: usize,
pub align: usize,
pub drop: unsafe fn(*mut ()),
pub fmt: unsafe fn(*const (), &mut fmt::Formatter<'_>) -> fmt::Result,
}
unsafe fn drop_erased<T>(ptr: *mut ()) {
std::ptr::drop_in_place(ptr as *mut T)
}
unsafe fn debug_fmt_erased<T>(ptr: *const (), f: &mut fmt::Formatter<'_>) -> fmt::Result
where
T: Debug,
{
let this = unsafe{ &*(ptr as *const T) };
Debug::fmt(this, f)
}
Cargo 特性
项目特性
项目特性使本仓库中的项可用。
"all_items"
特性启用所有这些特性,如果您不介意编译时间更长,则可以使用它代替下面的特性。
"all_items_no_derive"
特性除了禁用 "derive"
特性之外,启用了下面所有特性,以减少由于启用 syn
间接依赖而导致的编译时间。
-
"derive"
:启用 core_extensions 中声明的特性的 derive 宏。如果一个特性能使用 derive 宏,它将提及并链接到它。 -
"bools"
:启用BoolExt
特性,这是bool
的扩展特性。 -
"callable"
:启用callable
模块,其中包含稳定可实现的Fn*
特性的等价物。 -
"collections"
:启用collections
模块,其中包含集合类型的特性。 -
"const_default"
:启用ConstDefault
特性,以及const_default
宏,为const
提供与Default
特性等效的功能。 -
"const_val"
:启用ConstVal
特性(用于表示常量的类型),getconst
宏(用于获取ConstVal::VAL
关联常量),以及quasiconst
宏(用于声明模拟泛型常量的类型)。启用"generics_parsing"
特性。 -
"macro_utils
:启用rewrap_macro_parameters
、count_tts
、gen_ident_range
、tokens_method
、compile_error_stringify
和parenthesize_args
宏。同时启用macro_attr
属性。 -
"generics_parsing"
:启用parse_generics
、parse_generics_and_where
、split_generics_and_where
、parse_split_generics
和parse_split_generics_and_where
宏。这些宏允许宏解析带有泛型参数的项目。 -
"item_parsing"
:启用"macro_utils
和"generics_parsing"
功能。启用impl_parse_generics
和impl_split
宏。 -
"integers"
:启用integers
模块,包含整数类型的扩展特质。 -
"iterators"
:启用iterators
模块,包含迭代器的IteratorExt
扩展特质和一些迭代器类型。 -
"marker_type"
:启用MarkerType
特质,用于创建零大小、对齐到1的类型。 -
"on_drop"
:启用RunOnDrop
类型,这是一个包装类型,在作用域结束时运行闭包。 -
"option_result"
:启用option_result_ext
模块,包含Option
和Result
类型的特质。 -
"phantom"
:启用phantom
模块(与PhantomData
相关的项目),expr_as_phantom
宏,map_phantomdata
宏,以及return_type_phantom
宏。 -
"self_ops"
:启用SelfOps
特性,这是一个适用于所有类型的扩展特性。它主要提供了一些将自由函数作为方法调用的方法。 -
"slices"
:启用slices
模块,其中包括为[T]
和str
切片提供的扩展特性。 -
"transparent_newtype"
:启用transparent_newtype
模块,其中包括为具有公共字段的#[repr(transparent)]
新类型提供的扩展特性和函数。
启用 `"marker_type"` 功能。
-
"type_asserts"
:启用type_asserts
模块,其中包括类型级别的断言,在测试中非常有用。 -
"type_identity"
:启用TypeIdentity
特性,用于证明两种类型相等,并在泛型环境中在它们之间进行转换。 -
"type_level_bool"
:启用type_level_bool
模块,它将bool
编码在类型级别。 -
"void"
:启用Void
类型,这是一个不能构造的类型,用于编码不可能的情况。
Rust 版本号
这些功能启用需要高于最小支持版本的 Rust 版本的代码。
-
"rust_1_46": 创建了与
TransparentNewtype
和TypeIdentity
相关联的函数,这些函数可以将Rc<Self>
或Arc<Self>
调用作为方法。 -
"rust_1_51": 启用 "rust_1_46" 功能,并为所有数组长度实现了特质。
-
"rust_latest_stable": 启用所有 "rust_1_*" 功能。这需要 Rust 的最新稳定版,因为可以在任何时候添加更多
"rust_1_*"
功能。
对其他包的支持
默认情况下都禁用
-
"std"
: 启用std
库支持。隐含了"alloc"
功能。 -
"alloc"
: 启用alloc
库支持。 -
"serde_"
: 启用 serde 支持。
其他特性
"track_caller"
: 启用 "rust_1_46" 功能。将 ResultLike
修改为允许在 ResultLike::into_result_
中获取调用者位置,并使 IsNoneError
存储其构造位置。
"docsrs"
: 用于在 docs.rs 中记录所需特性,需要 Rust 夜间版。本身不启用任何项目。
无 std 支持
此包默认在 #![no_std]
上下文中工作。
支持的 Rust 版本
此包支持 Rust 回到 1.41.0,需要 cargo 功能来使用较新版本的编程语言特性。
许可证
core_extensions 根据您的选择许可
Apache License, Version 2.0, (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义的任何有意提交以包含在 core_extensions 中的贡献,将根据上述许可双重许可,不附加任何额外条款或条件。
依赖关系
~0–365KB