[Rcpp-commits] r282 - in pkg: inst src src/Rcpp
noreply at r-forge.r-project.org
noreply at r-forge.r-project.org
Tue Jan 5 17:50:36 CET 2010
Author: romain
Date: 2010-01-05 17:50:36 +0100 (Tue, 05 Jan 2010)
New Revision: 282
Added:
pkg/src/RawVector.cpp
pkg/src/Rcpp/RawVector.h
Modified:
pkg/inst/ChangeLog
pkg/src/IntegerVector.cpp
pkg/src/NumericVector.cpp
pkg/src/Rcpp.h
pkg/src/Rcpp/IntegerVector.h
pkg/src/Rcpp/NumericVector.h
Log:
+ Rcpp::RawVector
Modified: pkg/inst/ChangeLog
===================================================================
--- pkg/inst/ChangeLog 2010-01-05 15:24:52 UTC (rev 281)
+++ pkg/inst/ChangeLog 2010-01-05 16:50:36 UTC (rev 282)
@@ -9,12 +9,17 @@
they can be used in STL algorithms
* src/IntegerVector.cpp : implementation
* inst/unitTests/runit.IntegerVector.R: unit tests
-
+
* src/Rcpp/NumericVector.h : same as above, but for numeric
vectors (REALSXP)
* src/NumericVector.cpp : implementation
* inst/unitTests/runit.NumericVector.R: unit tests
-
+
+ * src/Rcpp/RawVector.h : same as above, but for numeric
+ vectors (RAWSXP)
+ * src/RawVector.cpp : implementation
+ * inst/unitTests/runit.RawVector.R: unit tests
+
* src/RcppCommon.h: improve the conditional compiling logic
with macros HAS_VARIADIC_TEMPLATES and HAS_INIT_LISTS instead
of CXX0X. This ensures the package can be compiled with
Modified: pkg/src/IntegerVector.cpp
===================================================================
--- pkg/src/IntegerVector.cpp 2010-01-05 15:24:52 UTC (rev 281)
+++ pkg/src/IntegerVector.cpp 2010-01-05 16:50:36 UTC (rev 282)
@@ -22,14 +22,22 @@
#include <RcppCommon.h>
#include <Rcpp/RObject.h>
#include <Rcpp/IntegerVector.h>
+#include <algorithm>
namespace Rcpp{
IntegerVector::IntegerVector(SEXP x) throw(not_compatible) : RObject() {
- if( TYPEOF( x ) == INTSXP ){
- setSEXP( x ) ;
- } else {
- throw not_compatible( "cannot convert to intrger vector" ) ;
+ switch( TYPEOF( x ) ){
+ case INTSXP:
+ setSEXP( x ) ;
+ break ;
+ case REALSXP:
+ case LGLSXP:
+ case RAWSXP:
+ setSEXP( Rf_coerceVector( x, INTSXP) ) ;
+ break ;
+ default:
+ throw not_compatible( "cannot convert to intrger vector" ) ;
}
}
Modified: pkg/src/NumericVector.cpp
===================================================================
--- pkg/src/NumericVector.cpp 2010-01-05 15:24:52 UTC (rev 281)
+++ pkg/src/NumericVector.cpp 2010-01-05 16:50:36 UTC (rev 282)
@@ -26,10 +26,17 @@
namespace Rcpp{
NumericVector::NumericVector(SEXP x) throw(not_compatible) : RObject() {
- if( TYPEOF( x ) == REALSXP ){
- setSEXP( x ) ;
- } else {
- throw not_compatible( "cannot convert to intrger vector" ) ;
+ switch( TYPEOF( x ) ){
+ case REALSXP:
+ setSEXP( x ) ;
+ break ;
+ case INTSXP:
+ case LGLSXP:
+ case RAWSXP:
+ setSEXP( Rf_coerceVector( x, REALSXP) ) ;
+ break ;
+ default:
+ throw not_compatible( "cannot convert to numeric vector" ) ;
}
}
Added: pkg/src/RawVector.cpp
===================================================================
--- pkg/src/RawVector.cpp (rev 0)
+++ pkg/src/RawVector.cpp 2010-01-05 16:50:36 UTC (rev 282)
@@ -0,0 +1,75 @@
+// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; tab-width: 8 -*-
+//
+// RawVector.h: Rcpp R/C++ interface class library -- integer vectors
+//
+// Copyright (C) 2010 Dirk Eddelbuettel and Romain Francois
+//
+// This file is part of Rcpp.
+//
+// Rcpp is free software: you can redistribute it and/or modify it
+// under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 2 of the License, or
+// (at your option) any later version.
+//
+// Rcpp is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Rcpp. If not, see <http://www.gnu.org/licenses/>.
+
+#include <RcppCommon.h>
+#include <Rcpp/RObject.h>
+#include <Rcpp/RawVector.h>
+#include <algorithm>
+
+namespace Rcpp{
+
+ RawVector::RawVector(SEXP x) throw(not_compatible) : RObject() {
+ switch( TYPEOF( x ) ){
+ case RAWSXP:
+ setSEXP( x ) ;
+ break ;
+ case INTSXP:
+ case REALSXP:
+ case LGLSXP:
+ setSEXP( Rf_coerceVector( x, RAWSXP) ) ;
+ break ;
+ default:
+ throw not_compatible( "cannot convert to intrger vector" ) ;
+ }
+ }
+
+ RawVector::RawVector(int size) : RObject() {
+ setSEXP( Rf_allocVector(RAWSXP, size) ) ;
+ }
+
+#ifdef HAS_INIT_LISTS
+ RawVector::RawVector( std::initializer_list<int> list ) {
+ SEXP x = PROTECT( Rf_allocVector( RAWSXP, list.size() ) ) ;
+ std::copy( list.begin(), list.end(), RAW(x) );
+ setSEXP(x) ;
+ UNPROTECT( 1 ); /* x */
+ }
+ RawVector::RawVector( std::initializer_list<Rbyte> list ) {
+ /* FIXME: we need to take care of coercion, so
+ transform is probably better */
+ SEXP x = PROTECT( Rf_allocVector( RAWSXP, list.size() ) ) ;
+ std::copy( list.begin(), list.end(), RAW(x) );
+ setSEXP(x) ;
+ UNPROTECT( 1 ); /* x */
+ }
+#endif
+
+Rbyte& RawVector::operator[]( int i ) const {
+ return RAW(m_sexp)[i] ;
+}
+Rbyte* RawVector::begin() const {
+ return RAW(m_sexp) ;
+}
+Rbyte* RawVector::end() const {
+ return RAW(m_sexp) + LENGTH(m_sexp);
+}
+
+} // namespace
Modified: pkg/src/Rcpp/IntegerVector.h
===================================================================
--- pkg/src/Rcpp/IntegerVector.h 2010-01-05 15:24:52 UTC (rev 281)
+++ pkg/src/Rcpp/IntegerVector.h 2010-01-05 16:50:36 UTC (rev 282)
@@ -56,6 +56,9 @@
int& operator[]( int i ) const ;
int* begin() const ;
int* end() const ;
+
+ typedef int* iterator ;
+
} ;
} // namespace
Modified: pkg/src/Rcpp/NumericVector.h
===================================================================
--- pkg/src/Rcpp/NumericVector.h 2010-01-05 15:24:52 UTC (rev 281)
+++ pkg/src/Rcpp/NumericVector.h 2010-01-05 16:50:36 UTC (rev 282)
@@ -57,6 +57,8 @@
double* begin() const ;
double* end() const ;
+ typedef double* iterator ;
+
} ;
} // namespace
Added: pkg/src/Rcpp/RawVector.h
===================================================================
--- pkg/src/Rcpp/RawVector.h (rev 0)
+++ pkg/src/Rcpp/RawVector.h 2010-01-05 16:50:36 UTC (rev 282)
@@ -0,0 +1,66 @@
+// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; tab-width: 8 -*-
+//
+// RawVector.h: Rcpp R/C++ interface class library -- raw vectors
+//
+// Copyright (C) 2010 Dirk Eddelbuettel and Romain Francois
+//
+// This file is part of Rcpp.
+//
+// Rcpp is free software: you can redistribute it and/or modify it
+// under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 2 of the License, or
+// (at your option) any later version.
+//
+// Rcpp is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Rcpp. If not, see <http://www.gnu.org/licenses/>.
+
+#ifndef Rcpp_RawVector_h
+#define Rcpp_RawVector_h
+
+#include <RcppCommon.h>
+#include <Rcpp/RObject.h>
+
+#ifdef HAS_INIT_LISTS
+#include <initializer_list>
+#include <algorithm>
+#endif
+
+namespace Rcpp{
+
+class RawVector : public RObject {
+public:
+
+ RawVector(SEXP x) throw(not_compatible);
+ RawVector( int size) ;
+
+#ifdef HAS_INIT_LISTS
+ RawVector( std::initializer_list<Rbyte> list ) ;
+ RawVector( std::initializer_list<int> list ) ;
+#endif
+
+ /**
+ * the length of the vector, uses Rf_length
+ */
+ inline int length() const { return Rf_length( m_sexp ) ; }
+
+ /**
+ * alias of length
+ */
+ inline int size() const { return Rf_length( m_sexp ) ; }
+
+ Rbyte& operator[]( int i ) const ;
+ Rbyte* begin() const ;
+ Rbyte* end() const ;
+
+ typedef Rbyte* iterator ;
+
+} ;
+
+} // namespace
+
+#endif
Modified: pkg/src/Rcpp.h
===================================================================
--- pkg/src/Rcpp.h 2010-01-05 15:24:52 UTC (rev 281)
+++ pkg/src/Rcpp.h 2010-01-05 16:50:36 UTC (rev 282)
@@ -58,5 +58,6 @@
#include <Rcpp/Function.h>
#include <Rcpp/IntegerVector.h>
#include <Rcpp/NumericVector.h>
+#include <Rcpp/RawVector.h>
#endif
More information about the Rcpp-commits
mailing list