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#[macro_export]
22macro_rules! numvec {
23 ($($tts:expr),*) => {
24 {let size = <[()]>::len(&[$(replace_expr!($tts, ())),*]);
26
27 let mut res = NumVec::alloc(size as usize);
29 unsafe{
30 let mut x = 0;
31 $(
32 x += 1;
34 res.uset(x-1 as usize, $tts);
35
36 )*
37 }
38 res
39 }
40 };
41
42 ($($id:ident ~ $tts:expr),*) => {
43 {let size = <[()]>::len(&[$(replace_expr!($tts, ())),*]);
45
46 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 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}