count-tys

Crates.iocount-tys
lib.rscount-tys
version0.1.2
sourcesrc
created_at2020-04-25 09:18:24.77028
updated_at2020-04-25 10:56:24.06871
descriptionFunction-like procedural macro that accepts a comma-delimited :ty TokenTree sequence and returns their count as a constant usize
homepage
repositoryhttps://github.com/JohnScience/count_tys
max_upload_size
id233899
size9,858
Dmitrii - Demenev (JohnScience)

documentation

https://docs.rs/count-tys

README

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);
Commit count: 9

cargo fmt