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}