turbo_tasks/
magic_any.rs

1use std::{
2    any::{Any, type_name},
3    fmt::Debug,
4    hash::Hash,
5};
6
7use turbo_dyn_eq_hash::{
8    DynEq, DynHash, impl_eq_for_dyn, impl_hash_for_dyn, impl_partial_eq_for_dyn,
9};
10
11use crate::trace::TraceRawVcs;
12
13pub trait MagicAny: Debug + DynEq + DynHash + TraceRawVcs + Send + Sync + 'static {
14    #[cfg(debug_assertions)]
15    fn magic_type_name(&self) -> &'static str;
16}
17
18impl<T> MagicAny for T
19where
20    T: Debug + Eq + Hash + Send + Sync + TraceRawVcs + 'static,
21{
22    #[cfg(debug_assertions)]
23    fn magic_type_name(&self) -> &'static str {
24        std::any::type_name::<T>()
25    }
26}
27
28impl_partial_eq_for_dyn!(dyn MagicAny);
29impl_eq_for_dyn!(dyn MagicAny);
30impl_hash_for_dyn!(dyn MagicAny);
31
32pub fn any_as_encode<T: Any>(this: &dyn Any) -> &T {
33    if let Some(enc) = this.downcast_ref::<T>() {
34        return enc;
35    }
36    unreachable!(
37        "any_as_encode::<{}> called with invalid type",
38        type_name::<T>()
39    );
40}