1555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// R specific swig components
2555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/*
3555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  Vectors
4555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot*/
5555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
6555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%fragment("StdVectorTraits","header",fragment="StdSequenceTraits")
7555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%{
8555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  namespace swig {
9555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // vectors of doubles
10555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    template <>
11555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      struct traits_from_ptr<std::vector<double> > {
12555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      static SEXP from (std::vector<double > *val, int owner = 0) {
13555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SEXP result;
14555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        PROTECT(result = Rf_allocVector(REALSXP, val->size()));
15555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        for (unsigned pos = 0; pos < val->size(); pos++)
16555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          {
17555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            NUMERIC_POINTER(result)[pos] = ((*val)[pos]);
18555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          }
19555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        UNPROTECT(1);
20555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        return(result);
21555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      }
22555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    };
23555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // vectors of floats
24555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    template <>
25555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      struct traits_from_ptr<std::vector<float> > {
26555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      static SEXP from (std::vector<float > *val, int owner = 0) {
27555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SEXP result;
28555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        PROTECT(result = Rf_allocVector(REALSXP, val->size()));
29555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        for (unsigned pos = 0; pos < val->size(); pos++)
30555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          {
31555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            NUMERIC_POINTER(result)[pos] = ((*val)[pos]);
32555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          }
33555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        UNPROTECT(1);
34555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        return(result);
35555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      }
36555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    };
37555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // vectors of unsigned int
38555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    template <>
39555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      struct traits_from_ptr<std::vector<unsigned int> > {
40555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      static SEXP from (std::vector<unsigned int > *val, int owner = 0) {
41555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SEXP result;
42555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        PROTECT(result = Rf_allocVector(INTSXP, val->size()));
43555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        for (unsigned pos = 0; pos < val->size(); pos++)
44555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          {
45555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            INTEGER_POINTER(result)[pos] = ((*val)[pos]);
46555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          }
47555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        UNPROTECT(1);
48555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        return(result);
49555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      }
50555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    };
51555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // vectors of int
52555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    template <>
53555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      struct traits_from_ptr<std::vector<int> > {
54555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      static SEXP from (std::vector<int > *val, int owner = 0) {
55555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SEXP result;
56555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        PROTECT(result = Rf_allocVector(INTSXP, val->size()));
57555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        for (unsigned pos = 0; pos < val->size(); pos++)
58555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          {
59555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            INTEGER_POINTER(result)[pos] = ((*val)[pos]);
60555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          }
61555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        UNPROTECT(1);
62555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        return(result);
63555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      }
64555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    };
65555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
66555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // vectors of bool
67555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    template <>
68555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      struct traits_from_ptr<std::vector<bool> > {
69555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      static SEXP from (std::vector<bool> *val, int owner = 0) {
70555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SEXP result;
71555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        PROTECT(result = Rf_allocVector(LGLSXP, val->size()));
72555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        for (unsigned pos = 0; pos < val->size(); pos++)
73555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          {
74555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            LOGICAL_POINTER(result)[pos] = ((*val)[pos]);
75555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          }
76555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        UNPROTECT(1);
77555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        return(result);
78555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        //return SWIG_R_NewPointerObj(val, type_info< std::vector<T > >(), owner);
79555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      }
80555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    };
81555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // vectors of strings
82555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    template <>
83555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      struct traits_from_ptr<std::vector<std::basic_string<char> > > {
84555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      static SEXP from (std::vector<std::basic_string<char> > *val, int owner = 0) {
85555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SEXP result;
86555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot         PROTECT(result = Rf_allocVector(STRSXP, val->size()));
87555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot         for (unsigned pos = 0; pos < val->size(); pos++)
88555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot           {
89555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot             CHARACTER_POINTER(result)[pos] = Rf_mkChar(((*val)[pos]).c_str());
90555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot           }
91555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        UNPROTECT(1);
92555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        return(result);
93555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        //return SWIG_R_NewPointerObj(val, type_info< std::vector<T > >(), owner);
94555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      }
95555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    };
96555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
97555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // catch all that does everything with vectors
98555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    template <typename T>
99555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      struct traits_from_ptr< std::vector< T > > {
100555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      static SEXP from (std::vector< T > *val, int owner = 0) {
101555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        return SWIG_R_NewPointerObj(val, type_info< std::vector< T >  >(), owner);
102555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      }
103555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    };
104555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
105555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    template <>
106555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  struct traits_asptr < std::vector<double> > {
107555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    static int asptr(SEXP obj, std::vector<double> **val) {
108555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      std::vector<double> *p;
109555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      // not sure how to check the size of the SEXP obj is correct
110555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      unsigned int sexpsz = Rf_length(obj);
111555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      p = new std::vector<double>(sexpsz);
112555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      double *S = NUMERIC_POINTER(obj);
113555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      for (unsigned pos = 0; pos < p->size(); pos++)
114555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        {
115555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          (*p)[pos] = static_cast<double>(S[pos]);
116555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        }
117555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      int res = SWIG_OK;
118555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      if (SWIG_IsOK(res)) {
119555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        if (val) *val = p;
120555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      }
121555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      return res;
122555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
123555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  };
124555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
125555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    template <>
126555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  struct traits_asptr < std::vector<float> > {
127555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    static int asptr(SEXP obj, std::vector<float> **val) {
128555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      std::vector<float> *p;
129555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      // not sure how to check the size of the SEXP obj is correct
130555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      unsigned int sexpsz = Rf_length(obj);
131555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      p = new std::vector<float>(sexpsz);
132555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      double *S = NUMERIC_POINTER(obj);
133555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      for (unsigned pos = 0; pos < p->size(); pos++)
134555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        {
135555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          (*p)[pos] = static_cast<double>(S[pos]);
136555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        }
137555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      int res = SWIG_OK;
138555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      if (SWIG_IsOK(res)) {
139555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        if (val) *val = p;
140555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      }
141555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      return res;
142555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
143555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  };
144555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
145555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    template <>
146555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  struct traits_asptr < std::vector<unsigned int> > {
147555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    static int asptr(SEXP obj, std::vector<unsigned int> **val) {
148555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      std::vector<unsigned int> *p;
149555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      unsigned int sexpsz = Rf_length(obj);
150555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      p = new std::vector<unsigned int>(sexpsz);
151555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      SEXP coerced;
152555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      PROTECT(coerced = Rf_coerceVector(obj, INTSXP));
153555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      int *S = INTEGER_POINTER(coerced);
154555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      for (unsigned pos = 0; pos < p->size(); pos++)
155555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        {
156555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          (*p)[pos] = static_cast<unsigned int>(S[pos]);
157555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        }
158555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      int res = SWIG_OK;
159555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      if (SWIG_IsOK(res)) {
160555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        if (val) *val = p;
161555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      }
162555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      UNPROTECT(1);
163555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      return res;
164555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
165555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  };
166555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
167555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    template <>
168555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  struct traits_asptr < std::vector<int> > {
169555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    static int asptr(SEXP obj, std::vector<int> **val) {
170555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      std::vector<int> *p;
171555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      // not sure how to check the size of the SEXP obj is correct
172555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      int sexpsz = Rf_length(obj);
173555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      p = new std::vector<int>(sexpsz);
174555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      SEXP coerced;
175555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      PROTECT(coerced = Rf_coerceVector(obj, INTSXP));
176555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      int *S = INTEGER_POINTER(coerced);
177555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      for (unsigned pos = 0; pos < p->size(); pos++)
178555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        {
179555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          (*p)[pos] = static_cast<int>(S[pos]);
180555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        }
181555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      int res = SWIG_OK;
182555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      if (SWIG_IsOK(res)) {
183555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        if (val) *val = p;
184555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      }
185555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      UNPROTECT(1);
186555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      return res;
187555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
188555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  };
189555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
190555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    template <>
191555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  struct traits_asptr < std::vector<bool> > {
192555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    static int asptr(SEXP obj, std::vector<bool> **val) {
193555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      std::vector<bool> *p;
194555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      // not sure how to check the size of the SEXP obj is correct
195555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      int sexpsz = Rf_length(obj);
196555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      p = new std::vector<bool>(sexpsz);
197555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      SEXP coerced;
198555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      PROTECT(coerced = Rf_coerceVector(obj, LGLSXP));
199555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      int *S = LOGICAL_POINTER(coerced);
200555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      for (unsigned pos = 0; pos < p->size(); pos++)
201555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        {
202555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          (*p)[pos] = static_cast<bool>(S[pos]);
203555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        }
204555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      int res = SWIG_OK;
205555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      if (SWIG_IsOK(res)) {
206555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        if (val) *val = p;
207555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      }
208555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      UNPROTECT(1);
209555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      return res;
210555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
211555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  };
212555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
213555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // catchall for R to vector conversion
214555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  template <typename T>
215555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  struct traits_asptr < std::vector<T> > {
216555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    static int asptr(SEXP obj, std::vector<T> **val) {
217555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      std::vector<T> *p;
218555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      Rprintf("my asptr\n");
219555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot     int res = SWIG_R_ConvertPtr(obj, (void**)&p, type_info< std::vector<T> >(), 0);
220555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      if (SWIG_IsOK(res)) {
221555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        if (val) *val = p;
222555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      }
223555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      return res;
224555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
225555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  };
226555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
227555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // now for vectors of vectors. These will be represented as lists of vectors on the
228555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // catch all that does everything with vectors
229555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  template <>
230555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    struct traits_from_ptr<std::vector<std::vector<unsigned int> > > {
231555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      static SEXP from (std::vector< std::vector<unsigned int > > *val, int owner = 0) {
232555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SEXP result;
233555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        // allocate the R list
234555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        PROTECT(result = Rf_allocVector(VECSXP, val->size()));
235555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        for (unsigned pos = 0; pos < val->size(); pos++)
236555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          {
237555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            // allocate the R vector
238555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            SET_VECTOR_ELT(result, pos, Rf_allocVector(INTSXP, val->at(pos).size()));
239555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            // Fill the R vector
240555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            for (unsigned vpos = 0; vpos < val->at(pos).size(); ++vpos)
241555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot              {
242555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                INTEGER_POINTER(VECTOR_ELT(result, pos))[vpos] = static_cast<int>(val->at(pos).at(vpos));
243555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot              }
244555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          }
245555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        UNPROTECT(1);
246555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        return(result);
247555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      }
248555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    };
249555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
250555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  template <>
251555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    struct traits_from_ptr<std::vector<std::vector<int> > > {
252555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      static SEXP from (std::vector< std::vector<int > > *val, int owner = 0) {
253555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SEXP result;
254555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        // allocate the R list
255555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        PROTECT(result = Rf_allocVector(VECSXP, val->size()));
256555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        for (unsigned pos = 0; pos < val->size(); pos++)
257555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          {
258555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            // allocate the R vector
259555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            SET_VECTOR_ELT(result, pos, Rf_allocVector(INTSXP, val->at(pos).size()));
260555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            // Fill the R vector
261555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            for (unsigned vpos = 0; vpos < val->at(pos).size(); ++vpos)
262555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot              {
263555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                INTEGER_POINTER(VECTOR_ELT(result, pos))[vpos] = static_cast<int>(val->at(pos).at(vpos));
264555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot              }
265555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          }
266555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        UNPROTECT(1);
267555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        return(result);
268555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      }
269555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    };
270555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
271555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  template <>
272555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    struct traits_from_ptr<std::vector<std::vector<float> > > {
273555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      static SEXP from (std::vector< std::vector<float > > *val, int owner = 0) {
274555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SEXP result;
275555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        // allocate the R list
276555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        PROTECT(result = Rf_allocVector(VECSXP, val->size()));
277555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        for (unsigned pos = 0; pos < val->size(); pos++)
278555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          {
279555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            // allocate the R vector
280555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            SET_VECTOR_ELT(result, pos, Rf_allocVector(REALSXP, val->at(pos).size()));
281555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            // Fill the R vector
282555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            for (unsigned vpos = 0; vpos < val->at(pos).size(); ++vpos)
283555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot              {
284555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                NUMERIC_POINTER(VECTOR_ELT(result, pos))[vpos] = static_cast<double>(val->at(pos).at(vpos));
285555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot              }
286555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          }
287555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        UNPROTECT(1);
288555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        return(result);
289555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      }
290555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    };
291555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
292555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  template <>
293555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    struct traits_from_ptr<std::vector<std::vector<double> > > {
294555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      static SEXP from (std::vector< std::vector<double > > *val, int owner = 0) {
295555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SEXP result;
296555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        // allocate the R list
297555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        PROTECT(result = Rf_allocVector(VECSXP, val->size()));
298555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        for (unsigned pos = 0; pos < val->size(); pos++)
299555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          {
300555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            // allocate the R vector
301555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            SET_VECTOR_ELT(result, pos, Rf_allocVector(REALSXP, val->at(pos).size()));
302555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            // Fill the R vector
303555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            for (unsigned vpos = 0; vpos < val->at(pos).size(); ++vpos)
304555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot              {
305555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                NUMERIC_POINTER(VECTOR_ELT(result, pos))[vpos] = static_cast<double>(val->at(pos).at(vpos));
306555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot              }
307555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          }
308555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        UNPROTECT(1);
309555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        return(result);
310555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      }
311555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    };
312555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
313555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  template <>
314555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    struct traits_from_ptr<std::vector<std::vector<bool> > > {
315555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      static SEXP from (std::vector< std::vector<bool> > *val, int owner = 0) {
316555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SEXP result;
317555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        // allocate the R list
318555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        PROTECT(result = Rf_allocVector(VECSXP, val->size()));
319555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        for (unsigned pos = 0; pos < val->size(); pos++)
320555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          {
321555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            // allocate the R vector
322555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            SET_VECTOR_ELT(result, pos, Rf_allocVector(LGLSXP, val->at(pos).size()));
323555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            // Fill the R vector
324555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            for (unsigned vpos = 0; vpos < val->at(pos).size(); ++vpos)
325555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot              {
326555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                LOGICAL_POINTER(VECTOR_ELT(result, pos))[vpos] = (val->at(pos).at(vpos));
327555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot              }
328555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          }
329555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        UNPROTECT(1);
330555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        return(result);
331555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      }
332555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    };
333555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
334555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  template <typename T>
335555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    struct traits_from_ptr< std::vector < std::vector< T > > > {
336555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    static SEXP from (std::vector < std::vector< T > > *val, int owner = 0) {
337555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      return SWIG_R_NewPointerObj(val, type_info< std::vector < std::vector< T > > >(), owner);
338555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
339555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  };
340555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
341555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // R side
342555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  template <>
343555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    struct traits_asptr < std::vector< std::vector<unsigned int> > > {
344555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    static int asptr(SEXP obj, std::vector< std::vector<unsigned int> > **val) {
345555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      std::vector <std::vector<unsigned int> > *p;
346555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      // this is the length of the list
347555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      unsigned int sexpsz = Rf_length(obj);
348555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      p = new std::vector< std::vector<unsigned int> > (sexpsz);
349555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
350555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      for (unsigned listpos = 0; listpos < sexpsz; ++listpos)
351555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        {
352555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          unsigned vecsize = Rf_length(VECTOR_ELT(obj, listpos));
353555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          for (unsigned vpos = 0; vpos < vecsize; ++vpos)
354555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            {
355555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot              (*p)[listpos].push_back(static_cast<int>(INTEGER_POINTER(VECTOR_ELT(obj, listpos))[vpos]));
356555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            }
357555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        }
358555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
359555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      int res = SWIG_OK;
360555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
361555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      if (SWIG_IsOK(res)) {
362555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        if (val) *val = p;
363555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      }
364555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      return res;
365555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
366555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  };
367555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
368555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  template <>
369555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    struct traits_asptr < std::vector< std::vector< int> > > {
370555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    static int asptr(SEXP obj, std::vector< std::vector< int> > **val) {
371555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      std::vector <std::vector< int> > *p;
372555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      // this is the length of the list
373555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      unsigned int sexpsz = Rf_length(obj);
374555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      p = new std::vector< std::vector< int> > (sexpsz);
375555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
376555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      for (unsigned listpos = 0; listpos < sexpsz; ++listpos)
377555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        {
378555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          unsigned vecsize = Rf_length(VECTOR_ELT(obj, listpos));
379555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          for (unsigned vpos = 0; vpos < vecsize; ++vpos)
380555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            {
381555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot              (*p)[listpos].push_back(static_cast<int>(INTEGER_POINTER(VECTOR_ELT(obj, listpos))[vpos]));
382555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            }
383555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        }
384555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
385555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      int res = SWIG_OK;
386555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
387555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      if (SWIG_IsOK(res)) {
388555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        if (val) *val = p;
389555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      }
390555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      return res;
391555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
392555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  };
393555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
394555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  template <>
395555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    struct traits_asptr < std::vector< std::vector< float> > > {
396555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    static int asptr(SEXP obj, std::vector< std::vector< float> > **val) {
397555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      std::vector <std::vector< float> > *p;
398555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      // this is the length of the list
399555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      unsigned int sexpsz = Rf_length(obj);
400555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      p = new std::vector< std::vector< float> > (sexpsz);
401555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
402555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      for (unsigned listpos = 0; listpos < sexpsz; ++listpos)
403555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        {
404555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          unsigned vecsize = Rf_length(VECTOR_ELT(obj, listpos));
405555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          for (unsigned vpos = 0; vpos < vecsize; ++vpos)
406555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            {
407555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot              (*p)[listpos].push_back(static_cast<float>(NUMERIC_POINTER(VECTOR_ELT(obj, listpos))[vpos]));
408555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            }
409555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        }
410555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
411555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      int res = SWIG_OK;
412555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
413555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      if (SWIG_IsOK(res)) {
414555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        if (val) *val = p;
415555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      }
416555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      return res;
417555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
418555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  };
419555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
420555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  template <>
421555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    struct traits_asptr < std::vector< std::vector< double> > > {
422555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    static int asptr(SEXP obj, std::vector< std::vector< double> > **val) {
423555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      std::vector <std::vector< double> > *p;
424555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      // this is the length of the list
425555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      unsigned int sexpsz = Rf_length(obj);
426555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      p = new std::vector< std::vector< double> > (sexpsz);
427555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
428555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      for (unsigned listpos = 0; listpos < sexpsz; ++listpos)
429555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        {
430555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          unsigned vecsize = Rf_length(VECTOR_ELT(obj, listpos));
431555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          for (unsigned vpos = 0; vpos < vecsize; ++vpos)
432555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            {
433555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot              (*p)[listpos].push_back(static_cast<double>(NUMERIC_POINTER(VECTOR_ELT(obj, listpos))[vpos]));
434555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            }
435555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        }
436555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
437555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      int res = SWIG_OK;
438555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
439555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      if (SWIG_IsOK(res)) {
440555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        if (val) *val = p;
441555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      }
442555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      return res;
443555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
444555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  };
445555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
446555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  template <>
447555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    struct traits_asptr < std::vector< std::vector< bool > > > {
448555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    static int asptr(SEXP obj, std::vector< std::vector< bool> > **val) {
449555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      std::vector <std::vector< bool > > *p;
450555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      // this is the length of the list
451555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      unsigned int sexpsz = Rf_length(obj);
452555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      p = new std::vector< std::vector< bool > > (sexpsz);
453555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
454555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      for (unsigned listpos = 0; listpos < sexpsz; ++listpos)
455555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        {
456555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          unsigned vecsize = Rf_length(VECTOR_ELT(obj, listpos));
457555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          for (unsigned vpos = 0; vpos < vecsize; ++vpos)
458555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            {
459555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot              (*p)[listpos].push_back(static_cast<bool>(LOGICAL_POINTER(VECTOR_ELT(obj, listpos))[vpos]));
460555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            }
461555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        }
462555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
463555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      int res = SWIG_OK;
464555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
465555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      if (SWIG_IsOK(res)) {
466555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        if (val) *val = p;
467555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      }
468555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      return res;
469555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
470555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  };
471555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
472555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  //  catchall
473555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  template <typename T>
474555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    struct traits_asptr < std::vector< std::vector<T> > > {
475555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    static int asptr(SEXP obj, std::vector< std::vector<T> > **val) {
476555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      std::vector< std::vector<T> > *p;
477555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      Rprintf("vector of vectors - unsupported content\n");
478555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      int res = SWIG_R_ConvertPtr(obj, (void**)&p, type_info< std::vector< std::vector<T> > > (), 0);
479555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      if (SWIG_IsOK(res)) {
480555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        if (val) *val = p;
481555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      }
482555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      return res;
483555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
484555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  };
485555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
486555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  }
487555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%}
488555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
489555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#define %swig_vector_methods(Type...) %swig_sequence_methods(Type)
490555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#define %swig_vector_methods_val(Type...) %swig_sequence_methods_val(Type);
491555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
492555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%define %traits_type_name(Type...)
493555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%fragment(SWIG_Traits_frag(Type), "header",
494555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot          fragment="StdTraits",fragment="StdVectorTraits") {
495555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  namespace swig {
496555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    template <>  struct traits< Type > {
497555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      typedef pointer_category category;
498555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      static const char* type_name() {
499555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        return #Type;
500555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      }
501555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    };
502555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  }
503555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot }
504555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%enddef
505555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
506555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%include <std/std_vector.i>
507555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
508555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector<double>)
509555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%traits_type_name(std::vector<double>)
510555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap("rtypecheck") std::vector<double>, std::vector<double> const, std::vector<double> const&
511555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    %{ is.numeric($arg) %}
512555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap("rtype") std::vector<double> "numeric"
513555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap("scoercein") std::vector<double>, std::vector<double> const, std::vector<double> const& "";
514555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
515555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector<float>)
516555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%traits_type_name(std::vector<float>)
517555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap("rtypecheck") std::vector<float>, std::vector<float> const, std::vector<float> const&
518555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   %{ is.numeric($arg) %}
519555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap("rtype") std::vector<float> "numeric"
520555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap("scoercein") std::vector<double>, std::vector<float> const, std::vector<float> const& "";
521555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
522555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector<bool>);
523555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%traits_type_name(std::vector<bool>);
524555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap("rtypecheck") std::vector<bool> , std::vector<bool> const, std::vector<bool> const&
525555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   %{ is.logical($arg) %}
526555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap("rtype") std::vector<bool> "logical"
527555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap("scoercein") std::vector<bool> , std::vector<bool> const, std::vector<bool> const& "$input = as.logical($input);";
528555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
529555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector<int>);
530555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%traits_type_name(std::vector<int>);
531555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap("rtypecheck") std::vector<int> , std::vector<int> const, std::vector<int> const&
532555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   %{ is.integer($arg) || is.numeric($arg) %}
533555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap("rtype") std::vector<int> "integer"
534555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap("scoercein") std::vector<int> , std::vector<int> const, std::vector<int> const& "$input = as.integer($input);";
535555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
536555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector<unsigned int>);
537555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%traits_type_name(std::vector<unsigned int>);
538555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap("rtypecheck") std::vector<unsigned int>, std::vector<unsigned int> const, std::vector<unsigned int> const&
539555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%{ is.integer($arg) || is.numeric($arg) %}
540555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap("rtype") std::vector<unsigned int> "integer"
541555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap("scoercein") std::vector<unsigned int>, std::vector<unsigned int> const, std::vector<unsigned int> const& "$input = as.integer($input);";
542555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
543555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector<std::vector<unsigned int> >);
544555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%traits_type_name(std::vector< std::vector<unsigned int> >);
545555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap("rtypecheck") std::vector<std::vector<unsigned int> >, std::vector<std::vector<unsigned int> > const, std::vector<std::vector<unsigned int> >const&
546555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   %{ is.list($arg) && all(sapply($arg , is.integer) || sapply($arg, is.numeric)) %}
547555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap("rtype") std::vector<std::vector<unsigned int> > "list"
548555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap("scoercein") std::vector< std::vector<unsigned int> >, std::vector<std::vector<unsigned int> > const, std::vector<std::vector<unsigned int> >const& "$input = lapply($input, as.integer);";
549555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
550555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector<std::vector<int> >);
551555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%traits_type_name(std::vector< std::vector<int> >);
552555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap("rtypecheck") std::vector<std::vector<int> >, std::vector<std::vector<int> > const, std::vector<std::vector<int> >const&
553555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   %{ is.list($arg) && all(sapply($arg , is.integer) || sapply($arg, is.numeric)) %}
554555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap("rtype") std::vector<std::vector<int> > "list"
555555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap("scoercein") std::vector< std::vector<int> >, std::vector<std::vector<int> > const, std::vector<std::vector<int> >const& "$input = lapply($input, as.integer);";
556555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
557555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector<std::vector<float> >);
558555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%traits_type_name(std::vector< std::vector<float> >);
559555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap("rtypecheck") std::vector<std::vector<float> >, std::vector<std::vector<float> > const, std::vector<std::vector<float> >const&
560555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   %{ is.list($arg) && all(sapply($arg , is.integer) || sapply($arg, is.numeric)) %}
561555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap("rtype") std::vector<std::vector<float> > "list"
562555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap("scoercein") std::vector< std::vector<float> >, std::vector<std::vector<float> > const, std::vector<std::vector<float> >const& "$input = lapply($input, as.numeric);";
563555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
564555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector<std::vector<double> >);
565555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%traits_type_name(std::vector< std::vector<double> >);
566555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap("rtypecheck") std::vector<std::vector<double> >, std::vector<std::vector<double> > const, std::vector<std::vector<double> >const&
567555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   %{ is.list($arg) && all(sapply($arg , is.integer) || sapply($arg, is.numeric)) %}
568555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap("rtype") std::vector<std::vector<double> > "list"
569555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap("scoercein") std::vector< std::vector<double> >, std::vector<std::vector<double> > const, std::vector<std::vector<double> >const&
570555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot "$input = lapply($input, as.numeric);";
571555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
572555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector<std::vector<bool> >);
573555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%traits_type_name(std::vector< std::vector<bool> >);
574555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap("rtypecheck") std::vector<std::vector<bool> >, std::vector<std::vector<bool> > const, std::vector<std::vector<bool> >const&
575555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   %{ is.list($arg) && all(sapply($arg , is.integer) || sapply($arg, is.numeric)) %}
576555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap("rtype") std::vector<std::vector<bool> > "list"
577555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap("scoercein") std::vector< std::vector<bool> >, std::vector<std::vector<bool> > const, std::vector<std::vector<bool> >const& "$input = lapply($input, as.logical);";
578555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
579555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// we don't want these to be given R classes as they
580555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// have already been turned into R vectors.
581555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot%typemap(scoerceout) std::vector<double>,
582555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   std::vector<double> *,
583555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   std::vector<double> &,
584555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   std::vector<bool>,
585555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   std::vector<bool> *,
586555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   std::vector<bool> &,
587555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   std::vector<unsigned int>,
588555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   std::vector<unsigned int> *,
589555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   std::vector<unsigned int> &,
590555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // vectors of vectors
591555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   std::vector< std::vector<unsigned int> >,
592555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   std::vector< std::vector<unsigned int> >*,
593555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   std::vector< std::vector<unsigned int> >&,
594555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   std::vector< std::vector<int> >,
595555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   std::vector< std::vector<int> >*,
596555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   std::vector< std::vector<int> >&,
597555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   std::vector< std::vector<float> >,
598555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   std::vector< std::vector<float> >*,
599555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   std::vector< std::vector<float> >&,
600555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   std::vector< std::vector<double> >,
601555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   std::vector< std::vector<double> >*,
602555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   std::vector< std::vector<double> >&,
603555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   std::vector< std::vector<bool> >,
604555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   std::vector< std::vector<bool> >*,
605555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   std::vector< std::vector<bool> >&
606555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
607555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
608555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot %{    %}
609