#meta #types #trait-object #vtable #slice

nightly metatype

Helper methods to determine whether a type is TraitObject, Slice or Concrete, and work with them respectively

5 releases

0.2.1 Jul 10, 2021
0.2.0 Oct 18, 2019
0.1.2 Jul 23, 2019
0.1.1 Jul 20, 2018
0.1.0 Jul 20, 2018

#2063 in Rust patterns

Download history 195/week @ 2023-10-19 164/week @ 2023-10-26 238/week @ 2023-11-02 204/week @ 2023-11-09 230/week @ 2023-11-16 225/week @ 2023-11-23 210/week @ 2023-11-30 194/week @ 2023-12-07 183/week @ 2023-12-14 165/week @ 2023-12-21 111/week @ 2023-12-28 123/week @ 2024-01-04 132/week @ 2024-01-11 146/week @ 2024-01-18 114/week @ 2024-01-25 107/week @ 2024-02-01

517 downloads per month
Used in 11 crates (2 directly)

MIT/Apache

15KB
255 lines

metatype

Crates.io MIT / Apache 2.0 licensed Build Status

📖 Docs | 💬 Chat

Helper methods to determine whether a type is TraitObject, Slice or Concrete, and work with them respectively.

Examples

assert_eq!(usize::METATYPE, MetaType::Concrete);
assert_eq!(any::Any::METATYPE, MetaType::TraitObject);
assert_eq!(<[u8]>::METATYPE, MetaType::Slice);

let a: Box<usize> = Box::new(123);
assert_eq!(Type::meta_type(&*a), MetaType::Concrete);
let a: Box<dyn any::Any> = a;
assert_eq!(Type::meta_type(&*a), MetaType::TraitObject);

let a = [123,456];
assert_eq!(Type::meta_type(&a), MetaType::Concrete);
let a: &[i32] = &a;
assert_eq!(Type::meta_type(a), MetaType::Slice);

let a: Box<dyn any::Any> = Box::new(123);
let meta: TraitObject = type_coerce(Type::meta(&*a));
println!("vtable: {:?}", meta.vtable);

Note

This currently requires Rust nightly for the raw, specialization and arbitrary_self_types features.

License

Licensed under either of

at your option.

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 above, without any additional terms or conditions.

No runtime deps