[Rcpp-devel] [Rcpp-commits] r286 - in pkg: inst src
noreply at r-forge.r-project.org
noreply at r-forge.r-project.org
Wed Jan 6 11:39:29 CET 2010
Author: romain
Date: 2010-01-06 11:39:22 +0100 (Wed, 06 Jan 2010)
New Revision: 286
Modified:
pkg/inst/ChangeLog
pkg/src/RObject.cpp
Log:
less code duplication
Modified: pkg/inst/ChangeLog
===================================================================
--- pkg/inst/ChangeLog 2010-01-06 08:17:09 UTC (rev 285)
+++ pkg/inst/ChangeLog 2010-01-06 10:39:22 UTC (rev 286)
@@ -1,10 +1,13 @@
-2010-01-05 Romain Francois <francoisromain at free.fr>
+2010-01-06 Romain Francois <francoisromain at free.fr>
* src/Rcpp/wrap.h : wrap can now use initializer lists (available
on on GCC >= 4.4).
* src/wrap.cpp: implementation
* int/unitTests/runit.wrap.R: unit tests
+ * src/RObject.cpp : make methods RObject::asFoo
+ calling Rcpp::as<Foo> to avoid code duplication
+
2010-01-05 Romain Francois <francoisromain at free.fr>
* src/Rcpp/GenericVector.h : new class Rcpp::GenericVector
Modified: pkg/src/RObject.cpp
===================================================================
--- pkg/src/RObject.cpp 2010-01-06 08:17:09 UTC (rev 285)
+++ pkg/src/RObject.cpp 2010-01-06 10:39:22 UTC (rev 286)
@@ -23,6 +23,7 @@
#include <Rcpp/Environment.h>
#include <Rcpp/Symbol.h>
#include <algorithm>
+#include <Rcpp/as.h>
namespace Rcpp {
@@ -63,194 +64,17 @@
logTxt("~RObject");
}
-double RObject::asDouble() const {
- if (Rf_length(m_sexp) != 1) {
- throw std::range_error("RObject::asDouble expects single value");
- }
- switch( TYPEOF(m_sexp) ){
- case LGLSXP:
- return LOGICAL(m_sexp)[0] ? 1.0 : 0.0 ;
- case REALSXP:
- return REAL(m_sexp)[0] ;
- case INTSXP:
- return (double)INTEGER(m_sexp)[0];
- case RAWSXP:
- return (double)RAW(m_sexp)[0];
- default:
- throw std::range_error("RObject::asDouble invalid type");
- }
- return 0.0 ; // never reached
-}
+double RObject::asDouble() const { return as<double>( m_sexp ) ; }
+int RObject::asInt() const { return as<int>( m_sexp ) ; }
+Rbyte RObject::asRaw() const { return as<Rbyte>( m_sexp ) ; }
+bool RObject::asBool() const { return as<bool>(m_sexp) ; }
+std::string RObject::asStdString() const { return as< std::string >( m_sexp ) ; }
+std::vector<bool> RObject::asStdVectorBool() const { return as< std::vector<bool> >( m_sexp ) ; }
+std::vector<int> RObject::asStdVectorInt() const { return as< std::vector<int> >( m_sexp ) ; }
+std::vector<Rbyte> RObject::asStdVectorRaw() const { return as< std::vector<Rbyte> >( m_sexp ) ; }
+std::vector<double> RObject::asStdVectorDouble() const { return as< std::vector<double> >( m_sexp ) ; }
+std::vector<std::string> RObject::asStdVectorString() const { return as< std::vector<std::string> >( m_sexp ) ; }
-int RObject::asInt() const {
- if (Rf_length(m_sexp) != 1) {
- throw std::range_error("RObject::asInt expects single value");
- }
- switch( TYPEOF(m_sexp)){
- case LGLSXP:
- return LOGICAL(m_sexp)[0] ? 1 : 0 ;
- case REALSXP:
- return (int)REAL(m_sexp)[0] ; // some of this might be lost
- case INTSXP:
- return INTEGER(m_sexp)[0];
- case RAWSXP:
- return (int)RAW(m_sexp)[0];
- default:
- throw std::range_error("RObject::asInt invalid type");
- }
- return 0; // never reached
-}
-
-Rbyte RObject::asRaw() const {
- if (Rf_length(m_sexp) != 1) {
- throw std::range_error("RObject::asRaw expects single value");
- }
- switch( TYPEOF(m_sexp) ){
- case LGLSXP:
- return LOGICAL(m_sexp)[0] ? (Rbyte)1 : (Rbyte)0 ;
- case REALSXP:
- return (Rbyte)REAL(m_sexp)[0] ;
- case INTSXP:
- return (Rbyte)INTEGER(m_sexp)[0] ;
- case RAWSXP:
- return RAW(m_sexp)[0] ;
- default:
- throw std::range_error("RObject::asRaw expects raw, double or int");
- }
- return (Rbyte)0; // never reached
-}
-
-bool RObject::asBool() const {
- if (Rf_length(m_sexp) != 1) {
- throw std::range_error("RObject::asRaw expects single value");
- }
- switch( TYPEOF(m_sexp) ){
- case LGLSXP:
- return LOGICAL(m_sexp)[0] ? true : false ;
- case REALSXP:
- return (bool)REAL(m_sexp)[0] ;
- case INTSXP:
- return (bool)INTEGER(m_sexp)[0] ;
- case RAWSXP:
- return (bool)RAW(m_sexp)[0] ;
- default:
- throw std::range_error("RObject::asRaw expects raw, double or int");
- }
- return false; // never reached
-}
-
-std::string RObject::asStdString() const {
- if (Rf_length(m_sexp) != 1) {
- throw std::range_error("RObject::asStdString expects single value");
- }
- if (!Rf_isString(m_sexp)) {
- throw std::range_error("RObject::asStdString expects string");
- }
- return std::string(CHAR(STRING_ELT(m_sexp,0)));
-}
-
-std::vector<bool> RObject::asStdVectorBool() const {
- int n = Rf_length(m_sexp);
- std::vector<bool> v(n);
- switch( TYPEOF(m_sexp) ){
- case LGLSXP:
- v.assign( LOGICAL(m_sexp), LOGICAL(m_sexp)+n ) ;
- break ;
- case INTSXP:
- v.assign( INTEGER(m_sexp), INTEGER(m_sexp)+n ) ;
- break;
- case REALSXP:
- v.assign( REAL(m_sexp), REAL(m_sexp)+n ) ;
- break;
- case RAWSXP:
- v.assign( RAW(m_sexp), RAW(m_sexp)+n ) ;
- break;
- default:
- throw std::range_error( "RObject::asStdVectorBool(): invalid R type" ) ;
- }
- return v;
-}
-
-
-std::vector<int> RObject::asStdVectorInt() const {
- int n = Rf_length(m_sexp);
- std::vector<int> v(n);
- switch( TYPEOF(m_sexp) ){
- case LGLSXP:
- v.assign( LOGICAL(m_sexp), LOGICAL(m_sexp)+n ) ;
- break;
- case INTSXP:
- v.assign( INTEGER(m_sexp), INTEGER(m_sexp)+n ) ;
- break;
- case REALSXP:
- v.assign( REAL(m_sexp), REAL(m_sexp)+n ) ;
- break;
- case RAWSXP:
- v.assign( RAW(m_sexp), RAW(m_sexp)+n ) ;
- break;
- default:
- throw std::range_error( "RObject::asStdVectorInt(): invalid R type" ) ;
- }
- return v;
-}
-
-std::vector<Rbyte> RObject::asStdVectorRaw() const {
- int n = Rf_length(m_sexp);
- std::vector<Rbyte> v(n);
- switch( TYPEOF(m_sexp) ){
- case LGLSXP:
- v.assign( LOGICAL(m_sexp), LOGICAL(m_sexp)+n ) ;
- break ;
- case RAWSXP:
- v.assign( RAW(m_sexp), RAW(m_sexp)+n ) ;
- break ;
- case REALSXP:
- v.assign( REAL(m_sexp), REAL(m_sexp)+n) ;
- break;
- case INTSXP:
- v.assign( INTEGER(m_sexp), INTEGER(m_sexp)+n) ;
- break;
- default:
- throw std::range_error("RObject::asStdVectorRaw expects raw, double or int");
- }
- return v;
-}
-
-std::vector<double> RObject::asStdVectorDouble() const {
- int n = Rf_length(m_sexp);
- std::vector<double> v(n);
- switch( TYPEOF(m_sexp) ){
- case LGLSXP:
- v.assign( LOGICAL(m_sexp), LOGICAL(m_sexp)+n ) ;
- break ;
- case RAWSXP:
- v.assign( RAW(m_sexp), RAW(m_sexp)+n ) ;
- break ;
- case REALSXP:
- v.assign( REAL(m_sexp), REAL(m_sexp)+n) ;
- break;
- case INTSXP:
- v.assign( INTEGER(m_sexp), INTEGER(m_sexp)+n) ;
- break;
- default:
- throw std::range_error("RObject::asStdVectorDouble expects raw, double or int");
- }
- return v;
-}
-
-
-std::vector<std::string> RObject::asStdVectorString() const {
- int n = Rf_length(m_sexp);
- std::vector<std::string> v(n);
- if (!Rf_isString(m_sexp)) {
- throw std::range_error("RObject::asStdVectorString expects string");
- }
- for (int i = 0; i < n; i++) {
- v[i] = std::string(CHAR(STRING_ELT(m_sexp,i)));
- }
- return v;
-}
-
std::vector<std::string> RObject::attributeNames() const {
/* inspired from do_attributes at attrib.c */
_______________________________________________
Rcpp-commits mailing list
Rcpp-commits at lists.r-forge.r-project.org
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-commits
More information about the Rcpp-devel
mailing list