1use ::rdll::*;
2use traits::*;
3use error::*;
4use vectorx::*;
5
6pub trait RName: ToSEXP + RSize {
7 fn get_name<D: RNew>(&self) -> RResult<D> {
8 D::rnew(unsafe { Rf_getAttrib(self.s(), R_NamesSymbol) })
9 }
10 fn name(&self) -> CharVec {
11 unsafe { CharVec::urnew(Rf_getAttrib(self.s(), R_NamesSymbol) )}
12 }
13 unsafe fn namesexp(&self) -> SEXP {
14 Rf_getAttrib(self.s(), R_NamesSymbol)
15 }
16 fn set_name(&self, attr: &CharVec) -> RResult<()> {
17 unsafe {
18 if self.rsize() == Rf_xlength(self.s()) {
19 Rf_setAttrib(self.s(), R_NamesSymbol, attr.s());
20 return Ok(());
21 }
22 rraise("CharVec length is not the same as the vector.")
23 }
24 }
25 unsafe fn uset_name(&self, attr: &CharVec) {
26 Rf_setAttrib(self.s(), R_NamesSymbol, attr.s());
27 }
28}