/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use std::fmt; use std::ops::Deref; use atomic_refcell::AtomicRefCell; use serde::{Serialize, Serializer}; use servo_arc::Arc; pub(crate) struct ArcRefCell { value: Arc>, } impl ArcRefCell { pub fn new(value: T) -> Self { Self { value: Arc::new(AtomicRefCell::new(value)), } } } impl Clone for ArcRefCell { fn clone(&self) -> Self { Self { value: self.value.clone(), } } } impl Default for ArcRefCell where T: Default, { fn default() -> Self { Self { value: Arc::new(AtomicRefCell::new(Default::default())), } } } impl Deref for ArcRefCell { type Target = AtomicRefCell; fn deref(&self) -> &Self::Target { &self.value } } impl fmt::Debug for ArcRefCell where T: fmt::Debug, { fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { self.value.fmt(formatter) } } impl Serialize for ArcRefCell where T: Serialize, { fn serialize(&self, serializer: S) -> Result where S: Serializer, { self.borrow().serialize(serializer) } }