rustr/
rchar.rs

1use storage::*;
2use traits::*;
3use error::*;
4use rtype::*;
5use rdll::*;
6
7pub struct RCharM<T:SEXPbucket>{
8	data:T
9}
10pub type RChar = RCharM<Preserve>;
11
12impl<T:SEXPbucket>  RCharM<T>{
13	pub fn new<E: ToSEXP>(x:SEXP)->RResult<Self>{
14		if RTYPEOF(x) != CHARSXP {
15            return rraise("not a CHARSXP");
16        }
17		Ok(RCharM { data: T::new(x) })
18	}
19	pub fn na_char()->RCharM<NoProtect>{
20		RCharM { data: NoProtect::new(unsafe { R_NaString }) }
21	}
22	pub fn na()->SEXP{
23		unsafe { R_NaString }
24	}
25}
26
27
28impl<T:SEXPbucket> RNew for RCharM<T>{
29	fn rnew(x:SEXP)->RResult<Self>{
30				if RTYPEOF(x) != CHARSXP {
31            return rraise("not a CHARSXP");
32        }
33		Ok(RCharM { data: T::new(x) })
34	}
35}
36
37impl<T:SEXPbucket> URNew for RCharM<T>{
38	unsafe fn urnew(x:SEXP)->Self{
39		RCharM { data: T::new(x) }
40	}
41}
42
43impl<T:SEXPbucket> IntoR for RCharM<T>{
44	fn intor(&self)->RResult<SEXP>{
45		Ok(unsafe{self.data.s()})
46	}
47}
48
49impl<T:SEXPbucket> UIntoR for RCharM<T>{
50	unsafe fn uintor(&self)-> SEXP{
51		self.data.s()
52	}
53}
54
55impl<T: SEXPbucket> ToSEXP for RCharM<T> {
56    unsafe fn s(&self) -> SEXP {
57        self.data.s()
58    }
59}
60
61impl<T: SEXPbucket> SetSelf for RCharM<T> {
62    fn set(&mut self, x: Self) {
63        unsafe{self.data.set(x.s());}
64    }
65}
66
67impl<T: SEXPbucket> Shallow for RCharM<T> {
68    fn sc(&self) ->Self{
69        unsafe{ RCharM{data: T::new(self.s())}}
70    }
71}
72
73impl<T: SEXPbucket> Clone for RCharM<T> {
74    fn clone(&self) -> Self {
75        unsafe { RCharM { data: T::new(Rf_duplicate(self.data.s()))} }
76    }
77}
78impl<T: SEXPbucket> RObjClass for RCharM<T> {
79    type Origin = RCharM<T>;
80}
81
82use std::ffi::*;
83
84impl<T: SEXPbucket,D:Into<CString>>  From<D> for RCharM<T>{
85	fn from(x:D)->RCharM<T>{
86		unsafe {RCharM { data: T::new(Rf_mkChar(x.into().as_ptr()))}}
87	}
88}