1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
use std::cell::UnsafeCell; use std::marker::PhantomData; use serde::{Deserialize, Deserializer, Serialize, Serializer}; #[derive(Debug)] pub struct Swear<T, K> { inner: UnsafeCell<T>, key: PhantomData<K>, } impl<T, K> Swear<T, K> { #[inline] pub fn new(value: T) -> Self { Self { inner: UnsafeCell::new(value), key: PhantomData::default(), } } #[inline] pub fn swear(&self, _key: K) -> &mut T { self.as_mut() } #[allow(clippy::mut_from_ref)] #[inline] fn as_mut(&self) -> &mut T { unsafe { &mut *self.inner.get() } } } impl<T, K> From<T> for Swear<T, K> { #[inline] fn from(value: T) -> Self { Self::new(value) } } impl<T, K> AsRef<T> for Swear<T, K> { #[inline] fn as_ref(&self) -> &T { unsafe { &*self.inner.get() } } } impl<T, K> Serialize for Swear<T, K> where T: Serialize, { #[inline] fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer, { self.as_mut().serialize(serializer) } } impl<'de, T, K> Deserialize<'de> for Swear<T, K> where T: Deserialize<'de>, { #[inline] fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>, { Ok(Self::new(T::deserialize(deserializer)?)) } } impl<T, K> Default for Swear<T, K> where T: Default, { #[inline] fn default() -> Self { Self { inner: T::default().into(), key: PhantomData::default(), } } } unsafe impl<T, K> Send for Swear<T, K> where T: Send {} unsafe impl<T, K> Sync for Swear<T, K> where T: Sync {}