use crate::func::SendSync;
use std::any::{type_name, Any, TypeId};
#[cfg(feature = "no_std")]
use std::prelude::v1::*;
mod private {
use crate::func::SendSync;
use std::any::Any;
pub trait Sealed {}
impl<T: Any + Clone + SendSync> Sealed for T {}
}
#[cfg(not(feature = "sync"))]
pub trait Variant: Any + private::Sealed {
#[must_use]
fn as_any(&self) -> &dyn Any;
#[must_use]
fn as_any_mut(&mut self) -> &mut dyn Any;
#[must_use]
fn as_boxed_any(self: Box<Self>) -> Box<dyn Any>;
#[must_use]
fn type_name(&self) -> &'static str;
#[must_use]
fn clone_object(&self) -> Box<dyn Variant>;
}
#[cfg(feature = "sync")]
pub trait Variant: Any + Send + Sync + private::Sealed {
#[must_use]
fn as_any(&self) -> &dyn Any;
#[must_use]
fn as_any_mut(&mut self) -> &mut dyn Any;
#[must_use]
fn as_boxed_any(self: Box<Self>) -> Box<dyn Any>;
#[must_use]
fn type_name(&self) -> &'static str;
#[must_use]
fn clone_object(&self) -> Box<dyn Variant>;
}
impl<T: Any + Clone + SendSync> Variant for T {
#[inline(always)]
fn as_any(&self) -> &dyn Any {
self
}
#[inline(always)]
fn as_any_mut(&mut self) -> &mut dyn Any {
self
}
#[inline(always)]
fn as_boxed_any(self: Box<Self>) -> Box<dyn Any> {
self
}
#[inline(always)]
fn type_name(&self) -> &'static str {
type_name::<T>()
}
#[inline(always)]
fn clone_object(&self) -> Box<dyn Variant> {
Box::new(self.clone()) as Box<dyn Variant>
}
}
impl dyn Variant {
#[inline(always)]
#[must_use]
pub fn is<T: Any>(&self) -> bool {
TypeId::of::<T>() == self.type_id()
}
}