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 88 89 90 91 92 93 94
use std::ops::Deref; use std::ops::DerefMut; use std::rc::Rc; use std::sync::Arc; use crate::access::{Access, AssignError, ImmutAccess, MutAccess, ReflectMut}; use crate::deser::{self, Deser}; impl<'a, T: 'a> Access for &'a T where T: Access, { fn immut_access(&self) -> ImmutAccess { (*self).immut_access() } fn mut_access(&mut self) -> MutAccess { MutAccess::no_funcs(ReflectMut::Immutable) } fn mut_assign<'c, 'b>( &mut self, _tracker: &mut deser::Tracker<'c, 'b>, _probe_only: bool, ) -> Result<(), AssignError> { Err(AssignError::Immutable) } } impl<'a, T: 'a> Access for &'a mut T where T: Access + Deser, { fn immut_access(&self) -> ImmutAccess { (**self).immut_access() } fn mut_access(&mut self) -> MutAccess { (*self).mut_access() } mut_assign_deser!(); } impl<T> Access for Box<T> where T: Access + Deser, { fn immut_access(&self) -> ImmutAccess { self.deref().immut_access() } fn mut_access(&mut self) -> MutAccess { self.deref_mut().mut_access() } mut_assign_deser!(); } impl<T> Access for Rc<T> where T: Access + Deser, { fn immut_access(&self) -> ImmutAccess { self.deref().immut_access() } fn mut_access(&mut self) -> MutAccess { match Rc::get_mut(self) { None => MutAccess::no_funcs(ReflectMut::Immutable), Some(mutref) => mutref.mut_access(), } } mut_assign_deser!(); } impl<T> Access for Arc<T> where T: Access + Deser, { fn immut_access(&self) -> ImmutAccess { self.deref().immut_access() } fn mut_access(&mut self) -> MutAccess { match Arc::get_mut(self) { None => MutAccess::no_funcs(ReflectMut::Immutable), Some(mutref) => mutref.mut_access(), } } mut_assign_deser!(); }