rustr/
name_object.rs

1//! Named Object Proxy
2//!
3//!
4
5use ::rdll::*;
6use ::traits::*;
7use ::util::*;
8use error::*;
9
10pub type NameObject<'a> = NameObj<'a, SEXP>;
11
12pub struct NameObj<'a, T: 'a + ToSEXP> {
13    name: SEXP,
14    obj: &'a T,
15}
16
17impl<'a, S: ToSEXP> ToSEXP for NameObj<'a, S> {
18    unsafe fn s(&self) -> SEXP {
19        self.obj.s()
20    }
21}
22
23impl<'a, T: ToSEXP> IntoR for NameObj<'a, T> {
24    fn intor(&self) -> RResult<SEXP> {
25        Ok(unsafe { self.obj.s() })
26    }
27}
28
29impl<'a, T: ToSEXP> UIntoR for NameObj<'a, T> {
30    unsafe fn uintor(&self) -> SEXP {
31        self.obj.s()
32    }
33}
34
35impl<'a, T: ToSEXP> Named for NameObj<'a, T> {
36    fn named(&self) -> bool {
37        true
38    }
39    fn name(&self) -> SEXP {
40        self.name
41    }
42}
43
44impl<'a, T: 'a + ToSEXP> NameObj<'a, T> {
45    pub fn from_str(x: &str, obj_: &'a T) -> NameObj<'a, T> {
46        NameObj {
47            name: unsafe { Rf_install(c_str(x).as_ptr()) },
48            obj: obj_,
49        }
50    }
51
52    pub fn from_named_obj(x: &'a NameObj<T>) -> NameObj<'a, T> {
53        NameObj {
54            name: x.name,
55            obj: x.obj,
56        }
57    }
58    #[allow(non_snake_case)]
59    pub fn from_SEXP(x: SEXP, obj_: &'a T) -> NameObj<'a, T> {
60        NameObj {
61            name: x,
62            obj: obj_,
63        }
64    }
65    pub fn from_ref<E: AsRef<T>>(x: SEXP, obj_: &'a E) -> NameObj<'a, T> {
66        NameObj {
67            name: x,
68            obj: obj_.as_ref(),
69        }
70    }
71}
72
73pub fn n_<'a, T: ToSEXP>(x: &str, obj_: &'a T) -> NameObj<'a, T> {
74    NameObj::from_str(x, obj_)
75}
76
77// create a named object n_("name",obj)