1 // -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*- 2 // 3 // vector_from_string.h: Rcpp R/C++ interface class library -- 4 // 5 // Copyright (C) 2010 - 2013 Dirk Eddelbuettel and Romain Francois 6 // 7 // This file is part of Rcpp. 8 // 9 // Rcpp is free software: you can redistribute it and/or modify it 10 // under the terms of the GNU General Public License as published by 11 // the Free Software Foundation, either version 2 of the License, or 12 // (at your option) any later version. 13 // 14 // Rcpp is distributed in the hope that it will be useful, but 15 // WITHOUT ANY WARRANTY; without even the implied warranty of 16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 // GNU General Public License for more details. 18 // 19 // You should have received a copy of the GNU General Public License 20 // along with Rcpp. If not, see <http://www.gnu.org/licenses/>. 21 22 #ifndef Rcpp__vector__forward_vector_from_string_h 23 #define Rcpp__vector__forward_vector_from_string_h 24 25 namespace Rcpp{ 26 namespace internal{ 27 28 template <int RTYPE> vector_from_string(const std::string & st)29 inline SEXP vector_from_string( const std::string& st ) { 30 Shield<SEXP> str(Rf_mkString(st.c_str())); 31 return r_cast<RTYPE>(str) ; 32 } 33 34 template <int RTYPE> vector_from_string_expr(const std::string & code)35 SEXP vector_from_string_expr( const std::string& code) { 36 ParseStatus status; 37 Shield<SEXP> expr( Rf_mkString( code.c_str() ) ) ; 38 Shield<SEXP> res( R_ParseVector(expr, -1, &status, R_NilValue) ); 39 switch( status ){ 40 case PARSE_OK: 41 return(res) ; 42 break; 43 default: 44 throw parse_error() ; 45 } 46 return R_NilValue ; /* -Wall */ 47 } 48 49 template <> 50 inline SEXP vector_from_string<EXPRSXP>( const std::string& st ) { 51 return vector_from_string_expr<EXPRSXP>( st ) ; 52 } 53 54 } 55 } 56 57 #endif 58