1use ::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