Crates.io | count-tys |
lib.rs | count-tys |
version | 0.1.2 |
source | src |
created_at | 2020-04-25 09:18:24.77028 |
updated_at | 2020-04-25 10:56:24.06871 |
description | Function-like procedural macro that accepts a comma-delimited :ty TokenTree sequence and returns their count as a constant usize |
homepage | |
repository | https://github.com/JohnScience/count_tys |
max_upload_size | |
id | 233899 |
size | 9,858 |
Returns the count of comma-delimited :ty
s (types) in the given TokenStream
as a constant expression of type usize
input
- A TokenStream
in which comma-delimited :ty
s (types) must be counted// count_tys!($($ty:ty),*)
/*
[dependencies]
proc-macro-hack = "0.5"
count-tys = "0.1"
*/
extern crate proc_macro_hack;
use proc_macro_hack::proc_macro_hack;
#[proc_macro_hack]
use count_tts::count_tys;
// It not necessarily must be a struct, it could be a generic
// Read more about macro_rules! here:
// <https://doc.rust-lang.org/rust-by-example/macros.html>
macro_rules! declare_variadic_struct {
($struct_name:ident, <$($ty:ty),*>) => {
struct $struct_name {
// fields
}
impl $struct_name {
pub const fn count() -> usize {
// count_tys!() can be used in an expression and even
// const expression context
// unlike macros without proc_macro_hack
// note: see issue #54727
// <https://github.com/rust-lang/rust/issues/54727>
// for more information.
count_tys!($($ty:ty),*)
}
}
};
}
// declare_variadic_struct!(VariadicStruct, <usize, usize, usize>);
// expands into the following:
//
// struct VariadicStruct {
// // fields
// }
//
// impl VariadicStuct {
// pub const fn count() -> usize {
// 3usize
// }
// }
declare_variadic_struct!(VariadicStruct, <usize, usize, usize>);
assert_eq!(VariadicStruct::count(), 3);