// codesnip-guard: AssociatedValue #[cfg_attr(any(),rustfmt::skip)]pub use self::associated_value::AssociatedValue;#[cfg_attr(any(),rustfmt::skip)]mod associated_value{#[doc=" Trait for a modifiable value associated with a type."]pub trait AssociatedValue{#[doc=" Type of value."]type T:'static+Clone;unsafe fn __local_key()->&'static std::thread::LocalKey>;#[inline]fn get()->Self::T{Self::with(Clone::clone)}#[inline]fn set(x:Self::T){unsafe{Self::__local_key().with(|cell|cell.set(x))}}#[inline]fn replace(x:Self::T)->Self::T{unsafe{Self::__local_key().with(|cell|cell.replace(x))}}#[inline]fn with(f:F)->R where F:FnOnce(&Self::T)->R{unsafe{Self::__local_key().with(|cell|f(&*cell.as_ptr()))}}#[inline]fn modify(f:F)->R where F:FnOnce(&mut Self::T)->R{unsafe{Self::__local_key().with(|cell|f(&mut*cell.as_ptr()))}}}#[doc=" Implement [`AssociatedValue`]."]#[doc=""]#[doc=" [`AssociatedValue`]: super::AssociatedValue"]#[doc=""]#[doc=" # Examples"]#[doc=""]#[doc=" ```"]#[doc=" use competitive::tools::AssociatedValue;"]#[doc=" enum X {}"]#[doc=" competitive::impl_assoc_value!(X, usize, 1);"]#[doc=" assert_eq!(X::get(), 1);"]#[doc=" X::set(10);"]#[doc=" assert_eq!(X::get(), 10);"]#[doc=" ```"]#[doc=""]#[doc=" init with `Default::default()`"]#[doc=""]#[doc=" ```"]#[doc=" use competitive::tools::AssociatedValue;"]#[doc=" enum X {}"]#[doc=" competitive::impl_assoc_value!(X, usize);"]#[doc=" assert_eq!(X::get(), Default::default());"]#[doc=" ```"]#[macro_export]macro_rules!impl_assoc_value{($name:ident,$t:ty)=>{$crate::impl_assoc_value!($name,$t,Default::default());};($name:ident,$t:ty,$e:expr)=>{impl AssociatedValue for$name{type T=$t;#[inline]unsafe fn __local_key()->&'static::std::thread::LocalKey<::std::cell::Cell>{::std::thread_local!(static __LOCAL_KEY: ::std::cell::Cell<$t> =::std::cell::Cell::new($e));&__LOCAL_KEY}}};}}