#tuple #indexing #type #reflection

macro no-std type_at_derive

Provides the #[derive(TypeAt)] proc. macro.

1 unstable release

Uses new Rust 2021

0.1.0 Oct 8, 2021

#20 in #reflection

23 downloads per month
Used in type_at

MIT/Apache

6KB
111 lines

Type Indexing into Rust Tuples

Provides a trait TypeAt which allow to query the n-th type of a Rust tuple at compile time.

Example: Simple

use type_at::TypeAt;

let _: i8  = <(i8, i16, i32, i64) as TypeAt<0>>::Type::default();
let _: i16 = <(i8, i16, i32, i64) as TypeAt<1>>::Type::default();
let _: i32 = <(i8, i16, i32, i64) as TypeAt<2>>::Type::default();
let _: i64 = <(i8, i16, i32, i64) as TypeAt<3>>::Type::default();

Example: Nested

use type_at::TypeAt;

let _: i64 = <<<<(i8, (i16, (i32, (i64,))))
    as TypeAt<1>>::Type // (i16, (i32, (i64,)))
    as TypeAt<1>>::Type // (i32, (i64,))
    as TypeAt<1>>::Type // (i64,)
    as TypeAt<0>>::Type::default();

Example: Derive

#[derive(TypeAt)]
pub struct TupleStruct(i8, i16, i32);

let _: i8   = <TupleStruct as TypeAt<0>>::Type::default();
let _: i16  = <TupleStruct as TypeAt<1>>::Type::default();
let _: i32  = <TupleStruct as TypeAt<2>>::Type::default();
#[derive(TypeAt)]
pub struct Struct { a: i8, b: i16, c: i32 }

let _: i8   = <Struct as TypeAt<0>>::Type::default();
let _: i16  = <Struct as TypeAt<1>>::Type::default();
let _: i32  = <Struct as TypeAt<2>>::Type::default();

License

Licensed under either of

at your option.

Dual licence: ![badge][license-mit-badge] ![badge][license-apache-badge]

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as below, without any additional terms or conditions.

Dependencies

~0.6–1.2MB
~27K SLoC