1use ::rdll::*;
9use ::storage::*;
10use ::traits::*;
11use ::error::*;
12use std::ffi::*;
13use ::util::*;
14
15
16pub type Reference = ReferenceM<Preserve>;
17
18gen_traits_sexp!(ReferenceM);
19
20
21impl<T: SEXPbucket> ReferenceM<T> {
22 pub fn new<E: ToSEXP>(x: E) -> RResult<ReferenceM<T>> {
23 unsafe {
24 if Rf_isS4(x.s()) != Rboolean::TRUE {
25 return rraise("not an Reference object");
26 }
27 Ok(ReferenceM { data: T::new(x.s()) })
28
29 }
30 }
31 pub fn from_cstring(x: CString) -> RResult<ReferenceM<T>> {
32 unsafe {
33 let res = ReferenceM { data: T::new(R_do_new_object(R_do_MAKE_CLASS(x.as_ptr()))) };
34 if Rf_inherits(res.data.s(), x.as_ptr()) != Rboolean::TRUE {
35 return rraise(format!("error creating Reference object of class: {:?}", x));
36 }
37 Ok(res)
38 }
39
40 }
41
42 pub fn is(&self, clazz: CString) -> bool {
43 unsafe { derives_from(Rf_getAttrib(self.data.s(), R_ClassSymbol), clazz) }
44 }
45}