#macro #static #proc-macro

nightly macro count-tys

Function-like procedural macro that accepts a comma-delimited :ty TokenTree sequence and returns their count as a constant usize

3 releases

0.1.2 Apr 25, 2020
0.1.1 Apr 25, 2020
0.1.0 Apr 25, 2020

#2145 in Procedural macros

MIT license

9KB

count_tys!() function-like macro

Returns the count of comma-delimited :tys (types) in the given TokenStream as a constant expression of type usize

Arguments

  • input - A TokenStream in which comma-delimited :tys (types) must be counted

Examples

Basic usage

// count_tys!($($ty:ty),*)

More complete example

Cargo.toml

/*
[dependencies]
proc-macro-hack = "0.5"
count-tys = "0.1"
*/

main.rs

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);

Dependencies

~1.5MB
~37K SLoC