rustr/
reference.rs

1//! R RC type
2//!
3//!
4//!
5
6
7
8use ::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}