1use crate::func::SendSync;
4use std::any::{type_name, Any, TypeId};
5#[cfg(feature = "no_std")]
6use std::prelude::v1::*;
7
8mod private {
9 use crate::func::SendSync;
10 use std::any::Any;
11
12 pub trait Sealed {}
14
15 impl<T: Any + Clone + SendSync> Sealed for T {}
16}
17
18#[cfg(not(feature = "sync"))]
26pub trait Variant: Any + private::Sealed {
27 #[must_use]
29 fn as_any(&self) -> &dyn Any;
30
31 #[must_use]
33 fn as_any_mut(&mut self) -> &mut dyn Any;
34
35 #[must_use]
37 fn as_boxed_any(self: Box<Self>) -> Box<dyn Any>;
38
39 #[must_use]
41 fn type_name(&self) -> &'static str;
42
43 #[must_use]
45 fn clone_object(&self) -> Box<dyn Variant>;
46}
47
48#[cfg(feature = "sync")]
53pub trait Variant: Any + Send + Sync + private::Sealed {
54 #[must_use]
56 fn as_any(&self) -> &dyn Any;
57
58 #[must_use]
60 fn as_any_mut(&mut self) -> &mut dyn Any;
61
62 #[must_use]
64 fn as_boxed_any(self: Box<Self>) -> Box<dyn Any>;
65
66 #[must_use]
68 fn type_name(&self) -> &'static str;
69
70 #[must_use]
72 fn clone_object(&self) -> Box<dyn Variant>;
73}
74
75impl<T: Any + Clone + SendSync> Variant for T {
76 #[inline(always)]
77 fn as_any(&self) -> &dyn Any {
78 self
79 }
80 #[inline(always)]
81 fn as_any_mut(&mut self) -> &mut dyn Any {
82 self
83 }
84 #[inline(always)]
85 fn as_boxed_any(self: Box<Self>) -> Box<dyn Any> {
86 self
87 }
88 #[inline(always)]
89 fn type_name(&self) -> &'static str {
90 type_name::<T>()
91 }
92 #[inline(always)]
93 fn clone_object(&self) -> Box<dyn Variant> {
94 Box::new(self.clone()) as Box<dyn Variant>
95 }
96}
97
98impl dyn Variant {
99 #[inline(always)]
101 #[must_use]
102 pub fn is<T: Any>(&self) -> bool {
103 TypeId::of::<T>() == self.type_id()
104 }
105}