29个版本
新版本 0.14.2 | 2024年8月23日 |
---|---|
0.14.1 | 2024年1月27日 |
0.13.2 | 2023年7月27日 |
0.13.0 | 2023年3月26日 |
0.5.3 | 2018年12月27日 |
#33 in 进程宏
233,923 每月下载量
用于 336 个crate(9 个直接使用)
38KB
475 行
derive_utils
一个进程宏辅助工具,用于轻松编写枚举的 derive 宏。
使用方法
将以下内容添加到您的 Cargo.toml
[dependencies]
derive_utils = "0.14"
示例
quick_derive!
宏使得像实现 derive 特性到枚举这样的操作变得简单,只要所有变体都实现了该特性。
use derive_utils::quick_derive;
use proc_macro::TokenStream;
#[proc_macro_derive(Iterator)]
pub fn derive_iterator(input: TokenStream) -> TokenStream {
quick_derive! {
input,
// trait path
std::iter::Iterator,
// trait definition
trait Iterator {
type Item;
fn next(&mut self) -> Option<Self::Item>;
fn size_hint(&self) -> (usize, Option<usize>);
}
}
}
#[proc_macro_derive(ExactSizeIterator)]
pub fn derive_exact_size_iterator(input: TokenStream) -> TokenStream {
quick_derive! {
input,
// trait path
std::iter::ExactSizeIterator,
// super trait's associated types
<Item>,
// trait definition
trait ExactSizeIterator: Iterator {
fn len(&self) -> usize;
}
}
}
生成的代码
对于以下类似的枚举 derive
#[derive(Iterator, ExactSizeIterator, Future)]
enum Enum<A, B> {
A(A),
B(B),
}
将生成如下代码
enum Enum<A, B> {
A(A),
B(B),
}
impl<A, B> std::iter::Iterator for Enum<A, B>
where
A: std::iter::Iterator,
B: std::iter::Iterator<Item = <A as std::iter::Iterator>::Item>,
{
type Item = <A as std::iter::Iterator>::Item;
fn next(&mut self) -> Option<Self::Item> {
match self {
Enum::A(x) => x.next(),
Enum::B(x) => x.next(),
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
match self {
Enum::A(x) => x.size_hint(),
Enum::B(x) => x.size_hint(),
}
}
}
impl<A, B> std::iter::ExactSizeIterator for Enum<A, B>
where
A: std::iter::ExactSizeIterator,
B: std::iter::ExactSizeIterator<Item = <A as Iterator>::Item>,
{
fn len(&self) -> usize {
match self {
Enum::A(x) => x.len(),
Enum::B(x) => x.len(),
}
}
}
相关项目
- auto_enums:一个允许通过自动生成枚举实现多个返回类型的库。
- io-enum:#[derive(Read, Write, Seek, BufRead)] 用于枚举。
- iter-enum:#[derive(Iterator, DoubleEndedIterator, ExactSizeIterator, FusedIterator, Extend)] 用于枚举。
许可证
根据您的选择,在 Apache License, Version 2.0 或 MIT许可证 下许可。
除非您明确说明,否则您提交的任何旨在包含在作品中的贡献,根据Apache-2.0许可证的定义,应如上双许可,不附加任何额外条款或条件。
依赖
~270–720KB
~17K SLoC