1use ::rdll::*;
2use traits::{ToSEXP, SetSEXP, RNew};
3use protect::stackp::Shield;
4
5use util::c_str;
6use error::*;
7
8pub trait RField: ToSEXP+ SetSEXP{
9 fn get<D: RNew>(&self, field_name: &str) -> RResult<D> {
10 unsafe {
11 let call = Shield::new(Rf_lang3(R_DollarSymbol,
12 self.s(),
13 Rf_mkString(c_str(field_name).as_ptr())));
14 RNew::rnew(Rf_eval(call.s(), R_GlobalEnv))
15 }
16 }
17 fn set<T: ToSEXP>(&mut self, field_name: &str, x: T) {
18 unsafe {
19 let dollar = Rf_install(c_str(field_name).as_ptr());
20 let call = Shield::new(Rf_lang4(dollar,
21 self.s(),
22 Rf_mkString(c_str(field_name).as_ptr()),
23 x.s()));
24 self.set_s(Rf_eval(call.s(), R_GlobalEnv));
25 }
26 }
27}