rustr/vector/
numvec.rs

1use ::rdll::*;
2use ::storage::*;
3use ::traits::*;
4use ::rtype::*;
5use ::protect::stackp::*;
6use error::*;
7use error::REKind::NotCompatible;
8use std::ops::Range;
9
10
11use std::os::raw::c_double;
12pub type NumVec = NumVecM<Preserve>;
13
14
15gen_traits_sexp!(NumVecM);
16gen_named_vec!(NumVecM, REALSXP, NumVecIter, REAL, c_double);
17
18
19/// Create a NumVec
20///
21#[macro_export]
22macro_rules! numvec {
23    ($($tts:expr),*) => {
24      // count macro parameter learn from rust macro book	
25      {let size = <[()]>::len(&[$(replace_expr!($tts, ())),*]);
26      	
27      // init 
28      let mut res = NumVec::alloc(size as usize);
29	  unsafe{
30      let mut x = 0;
31      $(
32			// skip a warning message 
33			x += 1;
34      		res.uset(x-1 as usize, $tts);
35      		
36      )*      
37	}
38      res
39      }
40    };
41    
42    ($($id:ident ~ $tts:expr),*) => {
43      // count macro parameter learn from rust macro book	
44      {let size = <[()]>::len(&[$(replace_expr!($tts, ())),*]);
45      	
46      // init 
47      let mut res = NumVec::alloc(size as usize);
48	  let mut name = CharVec::alloc(size as usize);
49	  unsafe{
50      let mut x = 0;
51      $(
52			// skip a warning message 
53			x += 1;
54      		res.uset(x-1 as usize , $tts);
55      		name.uset(x-1, stringify!($id));
56      )*
57	}
58	  unsafe{Rf_setAttrib(res.s(), R_NamesSymbol,name.s());}
59      res
60      }
61    }
62}