aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout_2020/flow_ref.rs
blob: f13a562927c72e0e533dbddf0ecfe6aaddf5e3c2 (plain) (blame)
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
/* 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 crate::flow::Flow;
use std::ops::Deref;
use std::sync::Arc;

#[derive(Clone, Debug)]
pub struct FlowRef(Arc<dyn Flow>);

impl Deref for FlowRef {
    type Target = dyn Flow;
    fn deref(&self) -> &dyn Flow {
        self.0.deref()
    }
}

impl FlowRef {
    pub fn new(mut r: Arc<dyn Flow>) -> Self {
        assert!(Arc::get_mut(&mut r).is_some());
        FlowRef(r)
    }

    #[allow(unsafe_code)]
    pub fn deref_mut(this: &mut FlowRef) -> &mut dyn Flow {
        let ptr: *const dyn Flow = &*this.0;
        unsafe { &mut *(ptr as *mut dyn Flow) }
    }
}