00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <RcppVector.h>
00024
00025 template <typename T>
00026 RcppVector<T>::RcppVector(SEXP vec) {
00027 int i;
00028
00029
00030
00031
00032
00033
00034
00035 if (!Rf_isNumeric(vec) || Rf_isMatrix(vec) || Rf_isLogical(vec))
00036 throw std::range_error("RcppVector: invalid numeric vector in constructor");
00037 len = Rf_length(vec);
00038 v = (T *) R_alloc(len, sizeof(T));
00039 if (Rf_isInteger(vec)) {
00040 for (i = 0; i < len; i++)
00041 v[i] = (T)(INTEGER(vec)[i]);
00042 }
00043 else if (Rf_isReal(vec)) {
00044 for (i = 0; i < len; i++)
00045 v[i] = (T)(REAL(vec)[i]);
00046 }
00047 }
00048
00049 template <typename T>
00050 RcppVector<T>::RcppVector(int _len) {
00051 len = _len;
00052 v = (T *) R_alloc(len, sizeof(T));
00053 for (int i = 0; i < len; i++)
00054 v[i] = 0;
00055 }
00056
00057 template <typename T>
00058 int RcppVector<T>::size() const {
00059 return len;
00060 }
00061
00062 template <typename T>
00063 inline T& RcppVector<T>::operator()(int i) const {
00064 if (i < 0 || i >= len) {
00065 std::ostringstream oss;
00066 oss << "RcppVector: subscript out of range: " << i;
00067 throw std::range_error(oss.str());
00068 }
00069 return v[i];
00070 }
00071
00072 template <typename T>
00073 T *RcppVector<T>::cVector() const {
00074 T* tmp = (T *)R_alloc(len, sizeof(T));
00075 for (int i = 0; i < len; i++)
00076 tmp[i] = v[i];
00077 return tmp;
00078 }
00079
00080 template <typename T>
00081 std::vector<T> RcppVector<T>::stlVector() const {
00082 std::vector<T> tmp(len);
00083 for (int i = 0; i < len; i++)
00084 tmp[i] = v[i];
00085 return tmp;
00086 }
00087
00088
00089 template class RcppVector<int>;
00090 template class RcppVector<double>;