rustr/vector/
intvec.rs

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