dlopen2/symbor/
reference.rs

1use super::super::err::Error;
2use super::from_raw::{FromRawResult, RawResult};
3
4use std::ops::Deref;
5
6/// Safe wrapper around cont reference.
7///
8/// This type is intended to be used only inside structures implementing `SymBorApi` trait.
9/// In other cases you can as well use normal Rust reference.
10#[derive(Debug, Clone, Copy)]
11pub struct Ref<'lib, T: 'lib> {
12    reference: &'lib T,
13}
14
15impl<'lib, T> Ref<'lib, T> {
16    pub fn new(reference: &'lib T) -> Ref<'lib, T> {
17        Ref { reference }
18    }
19}
20
21impl<'lib, T> FromRawResult for Ref<'lib, T> {
22    unsafe fn from_raw_result(raw_result: RawResult) -> Result<Self, Error> {
23        match raw_result {
24            Ok(ptr) => {
25                if ptr.is_null() {
26                    Err(Error::NullSymbol)
27                } else {
28                    Ok(Ref {
29                        reference: &*(*ptr as *const T),
30                    })
31                }
32            }
33            Err(err) => Err(err),
34        }
35    }
36}
37
38impl<'lib, T> Deref for Ref<'lib, T> {
39    type Target = T;
40    fn deref(&self) -> &T {
41        self.reference
42    }
43}
44
45unsafe impl<'lib, T: Send> Send for Ref<'lib, T> {}
46unsafe impl<'lib, T: Sync> Sync for Ref<'lib, T> {}